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

请不用条件转移指令JG,JGE,JL,JLE等指令实现如下程序片段的功能杨季文主编的《80X86汇编语言程序设计教程》的第二章有如下习题:题2.37请不用条件转移指令JG、JGE、JL和JLE等指令实现如下程序片段的功能:       CMPAL,BL       JGEOK       XCHGAL,BL   OK:……  Tarzan前辈的做的答案:       PUSHCX

大家好,欢迎来到IT知识分享网。

杨季文主编的《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
标志寄存器:
请不用条件转移指令JG,JGE,JL,JLE等指令实现如下程序片段的功能


免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10533.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信