【发布时间】:2014-09-05 13:19:12
【问题描述】:
我正在研究 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) 上使用 GAS 语法为 x86 处理器完成此任务?我正在寻找完成变量赋值的最简单方法。我的汇编器和编译器分别使用as 和ld。
这是我目前所在位置的链接,Crenshaw 的第 3 章:
【问题讨论】:
-
你需要它来使用PC相对寻址吗?如果没有,似乎
'movl %eax,' + Name会做(没有读过 Crenshaw 的书)。
标签: assembly compiler-construction x86 gnu-assembler