HobbyOSs / opennask

nask clone assembly, it can boot tiny OS with Linux
https://github.com/HobbyOSs/opennask/wiki/%E5%8B%95%E4%BD%9C%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF
GNU General Public License v3.0
20 stars 3 forks source link

メモリーアドレッシングモードの実装修正 #73

Open hangingman opened 1 year ago

hangingman commented 1 year ago

ref #32

結論から書くと、このような処理も字句解析時にある程度解析してもいいのかもしれない

仕様

ref https://web.archive.org/web/20230616085837/https://faculty.kfupm.edu.sa/COE/aimane/assembly/pagegen-64.aspx.htm

16ビットメモリアドレッシングモード

Operand Type Pattern
direct [displacement]
register indirect [BX]
[SI]
[DI]
[BP]
based [BP + displacement]
[BX + displacement]
indexed [SI + displacement]
[DI + displacement]
based-indexed [BX + SI]
[BX + DI]
[BP + SI]
[BP + DI]
based-indexed with displacement [BX + SI + displacement]
[BX + DI + displacement]
[BP + SI + displacement]
[BP + DI + displacement]

32ビットメモリアドレッシングモード

Operand Type Pattern
direct [displacement]
register indirect [base]
based [base + displacement]
indexed [Index*scale + displacement]
based-indexed [base + Index + displacement]
based-indexed with displacement [base + index*scale + displacement]

(1) MOV ECX, [ESP] を考える

(1)をアセンブルすると 67 66 8B 0C 24 となる 67 66 8B 0C までは自明なのであるが、0x24 がよくわからない

下記の表をもとに計算する

image

Intelの本, p.37 IA-32 インテル ® アーキテクチャ ソフトウェア・デベロッパーズ・ マニュアル 中巻 A:命令セット・リファレンス A-M

webでアセンブラの結果確認できるサイト https://defuse.ca/online-x86-assembler.htm