分枝结构实例
2651 点击·0 回帖
![]() | ![]() | |
![]() | 把下列C语言的语句改写成等价的汇编语言程序段(不考虑运算过程中的溢出)。 If (a+b > 0 ;; c%2 == 0) a = 62; else a = 21; 其中:变量a,b和c都是有符号的整型(int)变量。 解: DATA1SEGMENT … ADW ? BDW ? CDW ? … DATA1ENDS CODE1SEGMENT … MOVAX, A ADDAX, B JLE_ELSE;ADD指令会改变算术标志位 TESTC, 1;C%2==0,也就是:看C的最低位是否为0 JNZ_ELSE MOVA, 62D JMPNEXT _ELSE: MOVA, 21D NEXT:… CODE1ENDS 例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; } 解: DATA1SEGMENT … ADW ? BDW ? TableDW case0. case12, case12, case3 DW case4, case567, case567, case567 MSGDB ’Function 5_6_7$’ … DATA1ENDS CODE1SEGMENT … MOVAX, A MOVBX, AX ANDBX, 7;得到BX的低三位,实现a%8的计算 SHL BX, 1;由于地址表是字类型,其下标要乘2 JMPTable[BX];利用地址表实现多路转移 case0:MOVB, 32D JMPnext case12:ADDAX, 43D MOVB, AX JMPnext case3:SHLAX, 1 MOVB, AX JMPnext case4:DECB JMPnext case567:LEA DX, MSG MOVAH, 9 INT21H JMPnext next:… CODE1ENDS 用地址表实现多路转移的关键在于:转移入口的地址表和转移情况可整数化。如果这二个要求有一个不满足,或很难构造,则无法使用该方法。 | |
![]() | ![]() |