很明显有标志。但是当我有一个代码块像:
;starts with parry, zero set
mov eax, 100 ; mov does not affect the flags
neg eax ; sets carry, adjust and sign, unsets zero
mov ebx, 4000000000; mov does not affect the flags
mov ecx, eax ; mov does not affect the flags
mov edx, 50 ; mov does not affect the flags
add ebx, edx ; unsets all set flags, value of ebx is 4000000050
我在理解程序如何知道add ebx, edx
是4000000050
时遇到了一些麻烦。
请记住,否定eax
仍设置了标志标志。
并且因为程序集没有像C这样的类型来区分signed
和unsigned
,并且ebx
的最高位被设置,所以ebx
中存储的值可以是其实际值,也可以是其2的补码。我们不知道。
至少那是我的理解。因此,程序如何知道ebx
是+4000000000
,而不是二进制的2的补码是4000000000
的负值。
处理器不知道。程序员有责任跟踪哪些寄存器/内存位置包含带符号的数字,以及哪些包含无符号的数字。
一个32位寄存器可以存储范围为-2147483648 .. 2147483647 或范围为0 .. 4294967295的数字。处理器不知道程序员打算使用这两个范围中的哪个。 2的补码算法的优点在于,处理器无需知道即可执行大多数操作。
处理器确实需要知道的一些操作是:除法,相乘,结果是操作数宽度的两倍,以及比较。对于乘法和除法,有符号和无符号有单独的操作码。为了进行比较,比较操作码是相同的,但是用于检查比较结果的条件分支操作码是不同的,具体取决于程序员是否要将操作数视为有符号或无符号。