我在试卷上看到了以下问题,
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
请帮助我理解这些。提前致谢。
答案 0 :(得分:12)
在您正在查看的案例中,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.当然,编写不同汇编程序的人可以以不同方式执行此操作他们选择了。
答案 1 :(得分:1)
通常用于向汇编程序指示您要编码的指令。如果你看一下指令集(编码),它应该更加明显。通常,它表示您指的是8位项或16位项(或32位项等)。例如,如果要将常量#1存储在内存中,是否要将其存储为字节或字?每种编码都有不同的编码,但是如果你没有指定汇编程序就不知道要使用什么编码。