经典汇编语言教程:6.2.2 分支结构

6.2.2 分支结构

例6.7 把下列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

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

上页:上一课 下页:下一课

经典汇编语言教程·相关目录

第1章 汇编语言的由来,数据类型第2章 CPU资源和存储器
第3章 操作数的寻址方式第4章 标识符和表达式
第5章 微机CPU的指令系统第6章 程序的基本结构
第7章 子程序和库第8章 输入输出和中断
第9章 宏第10章 应用程序设计
第11章 数值运算协处理器第12章 汇编语言和C语言
汇编语言重要附录Windows API函数大全
版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号