我在试卷上看到了以下问题,
题
VarM DWORD ABBF01598h
给出寄存器的内容 al
, bx
, 和 dl
执行后mov al, byte ptr VarM + 1
mov bx, word ptr VarM + 2
mov dl, byte ptr VarM + 3
现在我通过定义知道 word 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。当然,如果有人选择编写不同的汇编程序,他们可以做不同的事情。
关于assembly - 字节ptr和字ptr的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10413759/