fud*_*din 5 assembly pointers x86-16
我在试卷上看到了以下问题,
VarM DWORD ABBF01598h
Run Code Online (Sandbox Code Playgroud)
给寄存器的内容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
请帮助我理解这些.提前致谢.
Jer*_*fin 12
在你正在看的情况下,byte ptr
并word ptr
没有取得多大成就.虽然无害,但汇编程序已经"知道" al
并且dl
是字节大小的,并且这bx
是字大小的.
您需要类似于byte ptr
(例如)将立即值移动到间接地址的时间:
mov bx, some offset
mov [bx], 1
Run Code Online (Sandbox Code Playgroud)
通常不允许这样做 - 汇编器无法知道您是否希望将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
Run Code Online (Sandbox Code Playgroud)
您可以让汇编程序接受没有(直接)大小规范的版本:
mov bx, some_offset
assume bx: ptr byte
mov [bx], 1 ; Thanks to the `assume`, this means `byte ptr [bx]`
Run Code Online (Sandbox Code Playgroud)
编辑:(主要回复@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;
}
Run Code Online (Sandbox Code Playgroud)
我得到的结果是:
5040302
Run Code Online (Sandbox Code Playgroud)
表明即使我告诉它dword ptr
,它只在地址中添加1,而不是4.当然,如果他们选择的话,编写不同汇编程序的人可以采用不同的方式.