汇编x86寄存器有符号或无符号

use*_*597 5 x86 assembly

我知道这是一个非常简单的问题,但我找不到答案.x86汇编中的寄存器(eax,ebx edx等)是否已签名或未签名?如果它们是默认签名的,那么计算机如何知道将寄存器视为无符号的,例如我们将变量声明为unsigned int?谢谢!

usr*_*301 8

CPU不知道也不关心.相反,Flags寄存器中的位是在某些操作上设置的,程序对这些标志的作用取决于源代码告诉它的内容.

例如,

mov eax, 0FFFFFFFFh
test eax, eax
js isNegative
Run Code Online (Sandbox Code Playgroud)

与

mov eax, 0FFFFFFFFh
test eax, eax
jb isNegative
Run Code Online (Sandbox Code Playgroud)

第一个跳转到'IsNegative'因为test在这里设置了Sign Flag.第二个没有,因为test将Carry Flag重置为0,jb只有在跳转时才跳转1.

  • 请注意,对于无符号比较,“x < 0”*始终*为假,因此实际上编写“test same,same”/“jb”是您在现实生活中永远不会做的事情。对于每个可能的 EAX 值(包括零),已知条件均为假(不取)。也许更好的例子是“cmp eax, 10”,用于有符号和无符号“eax < 10”。(那么对于签名条件,您需要使用“jl”,而不是“js”。) (2认同)