程序集如何知道寄存器包含正数还是负数?
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) …
,编译器将根据数据类型生成指令。例如,有一个比较指令可以产生描述两个数字之间关系的多个位,还有一些分支指令使用这些位来执行分支,例如“如果第一个数字小于第二个数字,则使用带符号的解释进行分支。 ”因此,类型信息被内置到使用数据的汇编指令中。
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) …
,编译器将根据数据类型生成指令。例如,有一个比较指令可以产生描述两个数字之间关系的多个位,还有一些分支指令使用这些位来执行分支,例如“如果第一个数字小于第二个数字,则使用带符号的解释进行分支。 ”因此,类型信息被内置到使用数据的汇编指令中。