9日目の解析 - HobbyOSs/opennask GitHub Wiki
だいぶ楽に動くようになってきた。 もはやアセンブラ命令を実装するだけのルーチンワークと化しているので、時間さえあれば30日目まで終わりそう。
新規の命令だけピックアップ
-
naskfunc.nas
-
naskのバグを発見?
XOR
でDWORD指定をしているが、出てくるオペコードが0x83
になる
naskの出力
000000DD 83 33 FF XOR DWORD [EBX],0xffffffff
インテルの仕様書より、
DWORD
で即値を指定してるから、明らかに 0x81 /6 id XOR r/m32, imm32
が選ばれると思うのだが…
0x81 /6 iw XOR r/m16, imm16 r/m16とimm16との排他的論理和をとります
0x81 /6 id XOR r/m32, imm32 r/m32とimm32との排他的論理和をとります
0x83 /6 ib XOR r/m16, imm8 r/m16と符号拡張したimm8との排他的論理和をとります
0x83 /6 ib XOR r/m32, imm8 r/m32と符号拡張したimm8との排他的論理和をとります
XOR命令ではそのビット演算パターンの特性から、たとえばダブルワードの数値に 0xFFFFFFFFで排他的論理和を演算すると、元の数値のすべてのビットが反転します。
試しにnasm
でやってみたらnask
と同じだった…なんで?
00000000 8333FF xor DWORD [ebx], 0xffffffff