请不用条件转移指令JG,JGE,JL,JLE等指令实现如下程序片段的功能

杨季文主编的《80X86汇编语言程序设计教程》的第二章有如下习题:

题2.37 请不用条件转移指令JG、JGE、JL和JLE等指令实现如下程序片段的功能:
       CMP AL,BL
       JGE OK
       XCHG AL,BL
   OK: ......
  
Tarzan前辈的做的答案
       PUSH CX            ;CX入栈保存
       XOR CX,CX          ;使CX异或清零
       MOV CH,02H         ;将 CX的高八位设置为2,以便后面的减法做借位用
       MOV CL,AL          ;将AL传送给CX的低八位
       MOV BH,0H          ;清BX的高八位
       SUB CX,BX          ;If CH=2, 说明减法没有向高八位产生借位,AL>=BL; If CH=1, 说明低位产生了借位,AL<BL
       SHR CX,8           ;将CH数据移动到CL,使CX=2 or 1
       LOOP OK            ;LOOP指令会将CX内容再次减一,CX=(2-1)时跳转到OK;CX=(1-1)时执行LOOP后的语句
       XCHG AL,BL 即交换AL与BL的值
OK:
       POP CX             ;恢复CX的内容  
       ......      

我认为该答案是错误的。首先,就语法而言,“SHR CX,8”这句就不符合语法。当移位数大于1时,需要先将移位数放进CL中然后再进行移位操作

其次,题意的要求是模拟JGE指令,JGE是处理有符号数的,它的原理是根据SF 异或 OF后的值来判断两数的大小。以上程序只能判断无符号数,对于减数为负数,或者溢出的情况,会出现错误

而DelphiGuy前辈的程序构造非常巧妙,不采用任何条件转移指令和交换指令,完全模拟出JGE原理和功能:

MOV     AH,BL;将第二个数BL传送至AH
MOV     CH,AL;将第一个数AL传送至CH
MOV     CL,0CH          ;使CL==12
SUB     CH,BL;CH保存两数相减的差
PUSHF;将标志寄存器的数据存入栈中
POP     BX;用BX接收出栈的标志寄存器状态数据
ROR     BX,CL           ;右循环移位12位以后,OF溢出标志正好位于最高位
XOR     CH,BH;XOR指令的特点,0和0得0、0和1得1、1和1得0,即(同为0,异为1)

;将差与BH异或运算,这里只关心CH的最高位(符号SF位),BH的最高位(OF标志)

;得到的结果只可能是00000000B或10000000B

AND     CH,80H ;把得到的结果与10000000B作与运算,AND指令的特点:0和0得1、0和1得0、1和1得1

;本指令执行后有两种结果,00000000B或者10000000B
SHR     CX,CL           ; 将CX中的数据逻辑右移12位,得到的结果只可能是0或者8
ROL     AX,CL ;AL>=BL(AH)时,移0位,即保持不变;

;当AL<BL时,循环左移8位,这样较大的数始终在AL中,较小的数始终在AH中
MOV     BL,AH ;把AH放回BL

附JGE指令原理:


转移条件:sf异或of为0
转移说明:大于等于转移
其他说明:有符号数,两个标志位sf和of
标志寄存器:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值