x86-64基于汇编的索引寻址&段错误

时间:2016-03-16 01:28:19

标签: gcc assembly x86 segmentation-fault x86-64

我遇到以下汇编代码时遇到问题。

.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

这就是我的想法,我写的代码正在做,但我可能错了。

  1. 创建一个新的堆栈帧,其中包含我可能使用的10个(64位)位置。
  2. 将立即值10加载到%rax寄存器
  3. %rax中的值存储到%r10+(%r11)*8(换句话说,-40(%rbp)
  4. 由于某种原因,代码在使用gcc编译和运行时会产生分段错误。但是,当加载$0$2的直接值时,分段错误就会消失。我试图理解为什么会这样。

    我用来编译汇编代码的命令是:gcc code.s -o code我只需执行./code即可运行程序。

1 个答案:

答案 0 :(得分:2)

指令mov -48(%rbp), %r10将存储在-48(%rbp)的值移动到R10。这个值可以是任何东西,因为它取自函数堆栈分配的一部分(用ENTER指令分配),你从未初始化它。

如果要将-48(%rbp)的地址加载到寄存器中,则应使用LEA指令:

lea -48(%rbp), %r10

您也可以将其折叠到存储RAX的说明中:

mov %rax, -48(%rbp, %r11, 8)