7

私は試験紙で次の質問を見ました、

質問

VarM DWORD ABBF01598h

alレジスタの内容を与える、、、bxおよびdlの実行後

  1. mov al, byte ptr VarM + 1
  2. mov bx, word ptr VarM + 2
  3. mov dl, byte ptr VarM + 3

今、私は定義によって単語ptrとバイトptrを知っていますが、それらの概念を理解することができません。

私によると

  1. al = b
  2. bx = 0
  3. dl = F

これらを理解するのを手伝ってください。前もって感謝します。

4

2 に答える 2

13

あなたが見ている場合、byte ptrword ptrはあまり達成していません。無害ですが、アセンブラはすでにそれを「認識」してalおりdl、バイトサイズであり、bxワードサイズです。

byte ptr(たとえば)即値を間接アドレスに移動する場合のようなものが必要です。

mov bx, some offset
mov [bx], 1

1これは通常は許可されません。アセンブラは、バイト、ワード、ダブルワード、場合によってはクアッドワード、または何に書き込むかを知る方法がありません。サイズ指定を使用して修正します。

mov byte ptr [bx], 1  ; write 1 into a byte
mov word ptr [bx], 1  ; write 1 into a word
mov dword ptr [bx], 1 ; write 1 into a dword

(直接)サイズ指定のないバージョンをアセンブラーに受け入れさせることができます。

mov bx, some_offset
assume bx: ptr byte

mov [bx], 1   ; Thanks to the `assume`, this means `byte ptr [bx]`

編集:(主に@NikolaiNFettisovに返信するため)。このクイックテストを試してください:

#include <iostream>

int test() { 
    char bytes[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    _asm mov eax, dword ptr bytes + 1
}

int main() {
    std::cout << std::hex << test();
    return 0;
}

私が得る結果は次のとおりです。

5040302

私が言ったとしてもdword ptr、アドレスには4ではなく1しか追加されていないことを示しています。もちろん、別のアセンブラを作成している人は、選択すれば別の方法でそれを行うことができます。

于 2012-05-02T12:38:07.050 に答える
1

通常、エンコードしようとしている命令をアセンブラに示すために使用されます。命令セット(エンコーディング)を見ると、より明白になっているはずです。一般に、8ビットアイテムまたは16ビットアイテム(または32ビットアイテムなど)を参照していることを意味します。たとえば、定数#1をメモリに格納する場合、バイトまたはワードとして格納しますか?それぞれに異なるエンコーディングがありますが、指定しないと、アセンブラはどのエンコーディングを使用するかわかりません。

于 2012-05-02T14:38:16.720 に答える