首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >气体装配中的变量分配

气体装配中的变量分配
EN

Stack Overflow用户
提问于 2014-09-05 13:19:12
回答 1查看 1K关注 0票数 0

我正在研究Jack Crenshaw的“让我们构建一个编译器”。我正在将他的摩托罗拉680x0指令翻译成x86 GAS语法。

在变量分配期间,所需的语义是使用PC相对寻址来创建对变量的引用(至少Crenshaw就是这么做的)。可以通过以下方式以Motorola语法访问该变量:

移动x(PC),D0

其中x是变量名。

下面是任务分配的实际过程(Pascal中):

代码语言:javascript
运行
复制
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语法来实现这一点?我在寻找最简单的方法来完成变量分配。我的汇编程序和编译器分别使用asld

这里有一个链接,链接到我目前所在的位置,在Crenshaw的第三章:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-05 13:27:13

x86-32没有PC相对寻址,但x86-64有.无论如何,在x86上,您不需要通过寄存器,您可以在MOV中直接使用符号。因此,最简单的编写方法是:MOV source_register, variable_name。如果您确实想更接近地模仿原始代码,可以像这样使用LEA

代码语言:javascript
运行
复制
LEA variable-name, temp_register
MOV source_register, (temp_register)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25686859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档