</div>
分支程序的基本思想是根据逻辑判断的结果来形成程序的分支,如图,若A成立,则执行P1;否则执行P2。
分支程序有两种基本结构,如图所示。 它们分别相当于高级语言中的IF_THEN_ELSE语句和CASE语句,适用于要求根据不同条件作不同处理的情况。IF_THEN_ELSE语句可以引出两个分支,CASE语句则可以引出多个分支,不论哪一种形式,它们的共同特点是:运行方向是向前的,在某一种特定条件下,只能执行多个分支中的一个分支。 例1 试编写程序段,实现符号函数。 分析:变量X的符号函数可表示为: START: MOV AX,BUFFER ;(BUFFER)=X OR AX,AX JE ZERO ;X=0,则转ZERO JNS PLUS ;X为正数,则转PLUS MOV BX,0FFFFH ;X为负数,则-1送BX JMP CONT1 ZERO: MOV BX,0 JMP CONT1 PLUS: MOV BX,1 CONT1: …… 例2 利用表实现分支。根据AL中各位被置位情况,控制转移到8个子程序P1~P8之一中去。转移表的结构如表1所示。 分析:对于这种程序关键要找出每种情况的转移地址,从图中可见表地址=表基地址+偏移量, 而偏移量可由AL各位所在位置*2求得。
DATA SEGMENT BASE DW SR0,SR1,SR2,SR3, SR4,SR5,SR6,SR7 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA BEGIN: PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA BX,BASE ;表头送BX IN AL,PORT GETBIT: RCR AL,1 ;右移一位 JC GETAD ;移出位是1? INC BX INC BX ;修改指针 JMP GETBI GETAD: JMP WORD PTR[BX] ;实现散转 CODE ENDS END BEGIN 例3 将内存中某一区域的原数据块传送到另一区域中。 分析:这种程序若源数据块与目的数据块之间地址没有重叠,则可直接用传送或串操作实现;若地址重叠,则要先判断源地址+数据块长度是否小于目的地址,若是,则可按增量方式进行,否则要修改指针指向数据块底部,采用减量方式传送。程序如下: DATA SEGMENT STR DB 1000DUP(?) STR1 EQU STR+7 STR2 EQU STR+25 STRCOUNT EQU 50 DATA ENDS STACK SEGMENT PARA STACK ‘STACK’ STAPN DB 100DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK GOO PROC PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX MOV CX,STRCOUNT MOV SI,STR1 MOV DI,STR2 CLD PUSH SI ADD SI,STRCOUNT-1 CMP SI,DI POP SI JL OK STD ADD SI,STRCOUNT-1 ADD DI,STRCOUNT-1 OK: REP MOVSB RET GOO ENDP CODE ENDS END GOO cseg segment main proc near assume cs:cseg, ds:data start: mov ax,dseg mov ds,ax exit: mov ax,4c00h int 21h main endp cseg ends end start & |