7

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

问题

VarM DWORD ABBF01598h

给出寄存器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 和字节 ptr ,但我无法理解它们的概念。

据我说

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

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

4

2 回答 2

13

在您正在查看的情况下,byte ptrandword 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。当然,如果他们选择,编写不同的汇编程序的人可以做不同的事情。

于 2012-05-02T12:38:07.050 回答
1

通常用于向汇编程序指示您要编码的指令。如果您查看指令集(编码),它应该更明显。一般来说,这意味着您指的是 8 位项目或 16 位项目(或 32 位项目等)。例如,如果你想将常量#1 存储在内存中,你想将它存储为一个字节还是一个字?每种都有不同的编码,但如果您不指定汇编程序,则不会知道要使用什么编码。

于 2012-05-02T14:38:16.720 回答