汇编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认同)