有人可以告诉我为什么我会收到这些错误。当我尝试参加./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指令对吗? 任何帮助将不胜感激。
答案 0 :(得分:1)
我只是开始学习y86,但我想我可以帮你一把:
问题第22行)前两个subl操作失败的原因是因为你只能在两个寄存器之间执行subl操作(把它当作应用于第一个寄存器的二进制补码否定,然后添加到第二个寄存器中,只改变第二个寄存器的值)。 解决方案行22)使用堆栈存储寄存器的值并加载常量以进行减法。不要忘记用弹出恢复寄存器!
pushl %edx
irmovl $24, %edx
subl %edx, %exp
popl %edx
问题第24行)subl需要寄存器的类似问题。但是,您还试图直接更改内存中的值(因为它是第二个更改的参数)。 解决方案行24)使用堆栈存储两个寄存器值并加载常量以进行减法并从内存中加载该值。不要忘记用pops恢复寄存器!
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从内存到寄存器)以及介绍使用堆栈管理临时值的方法。