gpt4 book ai didi

assembly - 除法(DIVS)在 Jack Crenshaw 上不起作用让我们构建一个编译器

转载 作者:行者123 更新时间:2023-12-02 19:22:47 26 4
gpt4 key购买 nike

我正在关注 Jack Crenshaw 编写的优秀的 Let's Build a Compiler 教程,该教程位于 http://compilers.iecc.com/crenshaw 。我正在使用 Easy68k http://www.easy68k.com/ 测试生成的 68k 程序集68000 编辑器/汇编器/模拟器。我已经进入第 2 部分 http://compilers.iecc.com/crenshaw/tutor2.txt但除法程序对我来说无法正常工作。

...
{ Recognize and Translate a Divide }
procedure Divide;
begin
Match('/');
Factor;
EmitLn('MOVE (SP)+,D1');
EmitLn('DIVS D1,D0');
end;
...

如果我输入“8/2”作为测试,那么编译器会生成以下代码:

MOVE #8,D0
MOVE D0,-(SP)
MOVE #2,D0
MOVE (SP)+,D1
DIVS D1,D0

在我看来,它实际上是在计算 2/8(即,这是错误的方式),因为之后 D0 中留下的值是 00020000。我可以通过将最后一行重写为 DIVS D0,D1 来解决此问题,但这会留下按照其他例程,结果是 D1 而不是 D0,在我看来,这样一项开创性的工作不太可能是错误的。我在互联网上搜索过,但没有看到其他人遇到过这个问题。那么这是否意味着:1)我做错了——可能2) jack 做错了——不太可能3) Easy68k 模拟器做错了什么 - 不太可能然而我就是看不出我做错了什么。请帮忙。

最佳答案

我想我可能已经破解了它。教程第3条http://compilers.iecc.com/crenshaw/tutor3.txt除法过程的版本略有不同,尽管似乎没有解释,所以可能是一个拼写错误。第三篇文章中的修订版本是

{ Recognize and Translate a Divide }
procedure Divide;
begin
Match('/');
Factor;
EmitLn('MOVE (SP)+,D1');
EmitLn('EXS.L D0');
EmitLn('DIVS D1,D0');
end;

注意添加的行

EmitLn('EXS.L D0');

这似乎是为了交换寄存器 D0 和 D1 的内容。现在,虽然 Easy68k 似乎不喜欢“EXS.L D0”,但在检查 Easy68 文档后,我已将其更改为读取

EmitLn('EXG D0,D1');

现在除法程序可以工作了。我不确定这是否是 Easy68k 特有的,或者为什么文章说 EXS.L,但至少现在它可以工作了。万岁!

关于assembly - 除法(DIVS)在 Jack Crenshaw 上不起作用让我们构建一个编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8882775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com