我正在使用ubuntu汇编语言在Dosbox上工作。我的程序只有这一行:
mov al, 150 ;(not -150)
当我使用调试器时,它将FLAG寄存器的值显示为0202,这意味着符号位为ON。 -150也是如此。我很困惑为什么符号位设置为正数?
答案 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超出了这个范围,所以它翻了过来。