字节ptr和字ptr之间的区别

fud*_*din 5 assembly pointers x86-16

我在试卷上看到了以下问题,

VarM DWORD ABBF01598h
Run Code Online (Sandbox Code Playgroud)

给寄存器的内容al,bx以及dl执行后

  1. mov al, byte ptr VarM + 1
  2. mov bx, word ptr VarM + 2
  3. mov dl, byte ptr VarM + 3

现在我通过定义知道单词ptr和byte ptr,但我无法理解它们的概念.

据我说

  1. al = b
  2. bx = 0
  3. dl = F

请帮助我理解这些.提前致谢.

Jer*_*fin 12

在你正在看的情况下,byte ptrword 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.当然,如果他们选择的话,编写不同汇编程序的人可以采用不同的方式.