Intel汇编语言程序设计(第四版)
[美] Kip R.Irvine 著
温玉杰 张家生 罗云彬 等译
第六章,6.3.3.3有符号比较
原文:
1 mov ax,80h 2 cmp ax,7Fh 3 ja IsAbove 4 jg IsGreater
原文解释:
在上面的例子里,JA指令并不跳转,因为无符号数7Fh比无符号数80h要小;相反JG指令则执行跳转,因为+127大与-128。
---------------------------------------
本来也没太注意看着解释,不过这例子是我想弄明白的。
因为我想知道处理器怎么处理各个标志位,是把操作数当成无符号来处理,还是当成有符号来处理,还是根据SF标志来进行相应的处理呢
先看了下解释,似乎跟代码描述得不一样喔,然后再细看一下代码就觉得不对,AX是32位寄存器,进行处理的只是16位数,怎么操作CF、SF都不会设置。
带着怀疑,自己编译了一下,用OD载入调试。
发现,果然是原书打错了。
自己动手修改了一下
1 mov al,80h 2 cmp al,7Fh 3 ja IsAbove 4 jg IsGreater
按照预料中的结果运行。
现在来解决当初的疑惑
OD载入,执行到cmp al,7Fh时的标志位状态如下:
继续执行,到ja IsAbove时,标志位状态如下:
可以发现,CF、SF、OF标志位置位,ZF标志位复位
很显然,CPU根本不知道7Fh,80h是无符号数还是有符号数,只是根据结果机械地设置各个标志位,而不管你操作数是否有符号。
CF是无符号数操作时才有意义的,OF是有符号数操作时才有意义的,所以,ja,jg等指令可以根据SF来获取相关的操作数。
于是乎,这种机制能友好地为大家服务.