在 y86 程序中出现 ADR 错误,不知道为什么。堆栈似乎设置良好
Getting an ADR error in a y86 program, have no idea why. Stack appears to be set up well
我有来自 CMU 架构实验室的以下 y86-64 程序,它应该对链表的值求和。
# Adam Cooper ac251190
init:
.pos 0x0
irmovq Stack, %rsp # set up stack pointer
irmovq Stack, %rbp # set up base pointer
call Main
halt
# Sample linked list
.align 8
ele1:
.quad 0x00a
.quad ele2
ele2:
.quad 0x0b0
.quad ele3
ele3:
.quad 0xc00
.quad 0
Main:
irmovq ele1, %rax
pushq %rax # Pointer to list pushed to stack
call Sum
ret
Sum:
pushq %rbp # Push %rbp onto the stack
rrmovq %rsp, %rbp
mrmovq 8(%rbp), %rdx # Move ele1 into %rdx
irmovq [=10=], %rax # Set up a base to add eles to
andq %rdx, %rdx # Is this the end of the list?
je End # If it is, jump to the end
irmovq , %rcx # Turn %rcx into a index mover
Loop:
mrmovq (%rdx), %rbx # Move ls into %rbx
addq %rbx, %rax # val += ele
addq %rcx, %rdx # Move to next value in the list
mrmovq (%rdx), %rdx
andq %rdx, %rdx # Are we at the last ele?
jne Loop # If not, go again
End:
popq %rbp # TEAR! DOWN! THE STACK!
ret # Return the original call to Main
.pos 0x400
Stack:
程序在第 0x093
行停止,状态为 "ADR"
,即第
行
Loop:
mrmovq (%rdx), %rbx
现在,文档让我相信 "ADR"
错误意味着程序试图访问高于 0xFFF
的地址,但事实并非如此。堆栈似乎也已正确初始化和设置。我使用了与我编写的其他几个运行良好的程序相同的方法。不太确定这里出了什么问题。
没关系。固定它。将 mrmovq 8(%rbp), %rdx
更改为 mrmovq 16(%rbp), %rdx
。感谢任何考虑帮助的人
我有来自 CMU 架构实验室的以下 y86-64 程序,它应该对链表的值求和。
# Adam Cooper ac251190
init:
.pos 0x0
irmovq Stack, %rsp # set up stack pointer
irmovq Stack, %rbp # set up base pointer
call Main
halt
# Sample linked list
.align 8
ele1:
.quad 0x00a
.quad ele2
ele2:
.quad 0x0b0
.quad ele3
ele3:
.quad 0xc00
.quad 0
Main:
irmovq ele1, %rax
pushq %rax # Pointer to list pushed to stack
call Sum
ret
Sum:
pushq %rbp # Push %rbp onto the stack
rrmovq %rsp, %rbp
mrmovq 8(%rbp), %rdx # Move ele1 into %rdx
irmovq [=10=], %rax # Set up a base to add eles to
andq %rdx, %rdx # Is this the end of the list?
je End # If it is, jump to the end
irmovq , %rcx # Turn %rcx into a index mover
Loop:
mrmovq (%rdx), %rbx # Move ls into %rbx
addq %rbx, %rax # val += ele
addq %rcx, %rdx # Move to next value in the list
mrmovq (%rdx), %rdx
andq %rdx, %rdx # Are we at the last ele?
jne Loop # If not, go again
End:
popq %rbp # TEAR! DOWN! THE STACK!
ret # Return the original call to Main
.pos 0x400
Stack:
程序在第 0x093
行停止,状态为 "ADR"
,即第
Loop:
mrmovq (%rdx), %rbx
现在,文档让我相信 "ADR"
错误意味着程序试图访问高于 0xFFF
的地址,但事实并非如此。堆栈似乎也已正确初始化和设置。我使用了与我编写的其他几个运行良好的程序相同的方法。不太确定这里出了什么问题。
没关系。固定它。将 mrmovq 8(%rbp), %rdx
更改为 mrmovq 16(%rbp), %rdx
。感谢任何考虑帮助的人