我在试卷上看到以下问题,
问题
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 和字节 ptr ,但我无法理解它们的概念。
据我说
al = b
bx = 0
dl = F
请帮助我理解这些。提前致谢。
在您正在查看的情况下,byte ptr
andword 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 存储在内存中,你想将它存储为一个字节还是一个字?每种都有不同的编码,但如果您不指定汇编程序,则不会知道要使用什么编码。