2013-10-16 55 views
0

有人能告诉我为什么我可能会收到这些错误。当我尝试运行./yas -为什么y86代码中会出现逗号错误

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

我只是开始学习Y86,但我想我可以帮你的忙:

问题第22行),前两个subl操作失败的原因是因为你只能够执行subl操作在两个寄存器之间(认为它是对第一个寄存器应用的一个二的恭维否定,然后加到第二个,只改变第二个寄存器的值)。 解决方案第22行)使用堆栈存储寄存器的值并加载常量进行减法。不要忘记用流行音乐恢复注册!

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

问题行24)类似的问题与subl需要一个寄存器。但是,你也试图直接改变内存中的值(因为它是被改变的第二个参数)。 解决方案第24行)使用堆栈存储两个寄存器值并加载常量进行相减,并从内存中加载该值。不要忘记恢复与弹出注册!

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操作(强调M和R,而不是R至M在rmmovl操作)。 解决方案行27 & & 38)要使用常量,请使用先前的堆栈技巧。另外,由于-20(%ebp)的内存地址必须是第一个参数,所以请切换顺序。

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

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