我正在做一个类项目,我要使用C代码,在x86-64程序集中将它提交,然后将它更改为Y86。在这种情况下,我应该将链接列表中元素的和返回为rax。但是,当我尝试使用y86编译器时,它不会出现。我做的y86看起来是这样的:
.pos 0
irmovq Stack,%rsp
irmovq Stack,%rbp
jmp Main
Main:
irmovq ele1,%rax
pushq %rax
call sum_list
halt
sum_list:
pushq %rbp
rrmovq %rsp,%rbp
irmovq $24,%rdx
subq %rdx,%rsp
irmovq $0,%rdx
rmmovq %rdx,-8(%rbp)
jmp L2
L3:
mrmovq 24(%rbp),%rax
mrmovq (%rax),%rax
mrmovq -8(%rbp),%rdx
addq %rax,%rdx
rmmovq %rdx,-8(%rbp)
mrmovq 24(%rbp),%rax
mrmovq -8(%rax),%rax
rmmovq %rax,24(%rbp)
L2:
irmovq $0,%rcx
mrmovq 24(%rbp),%rdx
subq %rcx,%rdx
jne L3
mrmovq -8(%rbp),%rax
rrmovq %rbp,%rsp
popq %rbp
ret
#linked-list
.align 8
ele1:
.quad 0x00d
.quad ele2
ele2:
.quad 0x0e0
.quad ele3
ele3:
.quad 0xf00
.quad 0
.pos 0x500
Stack:所以rax应该是0,但在我的结果中,什么也没有出现。
这是我从以下代码获得的C代码:
typedef struct ELE{
long val;
struct ELE *next;
} *list_ptr
long sum_list(list_ptr ls){
long val = 0;
while(ls){
val += ls->val;
ls = ls->next;
}
return val;
}发布于 2016-10-10 00:08:45
看一下代码,指向节点的指针应该是16(rbp),而不是24(rbp)。0( rbp ) =保存的rbp值,8(rbp) =返回地址,16(rbp) =指向节点的指针(指向链接列表)。我看不出在保存rbp之前,额外的8个字节被推到堆栈上的位置。
程序以停止指令结束。当发生这种情况时(例如使用调试器),您能够确定rax的内容吗?
https://stackoverflow.com/questions/39949200
复制相似问题