下面是一门汇编语言课的作业题。我们将通过在 gdb 中读取从 C 生成的 X86 代码来创建 Y86 代码。该函数的目的是对链表的元素求和。
就目前的功能而言,它可以工作!当程序终止时,正确的值包含在 %eax 寄存器中。不幸的是,这只是由于黑客攻击而正确的。我halt
在函数末尾添加了一条指令,就在ret
指令之前。如果我取消注释,似乎发生的是当它执行ret
指令时,PC 设置为 0x0。换句话说,它似乎从头开始,当它应该做的就是回到它被调用的地方。它进入一个无限循环。
代码如下。如果您安装了 Y86 模拟器,它是独立的。
.pos 0
init: irmovl Stack, %esp
irmovl Stack, %ebp
jmp Main
Main:
irmovl ele1, %eax
pushl %eax
call sum_list
halt
sum_list:
pushl %ebp
rrmovl %esp, %ebp
irmovl $16, %edx
subl %edx, %esp
irmovl $0, %edx
rmmovl %edx, -4(%ebp)
jmp L2
L3:
mrmovl 8(%ebp), %eax
mrmovl (%eax), %eax
mrmovl -4(%ebp), %edx
addl %eax, %edx
rmmovl %edx, -4(%ebp)
mrmovl 8(%ebp), %eax
mrmovl 4(%eax), %eax
rmmovl %eax, 8(%ebp)
L2:
irmovl $0, %ecx
mrmovl 8(%ebp), %edx
subl %ecx, %edx
jne L3
mrmovl -4(%ebp), %eax
rrmovl %esp, %ebp
popl %ebp
halt #THIS DOESN'T BELONG. COMMENT OUT TO SEE BAD BEHAVIOR.
ret
#linked list
.align 4
ele1:
.long 0x00a
.long ele2
ele2:
.long 0x0b0
.long ele3
ele3:
.long 0xc00
.long 0
.pos 0x300
Stack:
谢谢你的帮助!