灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2131回复:0

分枝结构实例

楼主#
更多 发布于:2012-09-10 18:56

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

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

喜欢0 评分0
游客

返回顶部