我在使用以下汇编代码时遇到问题。
.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
这就是我的想法,我写的代码正在做,但我可能是错的。
- 创建一个新的堆栈帧,其中包含我可以使用的 10 个(64 位)位置。
- 将立即数 10 加载到
%rax
寄存器中 - 将
%rax
中的值存储到%r10+(%r11)*8
(换句话说-40(%rbp)
)
由于某种原因,该代码在使用 gcc
编译和运行时会产生段错误。但是,当加载 $0
或 $2
的立即值时,段错误就会消失。我试图理解为什么会出现这种情况。
我用来编译汇编代码的命令是:gcc code.s -o code
,我通过简单地执行./code
来运行程序.
最佳答案
指令mov -48(%rbp), %r10
将-48(%rbp)
中存储的值移动到R10中。该值可以是任何值,因为它取自函数堆栈分配的一部分(使用 ENTER 指令分配)并且您从未初始化它。
如果您想将-48(%rbp)
的地址加载到寄存器中,您应该使用LEA指令:
lea -48(%rbp), %r10
您还可以将其折叠到存储 RAX 的指令中:
mov %rax, -48(%rbp, %r11, 8)
关于gcc - 基于 x86-64 汇编的索引寻址和段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36025262/