2017-09-18 3 views
5

インテルソフトウェア開発者マニュアル(この記事ではISDMと呼ばれます)とx86 Instruction Set Reference(これは前者のコピーです)から、mov命令データをeax/ax/alからメモリオフセットに、またはその逆に移動することができます。NASMと8ビットメモリオフセットの混乱

たとえば、mov moffs8, almoffs8オフセット一部8ビットメモリにalレジスタの内容を移動させます。

今、moffs8とは何ですか? - 単純なメモリ変数(メモリオフセット)タイプバイト、ワード、またはMOVのいくつかの変形例で使用をダブルワード

moffs8、moffs16、moffs32、moffs64:ISDM(3.1.1.3)を引用命令。実際のアドレスはセグメントベースに対して単純なオフセットで与えられます。命令にはModR/Mバイトは使用されません。 moffsで示される数値は、そのサイズがであることを示します。これは、命令のアドレスサイズ属性によって決まります。

私はmoffs8のタイプがバイトで、サイズは8ビットであることを言って文章を強調しました。

私はアセンブリの初心者ですから、これを読んだ直後に、私はmov moffs8, al命令でNASMを使い始めました。ここで私が書いたコードは次のとおりです。

; File name: mov_8_bit_al.s 
USE32 

section .text 
    mov BYTE [data], al 

section .bss 
    data resb 2 

これは(16進数で)nasm -f bin mov_8_bit_al.sが生成するものである:

A2 08 00 00 00 

は、ここで私はこれを理解方法は次のとおりです。

  • A2MOV moffs8, ALのオペコードです
  • 08は、サイズがのメモリオフセット自体です。1バイト
  • 00 00 00メモリが相殺されることが08 00 00 00のように見えるいくつかのゴミ

であるが、この場合には、それがmoffs32、ないmoffs8です!したがって、CPUはA2を実行している間に1バイトだけを読み込み、ADD命令またはそれ以外のものとして、00を扱います。

NASMはここで無効なバイトコードを生成しているように見えますが、私はそれが誤解されている人ですね... NASMはIDSMに従っていないのでしょうか?もしそうなら、そのコードはインテルのCPU上では正しく実行されないので、それを実行する必要があります!

私が間違っている場所を教えていただけますか?

答えて

7

moffsの後のサイズサフィックスは、実際にはアドレス自体のサイズではなく、オペランドサイズを参照します。これは、r/mの後のサイズ接尾辞の意味を反映しています。

説明書は、実際にノートになる言う:

NOTES:
* moffs8、moffs16、moffs32とmoffs64オペランドは8セグメント・ベースに対してオフセット簡単に指定、16、32及び64 は、データのサイズを示します。命令のアドレスサイズ属性によって、オフセットのサイズが16,32または64のいずれかで決まります。 ビット。

+0

命令のアドレスサイズ属性はどこで取得できますか? – ForceBru

+0

@ForceBruこれは、アドレスのサイズとアドレスのサイズに依存します。プレフィックス – harold

+0

ああ、32ビットモードで実行していて、プレフィックスがない場合、アドレスは4バイトを占めるでしょうか? – ForceBru