【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

2012-06-10から1日間の記事一覧

jeとjz

x86

第6回 コンパイラ実装会で出た話題です。jzをアセンブルして逆アセンブルしたらjeになると指摘されました。なぜ変わるのか?jeとjzは別名(エイリアス)でまったく同じため、どちらを使っても同じマシン語が出力されます。理由としては、cmp命令による比較は…

第7回 コンパイラ実装会

みんなでコンパイラの実装に挑戦する勉強会です。バイナリいじりの基礎から始めて、実行ファイルを自前のコンパイラで作って動かすことを目標にします。コンパイラをきっかけにして、各種マシンコードやOSのメモリ管理について理解を深めるのが狙いです。 20…

Brainf*ckの分岐をJIT

x86の分岐命令は相対アドレス指定のため、分岐元と分岐先のアドレスが決まらなければ相対アドレスを求められません。Brainf*ckではループの先頭と末尾で分岐が出てきます。相互に分岐しているので少し複雑です。 ループの先頭 loop_begin: cmp byte ptr[esi]…

PythonによるJITで関数呼び出し

前回、Pythonでポインタアクセスする方法が分かりました。 Pythonでポインタ経由のメモリアクセス これを使ってC言語で書いたJITをPythonに移植してみます。コードの詳細は以下を参照してください。 JITで関数呼び出し 共通部 (jit.py) import sys, struct f…

Pythonでポインタ経由のメモリアクセス

Pythonでmalloc()したメモリへのアクセスを試しました。戻り値を POINTER(c_ubyte) へキャストするとアクセスできます。※ 例は32bit Windows限定のコードです。UNIX系ではlibcのロード方法が少し違います。 from ctypes import * malloc = cdll.msvcrt.mallo…