Skip to content

9日目の解析

hangedman edited this page Aug 31, 2023 · 6 revisions

だいぶ楽に動くようになってきた。 もはやアセンブラ命令を実装するだけのルーチンワークと化しているので、時間さえあれば30日目まで終わりそう。

新規の命令だけピックアップ

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