1. Top » 
  2. スポンサー広告 » 
  3. コンパイラについてのメモ #10 閑話休題
  4. 大学関係 » 
  5. 計算機科学実験及実習 » 
  6. コンパイラについてのメモ #10 閑話休題

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Genre:

コンパイラについてのメモ #10 閑話休題

実際ブログはかなり後書きで書いているわけで、自分の復習を兼ねている。
というわけで今やっているアセンブリコードの生成部分を軽くメモ。
結局は構文木を読んで出力するんだけどね。

int square(int x){
return x * x;
}

int squaresum(int x, int y){
return square(x) + square(y);
}

int pythagoras(int x, int y, int z){
if( square(x) == squaresum(y,z) )
return 1;
else
return 0;
}


現実的には実用性はないけど、こういう簡単な例しか思い浮かばないのです。
というか初期値代入使えない、配列使えないのでできることが少ない。
これをアセンブリコードで出力させるのらよ。

二乗する部分はこんな感じ。

    
GLOBAL _square

_square
push ebp
mov ebp, esp
sub esp, 4
mov eax, [ebp+8]
mov [ebp-4], eax
mov eax, [ebp+8]
imul eax, [ebp-4]
jmp _square0
_square0
mov esp, ebp
pop ebp
ret



二乗和はこう


GLOBAL _squaresum

_squaresum
push ebp
mov ebp, esp
mov eax, [ebp+12]
push eax
CALL _square
mov [ebp-4], eax
mov eax, [ebp+8]
push eax
CALL _square
add eax, [ebp-4]
jmp _squaresum1
_squaresum1
mov esp, ebp
pop ebp
ret


ピタゴラス判定はこう

    GLOBAL    _pythagoras

_pythagoras
push ebp
mov ebp, esp
mov eax, [ebp+12]
push eax
mov eax, [ebp+16]
push eax
CALL _squaresum
mov [ebp-4], eax
mov eax, [ebp+8]
push eax
CALL _square

cmp eax, [ebp-4]
jne _IF3
mov eax, 1
jmp _pythagoras2
jmp _IF4
_IF3

mov eax, 0
jmp _pythagoras2
_IF4

_pythagoras2
mov esp, ebp
pop ebp
ret



吐き出すコードが冗長なんだが、もう直す時間はなさそう。
関連記事
スポンサーサイト

Comment

コメントフォーム
このエントリへコメントを書く
(任意)
(任意)
(任意)
(必須) HTMLタグは使用できません
(任意) ID生成と編集に使用します
(任意) 非公開コメントにする

Page Top

Trackback

Trackback URI
http://parabola0.blog86.fc2.com/tb.php/421-03390f10 この記事にトラックバックする(FC2ブログユーザーのみ)

Page Top

訪問者

お引っこし。 http://parabola.sblog.jp/

プロフィール

parabola0

Author:parabola0
Twitter用ですが…。
プロフィール

最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
リンク

このブログをリンクに追加する

QRコード
QRコード
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。