Nasm-程序如何跟踪哪个寄存器存储了负值或正值

问题描述 投票:1回答:1

很明显有标志。但是当我有一个代码块像:

             ;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, edx4000000050时遇到了一些麻烦。

请记住,否定eax仍设置了标志标志。

并且因为程序集没有像C这样的类型来区分signedunsigned,并且ebx的最高位被设置,所以ebx中存储的值可以是其实际值,也可以是其2的补码。我们不知道。

至少那是我的理解。因此,程序如何知道ebx+4000000000,而不是二进制的2的补码是4000000000的负值。

assembly nasm cpu-registers flags twos-complement
1个回答
4
投票

处理器不知道。程序员有责任跟踪哪些寄存器/内存位置包含带符号的数字,以及哪些包含无符号的数字。

一个32位寄存器可以存储范围为-2147483648 .. 2147483647 范围为0 .. 4294967295的数字。处理器不知道程序员打算使用这两个范围中的哪个。 2的补码算法的优点在于,处理器无需知道即可执行大多数操作。

处理器确实需要知道的一些操作是:除法,相乘,结果是操作数宽度的两倍,以及比较。对于乘法和除法,有符号和无符号有单独的操作码。为了进行比较,比较操作码是相同的,但是用于检查比较结果的条件分支操作码是不同的,具体取决于程序员是否要将操作数视为有符号或无符号。

© www.soinside.com 2019 - 2024. All rights reserved.