1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 请不用条件转移指令JG JGE JL JLE等指令实现如下程序片段的功能

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

时间:2020-03-31 12:01:38

相关推荐

请不用条件转移指令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原理和功能:

MOVAH,BL;将第二个数BL传送至AH

MOVCH,AL;将第一个数AL传送至CH

MOVCL,0CH;使CL==12

SUBCH,BL;CH保存两数相减的差

PUSHF;将标志寄存器的数据存入栈中

POPBX;用BX接收出栈的标志寄存器状态数据

RORBX,CL;右循环移位12位以后,OF溢出标志正好位于最高位

XORCH,BH;XOR指令的特点,0和0得0、0和1得1、1和1得0,即(同为0,异为1)

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

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

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

;本指令执行后有两种结果,00000000B或者10000000B

SHRCX,CL; 将CX中的数据逻辑右移12位,得到的结果只可能是0或者8

ROLAX,CL ;AL>=BL(AH)时,移0位,即保持不变;

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

MOVBL,AH ;把AH放回BL

附JGE指令原理:

转移条件:sf异或of为0

转移说明:大于等于转移

其他说明:有符号数,两个标志位sf和of

标志寄存器:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。