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

很明显有Sign-flag。但是当我有如下代码块时:

             ;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的负值。

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

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

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

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

本文链接:https://www.f2er.com/2876205.html

大家都在问