簡體   English   中英

字節ptr和字ptr之間的區別

[英]Difference between byte ptr and word ptr

我在試卷上看到了以下問題,

VarM DWORD ABBF01598h

執行后給出寄存器albxdl的內容

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

現在我通過定義知道單詞ptr和byte ptr,但我無法理解它們的概念。

據我說

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

請幫助我理解這些。 提前致謝。

在您正在查看的情況下, byte ptrword ptr不會有太大作用。 雖然無害,但匯編程序已經“知道” aldl是字節大小的,並且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 ,它只添加1到地址,而不是4.當然,如果他們選擇的話,編寫不同匯編程序的人可以采用不同的方式。

通常用於向匯編程序指示您嘗試編碼的指令。 如果你看一下指令集(編碼),它應該更加明顯。 通常,它表示您指的是8位項或16位項(或32位項等)。 例如,如果要將常量#1存儲在內存中,是否要將其存儲為字節或字? 每種編碼都有不同的編碼,但是如果你沒有指定匯編程序就不知道要使用什么編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM