2012-01-16 3 views
4

Jack Crenshawによる優れたLet's Buildコンパイラのチュートリアルに続き、http://compilers.iecc.com/crenshawにあります。私は、Easy68k http://www.easy68k.com/ 68000エディタ/アセンブラ/シミュレータを使用して生成された68kアセンブリをテストしています。私はパート2になっているhttp://compilers.iecc.com/crenshaw/tutor2.txtが、分裂手順は私のために適切に動作していません。テストとしてI入力「8/2」は、その後、コンパイラは、次のコードを生成した場合ジャンクションでDivine(DIVS)が動作しないcrenshawのコンパイラを構築しましょう

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

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

実際に2/8(すなわち、それはだ計算されるように私には思えます最後の行をDIVS D0、D1として書き直すことでこれを修正することができますが、これは他のルーチンと同様にD0ではなくD1に結果を残します。そのような精緻な作業は間違っているでしょう。私はインターネットを検索しましたが、他の誰かがこの問題に遭遇しているのを見ることはできません。だからどういう意味: 1)私が間違ってそれを行っている - そう 2)ジャックは間違ってそれをやった - そう 3)Easy68kエミュレータが間違って何かやっている - 私はちょうど私が間違って行っているものを見ることができないしかしそう を。 助けてください。

答えて

7

私はそれをクラックさせたかもしれないと思います。それはおそらく、それはタイプミスであるので、説明をしていないようですが、チュートリアルhttp://compilers.iecc.com/crenshaw/tutor3.txtの第3条第三記事の改訂版が

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

注..です、分割手続きのわずかに異なるバージョンを持っていますレジスタD0とレジスタD1の内容を入れ替えることを意図していると思われるラインの追加

EmitLn('EXS.L D0'); 

今Easy68kながらEasy68のマニュアルをチェックした後、私は

EmitLn('EXG D0,D1'); 

を読み取るために、これを変更した、今分割手順が動作しますが、「EXS.L D0を」好きていないようです。これがEasy68kに固有のものか、EXS.Lと書かれているのは分かりませんが、少なくとも今は動作しています。ハレイ!

関連する問題