这里是一个功能:
void func(char *ptr)
{
*ptr = 42;
}
这是gcc -S function.c的输出(剪切:):>
func: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movq %rdi, -8(%rbp) movq -8(%rbp), %rax movb $42, (%rax) nop popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc
我可以将该功能用作:
func(malloc(1));
或作为:
char local_var; func(&local_var);
问题是处理器如何确定在该指令中应使用哪个段寄存器将有效地址转换为虚拟地址(可能是DS以及SS)
movb $42, (%rax)
我有一个x86_64进程。
[这里是一个函数:void func(char * ptr){* ptr = 42; }这是gcc -S函数的输出(剪切)。c:func:.LFB0:.cfi_startproc pushq%rbp .cfi_def_cfa_offset 16 ....
默认细分为DS;这就是您的示例中处理器使用的方式。