私はNASM使うマシン命令にいくつかのアセンブリ命令を変換しようとしたとき、私は何か面白いことを発見した、x86のISAで遊んでいます。同じアセンブリ命令が、別のマシン命令
mov [0x3412],al
mov [0x3412], bl
mov [0x3412], cl
mov [0x3412], dl
1 00000000 A21234 mov [0x3412], al
2 00000003 881E1234 mov [0x3412], bl
3 00000007 880E1234 mov [0x3412], cl
4 0000000B 88161234 mov [0x3412], dl
ご覧のとおり、mov [0x3412], al
はルールの例外です。 はまた、私はmov [0x3412], al
は、2つの異なるマシン命令にマッピングされました。
[email protected]:~/asm$ ndisasm 123
00000000 88061234 mov [0x3412],al
00000004 A21234 mov [0x3412],al
この特別な命令に加えて、x86の複数のマシン命令にマッピングする他のアセンブリ命令がありますか?あなたが観察している何
インテルの808Xデザインのアーティファクトに遭遇しました。 AXは一般的な16ビットレジスタですが、インテルはAX(またはAHとALのハイ/ロウの8ビットバージョン)をいくつかの操作に特化させました。 IntelはAXレジスタをアキュムレータとして認識しました。 AX(およびAH、AL)は、いくつかの命令に対して特殊なエンコーディングを持っています(通常、1バイト少ない)。より短いまたはより長い命令を使用することを選択できます(限られたメモリのほうが短い方が良い)。 AX/AH/ALには、MOV以外にADC、ADD、AND、CMP、OR、SBB、SUB、TEST、XORの特殊なエンコーディングがあります。 –
@MichaelPetch:それは実際の答えであり、単なるコメントではありません! – usr2564301
このようなことに興味があるなら、間違いなく命令セットのリファレンスを調べる必要があります。 – Jester