我正在研究Jack Crenshaw的“让我们构建一个编译器”。我正在将他的Motorola 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(i386)上使用x86处理器的GAS语法实现此目的?我正在寻找最简单的方法来完成变量赋值。我分别使用as
和ld
作为汇编程序和编译器。
这是我目前所处位置的链接,Crenshaw的第3章:
答案 0 :(得分:3)
x86-32没有PC相关寻址,但x86-64确实如此。
在任何情况下,在x86上,您不需要通过寄存器,您可以直接在MOV
中使用符号。因此,最简单的方法是:MOV source_register, variable_name
。
如果您确实想要更密切地模仿原始代码,可以使用LEA
,如下所示:
LEA variable-name, temp_register
MOV source_register, (temp_register)