这种程序的思路是先判断条件是否成立;若成立,转到转移指令指定的位置执行
例:从接口 03F 0H 中取数,若此数 >=90 ,则将 00H 送 03F 7H ,若此数 <90 ,则将 FFH 送接口 03F 3H 。程序如下: |
|
MOV DX , 03F 0H |
|
IN AL , DX |
|
CMP AL , 90 |
|
JNC NEXT1 |
|
MOV AL , 0FFH |
|
JMP NEXT2 |
NEXT1 : |
MOV AL , 00H |
NEXT2 : |
MOV DX , 03F 7H |
|
OUT DX , AL |
|
HLT |
分支程序根据条件是真或假决定执行与否 判断的条件是各种指令,如 CMP 、 TEST 等执行后形成的状态标志 转移指令 Jcc 和 JMP 可以实现分支控制;还可以采用 MASM 6.x 提供的条件控伪指令实现 单分支程序设计 条件成立跳转,否则顺序执行分支语句体;注意选择正确的条件转移指令和转移目标地址 cmp ax,0 jns nonneg ; 分支条件: AX ≥ 0 neg ax ; 条件不满足,求补 nonneg: mov result,ax ; 条件满足 例:计算 AX 的绝对值 双分支程序设计 条件成立跳转执行第 2 个分支语句体,否则顺序执行第 1 个分支语句体。注意第 1 个分支体后一定要有一个 JMP 指令跳到第 2 个分支体后 例 : 显示 BX 最高位 shl bx,1 ;BX 最高位移入 CF jc one ;CF = 1 ,即最高位为 1 ,转移 mov dl,' 0' ;CF = 0 ,即最高位为 0 , DL ←' 0 ' jmp two ; 一定要跳过另一个分支体 one: mov dl, ' 1 ' ;DL ←' 1 ' two: mov ah,2 int 21h ; 显示 mov dl, ' 0 ' ;DL ←' 0 ' shl bx,1 ;BX 最高位移入 CF jnc two ;CF = 0 ,最高位为 0 ,转移 mov dl,' 1' ;CF = 1 ,最高位为 1 , DL ←' 1 ' two: mov ah,2 int 21h ; 显示 例 : 显示 BX 最高位 多分支程序设计 多个条件对应各自的分支语句体,哪个条件成立就转入相应分支体执行。多分支可以化解为双分支或单分支结构的组合例如: or ah,ah ; 等效于 cmp ah,0 jz function0 ;ah = 0 ,转向 function0 dec ah ; 等效于 cmp ah,1 jz function1 ;ah = 1 ,转向 function1 dec ah ; 等效于 cmp ah,2 jz function2 ;ah = 2 ,转向 function2 AH=0 fuction0 Y N AH=1 fuction1 Y N AH=2 fuction2 Y N 地址表形成多分支 需要在数据段事先安排一个按顺序排列的转移地址表,输入的数字作为偏移量。因为只有 2 个字节 16 位偏移地址,所以偏移量需要乘 2 关键是要理解间接寻址方式 JMP 指令 .data msg db 'Input number(1~8):',0dh,0ah,'$' msg1 db 'Chapter 1 : ...',0dh,0ah,'$' msg2 db 'Chapter 2 : ...',0dh,0ah,'$‘ ... msg8 db 'Chapter 8 : ... ',0dh,0ah,'$' table dw disp1,disp2,disp3,disp4 dw disp5,disp6,disp7,disp8 ; 取得各个标号的偏移地址 例 : 数据段 start1: mov dx,offset msg ; 提示输入数字 mov ah,9 int 21h mov ah,1 ; 等待按键 int 21h cmp al,'1' ; 数字 < 1 ? jb start1 cmp al,'8' ; 数字 > 8 ? ja start1 and ax,000fh ; 将 ASCII 码转换成数字 dec ax shl ax,1 ; 等效于 add ax,ax mov bx,ax jmp table[bx] ; (段内)间接转移: IP ← [table+bx] start2: mov ah,9 int 21h .exit 0 disp1: mov dx,offset msg1 ; 处理程序 1 jmp start2 .. |