Y86 代码 - 不 return 或显示 rax
Y86 Code - doesn't return or show rax
我正在做一个 class 项目,我将采用 C 代码,将其转换为 x86-64 汇编,然后将其更改为 Y86。在此我假设 return 链接列表中元素的总和到 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 ,%rdx
subq %rdx,%rsp
irmovq [=11=],%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 [=11=],%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
应该有 0xfed,但在我的结果中,什么也没有出现。
这是我从中得到的 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;
}
看代码,好像指向节点的指针应该在16(rbp),而不是24(rbp)。 0(rbp) = 保存的 rbp 值,8(rbp) = return 地址,16(rbp) = 节点指针(指向链表)。在保存 rbp 之前,我没有看到额外的 8 个字节被压入堆栈的位置。
程序以暂停指令结束。发生这种情况时(例如使用调试器),您是否能够确定 rax 的内容?
我正在做一个 class 项目,我将采用 C 代码,将其转换为 x86-64 汇编,然后将其更改为 Y86。在此我假设 return 链接列表中元素的总和到 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 ,%rdx
subq %rdx,%rsp
irmovq [=11=],%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 [=11=],%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
应该有 0xfed,但在我的结果中,什么也没有出现。
这是我从中得到的 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;
}
看代码,好像指向节点的指针应该在16(rbp),而不是24(rbp)。 0(rbp) = 保存的 rbp 值,8(rbp) = return 地址,16(rbp) = 节点指针(指向链表)。在保存 rbp 之前,我没有看到额外的 8 个字节被压入堆栈的位置。
程序以暂停指令结束。发生这种情况时(例如使用调试器),您是否能够确定 rax 的内容?