当代码在变量上开始发生时,所有变量都自动存储在以 rax 寄存器开头的代码中吗

do all variables are automatically get stored in starting with rax register as code execute as stuff start happening on variables

我有一个简单的 C 程序,我假设它生成简单的汇编代码

这是我的 C 程序

char *a="ba";
char x;

void main(){x=a[0];}

除了

之外,生成的程序集没有什么特别之处

这些行

# test.c:4: void main(){x=a[0];}
    movq    a(%rip), %rax   # a, a.0_1
    movzbl  (%rax), %eax    # *a.0_1, _2
# test.c:4: void main(){x=a[0];}
    movb    %al, x(%rip)    # _2, x

所以我在我的程序汇编的中间,所有突然的四字地址移动恰好是从 rax 到 rip,所以 rip 是指令指针所以我想知道什么是在 rax 内的下一行

    movq    a(%rip), %rax   # a, a.0_1

它是否包含我的 a[0],如果它包含这行是有意义的,因为这一行 test.c:4: void main(){x=a[0];} movb %al, x(%rip) # _2, x 所以这意味着我的 rax 包含 char *a 中的每个元素并且最不重要的类型将是 a [0] 但我不明白为什么 rax 开始持有我的 char *a 我没有分配它然后谁将我的 char *a 分配给 rax 寄存器所以我假设会有一个 [0 ] 和 a[1] 将位于 rax 寄存器的第 8 到第 15 个字节。那这条线呢movzbl (%rax), %eax # *a.0_1, _2 whats doing here

这几乎是带有反汇编指令的完整汇编

    .text
    .globl  a
    .section    .rodata
.LC0:
    .string "ba"
    .section    .data.rel.local,"aw"
    .align 8
    .type   a, @object
    .size   a, 8
a:
    .quad   .LC0
    .globl  x
    .bss
    .type   x, @object
    .size   x, 1
x:
    .zero   1
    .text
    .globl  main
    .type   main, @function
main:
    pushq   %rbp    #
    movq    %rsp, %rbp  #,

# test.c:4: void main(){x=a[0];}
    movq    a(%rip), %rax   # a, a.0_1
    movzbl  (%rax), %eax    # *a.0_1, _2
# test.c:4: void main(){x=a[0];}
    movb    %al, x(%rip)    # _2, x
# test.c:4: void main(){x=a[0];}
    nop 
    popq    %rbp    #
    ret 
 movq    a(%rip), %rax

将字符串地址a的值移动到rax中。

 movzbl  (%rax), %eax

a[0] 移动到 rax 中。 (这读取一个字节。)

 movb    %al, x(%rip)

a[0] 的值移动到 x

这些指令中的第一条和第三条提到了 rip,因为它们使用 rip-relative 寻址,这是访问 64 位代码中静态变量的典型方法。