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

标签 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))

由于某种原因,该代码在使用 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/

相关文章:

c - 汇编testq和cmovg指令

performance - 为什么 SSE 标量 sqrt(x) 比 rsqrt(x) * x 慢?

linux - 使用 GNU 汇编程序进行系统调用时出现段错误

c - 打印三个内容相同的字符串会得到不同的结果

c++ - GNU C++ 库是否缺少 unordered_map 构造函数?

c - 如何验证 void 指针 (void *) 是否是两种数据类型之一?

assembly - 为什么这个引导加载程序代码不起作用?

assembly - 如何使用 GCC 生成一个最小的 BIOS hello world 引导扇区,使其可以在真实硬件上的 USB 内存棒上运行?

c - 仅左移数字的一部分

c - 结构声明中是否允许额外的分号?