字节ptr和字ptr之间的区别

时间:2012-05-02 12:28:34

标签: assembly x86-16 pointers

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

问题

VarM DWORD ABBF01598h

执行

后,提供寄存器albxdl的内容
  1. mov al, byte ptr VarM + 1
  2. mov bx, word ptr VarM + 2
  3. mov dl, byte ptr VarM + 3
  4. 现在我通过定义知道单词ptr和byte ptr,但我无法理解它们的概念。

    据我说

    1. al = b
    2. bx = 0
    3. dl = F
    4. 请帮助我理解这些。提前致谢。

2 个答案:

答案 0 :(得分:12)

在您正在查看的案例中,byte ptrword ptr并未取得多大成就。虽然无害,但汇编程序已经“知道”aldl是字节大小的,并且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存储在内存中,是否要将其存储为字节或字?每种编码都有不同的编码,但是如果你没有指定汇编程序就不知道要使用什么编码。