为什么在Intel 8086汇编语言中,对于正数,符号位是否为ON?

时间:2016-09-03 14:43:21

标签: assembly x86

我正在使用ubuntu汇编语言在Dosbox上工作。我的程序只有这一行:

mov al, 150 ;(not -150)

当我使用调试器时,它将FLAG寄存器的值显示为0202,这意味着符号位为ON。 -150也是如此。我很困惑为什么符号位设置为正数?

2 个答案:

答案 0 :(得分:3)

x86和几乎每个当前使用的CPU都使用2的补码签名算法。

一个字节有8位 这意味着它可以存储256个不同的值(2 8 ) 其中127个为正数,128个为负数,1个为零 要测试字节是否为负,请测试最高有效位(MSB)。如果该位为1则认为是负的,如果它为零则认为是正的。

一个字节中150的编码是1001 0110,因为它被认为是负数 实际上,只有在不允许负数的情况下,才能将值解释为150。如果这样做,那么该字节保持-106。

这称为有符号溢出,如果使用影响标志的指令进行计算,OF标志将检测此情况。

MOV不会影响标志
您的问题中有些不对劲,因为MOV不会影响标记,请查看http://ref.x86asm.net/coder32-abc.html中的modif_f列。 标志显示CPU根据更改这些特定标志的最后一条指令的状态 某些指令仅更改标志的子集 您需要退回代码并查看影响标志的最后一条指令。

答案 1 :(得分:2)

对于正数,符号位

正在发生的是al只保存8位数据,符号位是高位。将登记册中的值解释为已签名或未签名,这些都在您的脑海中。如果将符号位读作符号位,则表示寄存器已签名,产生的范围为127到-128。 150超出了这个范围,所以它翻了过来。