[英]What is difference between `move byte ptr`, `move word ptr`` mov var+1, mov [var]+1?
[英]Difference between byte ptr and word ptr
我在試卷上看到了以下問題,
VarM DWORD ABBF01598h
執行后給出寄存器al
, bx
和dl
的內容
mov al, byte ptr VarM + 1
mov bx, word ptr VarM + 2
mov dl, byte ptr VarM + 3
現在我通過定義知道單詞ptr和byte ptr,但我無法理解它們的概念。
al = b
bx = 0
dl = F
請幫助我理解這些。 提前致謝。
在您正在查看的情況下, byte ptr
和word 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
,它只添加1到地址,而不是4.當然,如果他們選擇的話,編寫不同匯編程序的人可以采用不同的方式。
通常用於向匯編程序指示您嘗試編碼的指令。 如果你看一下指令集(編碼),它應該更加明顯。 通常,它表示您指的是8位項或16位項(或32位項等)。 例如,如果要將常量#1存儲在內存中,是否要將其存儲為字節或字? 每種編碼都有不同的編碼,但是如果你沒有指定匯編程序就不知道要使用什么編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.