8086の逆アセンブラ実装の続き。 aaa命令までやる。
add命令のImmediate to Register/Memoryがよくわからなかった。いつもどおりndisasmの仕様かと思ったら、最初の1バイトの82が欠番になっていたりで場合分けがしんどかった。
そこそこ実装が進んでいて、最初の1バイトが他の命令とダブっているっていうことがあったりして、そういう場合は場合分けをちょくちょくしている。inc命令とpush命令とか。
あとはコーディングの問題だと思う。
8086の逆アセンブラ実装の続き。 aaa命令までやる。
add命令のImmediate to Register/Memoryがよくわからなかった。いつもどおりndisasmの仕様かと思ったら、最初の1バイトの82が欠番になっていたりで場合分けがしんどかった。
そこそこ実装が進んでいて、最初の1バイトが他の命令とダブっているっていうことがあったりして、そういう場合は場合分けをちょくちょくしている。inc命令とpush命令とか。
あとはコーディングの問題だと思う。
シェルスクリプトで指定回数実行 とある現場の組込みエンジニア
これの応用です。機械的にファイルを作成したり消したりしてコミットしているだけなので、実用性は全くありません。
#!/bin/sh for i in `seq 1 1 1000` do touch 1.out git add .nn git commit -m "add" rm 1.out git add --all . git commit -m "delete" done
pop csは8086/8088でしか動かなくって、たとえばndisasmで逆アセンブルすると結果はpop csにならない。ということが英語のWikipediaに書いてありました。
POP CS (opcode 0x0F) works only on 8086/8088. http://t.co/QXdtDk3cAw
— 炭鉱ハッカー しげまーくつー (@shigemk2) 2014, 12月 7
これは事実上何もしていない命令なので、エイリアス扱いでnopとして逆アセンブルされる。
leaはカッコを外して(無視して)計算する仕様
lea ax, [bx] ! ax = bx lea ax,[bx+5] ! ax = bx + 5 ! ここはありえない lea ax, ax
les ax,[bx+si] ! 4バイトぶん読み込んでesとaxに入れる
周辺機器(キーボード マウス)専用のアドレス(in out命令で使われるやつ)
0x1234とかアドレスの場所を指定しているから固定
dxのアドレスは場合によって変わる
I/O空間の関係
8086の逆アセンブラのHaskell実装。
mul命令までやる。順番にごにょごにょしていって、最後にリファクタするのがよろしいかと。
あとは物量の問題ですかね。とりあえずbcなしでも1バイトの2進数が計算できるようにはなってきている気はしている。
8086逆アセンブラ実装の壁 その1 - by shigemk2
8086 メモ lesとかportとか - by shigemk2