在尝试用我的编程语言实现可编译为汇编的数组时,我正在努力解决像
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
,但没有成功。
感谢 Jester 提供的解决方案。我需要做的是在推送各个数组元素之前添加
sub $40, %rbp
。感谢那些帮助过的人!