x86-64:有效地址索引为0,意外偏移量

问题描述 投票:0回答:1

在尝试用我的编程语言实现可编译为汇编的数组时,我正在努力解决像

array[0]
这样的表达式。我测试了其他索引,如 1、2 等,它们都有效,但是
array[0]
始终返回 0,无论数组中实际存储什么值。

假设数组有以下元素:

[85, 15, 76, 58, 17]
,那么元素
0
应该是
85
。 这是我的编译器生成的代码,你能看出这有什么问题吗?

.text
.globl main
.type main, @function
main:
  .cfi_startproc
  pushq %rbp
  movq %rsp, %rbp
  call usr_main
  mov %rax, %rdi
  movq $60, %rax
  syscall
  movq %rbp, %rsp
  pop %rbp
  ret
  .cfi_endproc
.size main, .-main
.type usr_main, @function

usr_main:
    .cfi_startproc
    push %rbp
    movq %rsp, %rbp
    # define array
    movq $85, -8(%rbp)
    movq $15, -16(%rbp)
    movq $76, -24(%rbp)
    movq $58, -32(%rbp)
    movq $17, -40(%rbp)
    push $0 # an "offset", based on the size of other defined arrays (there are none)
    # Evaluate computed array expr (index expr)
    # IndexExpr Step 1: Evaluate offset of array
    # find "offset"
    movq (%rsp), %rdx
    # IndexExpr Step 2: Evaluate computed expr (the index)
    movq $0, %rbx # index of 0
    # IndexExpr Step 3: Do some nerd stuff for %rbp offset
    add %rdx, %rbx
    neg %rbx
    # IndexExpr Step 4: Evaluate offset from %rbp and return the expr
    movq -8(%rbp, %rbx, 8), %rax
    movq %rbp, %rsp
    pop %rbp
    ret
    .cfi_endproc
    .size usr_main, .-usr_main

我尝试将有效地址

-8
中的偏移量更改为其他值,但是每次
array[0]
总是返回
0
。 我还尝试在有效地址之前递增
%rbx
并将偏移量设置为
0
,但没有成功。

assembly gcc x86 x86-64
1个回答
0
投票

感谢 Jester 提供的解决方案。我需要做的是在推送各个数组元素之前添加

sub $40, %rbp
。感谢那些帮助过的人!

© www.soinside.com 2019 - 2024. All rights reserved.