我正在研究Jack Crenshaw的“让我们构建一个编译器”。我正在将他的摩托罗拉680x0指令翻译成x86 GAS语法。
在变量分配期间,所需的语义是使用PC相对寻址来创建对变量的引用(至少Crenshaw就是这么做的)。可以通过以下方式以Motorola语法访问该变量:
移动x(PC),D0
其中x是变量名。
下面是任务分配的实际过程(Pascal中):
procedure Assignment;
var Name: char;
begin
Name := GetName;
Match('=');
Expression;
EmitLn('LEA ' + Name + '(PC),A0');
EmitLn('MOVE D0,(A0)')
end;试图在GAS程序集中模仿相同的语法会导致垃圾表达式错误。希望这个问题不是太天真,但我已经找了好几天了,没有一个明显的解决办法。
如何为Linux ( x86 )上的x86处理器(i386)使用GAS语法来实现这一点?我在寻找最简单的方法来完成变量分配。我的汇编程序和编译器分别使用as和ld。
这里有一个链接,链接到我目前所在的位置,在Crenshaw的第三章:
http://compilers.iecc.com/crenshaw/tutor3.txt
发布于 2014-09-05 13:27:13
x86-32没有PC相对寻址,但x86-64有.无论如何,在x86上,您不需要通过寄存器,您可以在MOV中直接使用符号。因此,最简单的编写方法是:MOV source_register, variable_name。如果您确实想更接近地模仿原始代码,可以像这样使用LEA:
LEA variable-name, temp_register
MOV source_register, (temp_register)https://stackoverflow.com/questions/25686859
复制相似问题