程序集如何知道寄存器包含正数还是负数?

How assembly knows if register contains positive or negative number?

int main() {
    int64_t di = -10;
    uint64_t ui = UINT64_MAX - 9;

    return 0;
}

当我反汇编 main 时,它给我这个输出:

Dump of assembler code for function main:
   0x0000000000001119 <+0>:     push   rbp
   0x000000000000111a <+1>:     mov    rbp,rsp
   0x000000000000111d <+4>:     mov    QWORD PTR [rbp-0x10],0xfffffffffffffff6
   0x0000000000001125 <+12>:    mov    QWORD PTR [rbp-0x8],0xfffffffffffffff6
   0x000000000000112d <+20>:    mov    eax,0x0
   0x0000000000001132 <+25>:    pop    rbp
   0x0000000000001133 <+26>:    ret    

它们都是0xfffffffffffffff6我理解有符号变量中的一位是确定它的符号,但它如何知道它是有符号变量还是无符号变量。也许它设置了一些标志 idk

汇编程序不知道存储的是有符号值还是无符号值。如何解释该值取决于编译器将生成哪些机器指令来处理该值。

在这种处理器架构中,通常在当今的处理器中,没有指示寄存器中的位是有符号整数、无符号整数、地址还是其他内容。没有与寄存器关联的类型信息;它只是一个位序列。

当您编写额外的 C 代码以使用数据时,例如测试 if (di < 3) …,编译器将根据数据类型生成指令。例如,有一个比较指令可以产生描述两个数字之间关系的多个位,还有一些分支指令使用这些位来执行分支,例如“如果第一个数字小于第二个数字,则使用带符号的解释进行分支。 ”因此,类型信息被内置到使用数据的汇编指令中。