程序的基本结构 → 分支结构

例6.7 把下列C语言的语句改写成等价的汇编语言程序段(不考虑运算过程中的溢出)。

If (a+b > 0 && c%2 == 0) a = 62;
else a = 21;

其中:变量a,b和c都是有符号的整型(int)变量。

解:
DATA1 SEGMENT
A DW ?
B DW ?
C DW ?
DATA1 ENDS
CODE1 SEGMENT
MOV AX, A
ADD AX, B
JLE _ELSE ;ADD指令会改变算术标志位
TEST C, 1 ;C%2==0,也就是:看C的最低位是否为0
JNZ _ELSE
MOV A, 62D
JMP NEXT
_ELSE:  MOV A, 21D
NEXT:
CODE1 ENDS

例6.8 用地址转移表实现下列C语言的switch语句,其中:变量A和B是有符号的整型(int)变量。

switch (a%8)
{case 0: b = 32;
break;
case 1:
case 2: b = a + 43;
break;
case 3: b = 2*a;
break;
case 4: b--;
break;
case 5:
case 6:
case 7: printf(“Function 5_6_7”);
break;
}
解:
DATA1 SEGMENT
A DW ?
B DW ?
Table DW case0. case12, case12, case3
DW case4, case567, case567, case567
MSG DB 'Function 5_6_7$'
DATA1 ENDS
CODE1 SEGMENT
MOV AX, A
MOV BX, AX
AND BX, 7 ;得到BX的低三位,实现a%8的计算
SHL  BX, 1 ;由于地址表是字类型,其下标要乘2
JMP Table[BX] ;利用地址表实现多路转移
case0: MOV B, 32D
JMP next
case12: ADD AX, 43D
MOV B, AX
JMP next
case3: SHL AX, 1
MOV B, AX
JMP next
case4: DEC B
JMP next
case567: LEA  DX, MSG
MOV AH, 9
INT 21H
JMP next
next:
CODE1 ENDS

用地址表实现多路转移的关键在于:转移入口的地址表和转移情况可整数化。如果这二个要求有一个不满足,或很难构造,则无法使用该方法。