当代码在变量上开始发生时,所有变量都自动存储在以 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 位代码中静态变量的典型方法。
我有一个简单的 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 位代码中静态变量的典型方法。