大家好,欢迎来到IT知识分享网。
杨季文主编的《80X86汇编语言程序设计教程》的第二章有如下习题:
题2.37 请不用条件转移指令JG、JGE、JL和JLE等指令实现如下程序片段的功能:
Tarzan前辈的做的答案:
OK:
我认为该答案是错误的。首先,就语法而言,“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
标志寄存器:
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10533.html