0

有人可以告诉我为什么我可能会收到这些错误。当我尝试在 ./yas 中运行时 -

Error on line 22: Expecting Register ID
Line 22, Byte 0x0032:      subl $24, %esp
Error on line 24: Expecting Register ID
Line 24, Byte 0x0036:      subl $0,8(%ebp)
Error on line 27: Expecting Register ID
Line 27, Byte 0x0043:      mrmovl $0, -20(%ebp)
Error on line 33: Expecting Comma
Line 33, Byte 0x005a:      mrmovl %eax, -8(%ebp)
Error on line 38: Expecting Register ID
Line 38, Byte 0x0077:      mrmovl (%eax), -4(%ebp)
Error on line 43: Expecting Comma
Line 43, Byte 0x0091:      mrmovl %edx, -20(%ebp)

y86 中有一条 subl 指令对吗?任何帮助将不胜感激。

4

1 回答 1

1

我才刚刚开始学习 y86,但我想我可以帮助您:

问题第 22 行)前两个 subl 操作失败的原因是因为您只能在两个寄存器之间执行 subl 操作(将其视为应用于第一个寄存器的二进制补码否定,然后添加到第二个,只会改变第二个寄存器的值)。解决方案第 22 行)使用堆栈存储寄存器的值并加载常量以进行减法。不要忘记用弹出来恢复寄存器!

pushl %edx
irmovl $24, %edx
subl %edx, %exp
popl %edx

问题第 24 行)与需要寄存器的 subl 类似的问题。但是,您还试图直接更改内存中的值(因为它是被更改的第二个参数)。解决方案第 24 行)使用堆栈存储两个寄存器值并加载减法常量并从内存中加载值。不要忘记用 pop 恢复寄存器!

pushl %edx              # edx first in
pushl %ebx              # ebx last in
mrmovl 8(%ebp), %ebx    #move memory integer to ebx
subl %edx, %ebx
rmmovl %ebx, 8(%ebp)    #move register integer to memory
popl %ebx               # ebx first out
popl %edx               # edx last out

问题第 27 && 38 行)从内存到寄存器的整数传输使用 MRmovl 操作(在 rmmovl 操作中强调 M 和 R 而不是 R 到 M)。解决方案第 27 行 && 38 行)要使用常量,请使用前面的堆栈技巧。另外,切换顺序,因为-20(%ebp)的内存地址必须是第一个参数。

问题第 33 行 && 43 行)见上面的问题,除了现在确实使用了一个寄存器(不需要堆栈)。解决方案第 33 行 && 43 行)和之前一样,交换参数以将内存值加载到寄存器 %eax。

希望这可以清除 y86 的一些指令(irmovl 从立即值到寄存器,rmmovl 从寄存器到内存,mrmovl 从内存到寄存器),并介绍使用堆栈管理临时值的方法。

于 2013-10-30T03:59:55.397 回答