byte ptr和word ptr之间的区别

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
根据您的描述,VarM是一个内存变量。在这里,byte ptr和word ptr是指示符,用于告诉计算机在内存中读取多少字节。
对于第一条指令,将VarM + 1处的1个字节值复制到寄存器al中。因此,al = b。
对于第二条指令,将VarM + 2处的2个字节值复制到寄存器bx中。因为它是一个字(word),所以将两个字节合并成一个16位值。假设VarM + 2的值为0x00F0,则bx = 0x00F0。
对于第三条指令,将VarM + 3处的1个字节值复制到寄存器dl中。因此,dl = F。
希望这可以帮助您理解这些概念!
2个回答

13
在你所看的情况中,使用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。当然,写不同汇编语言的人可以选择不同的方式。


不确定,但是 byte ptr VarM + 1 不是等于 VarM + 1,而 word ptr VarM + 2 则等于 VarM + 4,就像在 C 语言中一样吗? - Nikolai Fetissov

1

通常用于指示汇编器您正在尝试编码的指令。如果查看指令集(编码),则应更明显。一般来说,它意味着您正在引用8位项目或16位项目(或32位项目等)。例如,如果要将常数#1存储在内存中,您想将其存储为字节还是单词?每个都有不同的编码,但如果您不指定,汇编器将不知道要使用哪种编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接