GAS程序集中的变量赋值

时间:2014-09-05 13:19:13

标签: assembly compiler-construction x86 gas

我正在研究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语法实现此目的?我正在寻找最简单的方法来完成变量赋值。我分别使用asld作为汇编程序和编译器。

这是我目前所处位置的链接,Crenshaw的第3章:

http://compilers.iecc.com/crenshaw/tutor3.txt

1 个答案:

答案 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)