我遇到以下汇编代码时遇到问题。
.section .rodata
.globl main
main:
enter $(8*10),$0
mov $10, %rax
mov -48(%rbp), %r10
mov $1, %r11
mov %rax, (%r10, %r11, 8)
main_return:
leave
ret
这就是我的想法,我写的代码正在做,但我可能错了。
%rax
寄存器%rax
中的值存储到%r10+(%r11)*8
(换句话说,-40(%rbp)
)由于某种原因,代码在使用gcc
编译和运行时会产生分段错误。但是,当加载$0
或$2
的直接值时,分段错误就会消失。我试图理解为什么会这样。
我用来编译汇编代码的命令是:gcc code.s -o code
我只需执行./code
即可运行程序。
答案 0 :(得分:2)
指令mov -48(%rbp), %r10
将存储在-48(%rbp)
的值移动到R10。这个值可以是任何东西,因为它取自函数堆栈分配的一部分(用ENTER指令分配),你从未初始化它。
如果要将-48(%rbp)
的地址加载到寄存器中,则应使用LEA指令:
lea -48(%rbp), %r10
您也可以将其折叠到存储RAX的说明中:
mov %rax, -48(%rbp, %r11, 8)