Intel汇编语言程序设计(第四版) 勘误

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时的标志位状态如下:

Intel汇编语言程序设计(第四版) 勘误_第1张图片

 继续执行,到ja IsAbove时,标志位状态如下:

Intel汇编语言程序设计(第四版) 勘误_第2张图片

可以发现,CF、SF、OF标志位置位,ZF标志位复位

很显然,CPU根本不知道7Fh,80h是无符号数还是有符号数,只是根据结果机械地设置各个标志位,而不管你操作数是否有符号。

 CF是无符号数操作时才有意义的,OF是有符号数操作时才有意义的,所以,ja,jg等指令可以根据SF来获取相关的操作数。

于是乎,这种机制能友好地为大家服务.

转载于:https://www.cnblogs.com/epluguo/archive/2013/04/21/3033585.html

你可能感兴趣的:(Intel汇编语言程序设计(第四版) 勘误)