assembly - 字节ptr和字ptr的区别

标签 assembly x86-16 pointers

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

VarM DWORD ABBF01598h
给出寄存器的内容 al , bx , 和 dl执行后
  • mov al, byte ptr VarM + 1
  • mov bx, word ptr VarM + 2
  • mov dl, byte ptr VarM + 3

  • 现在我通过定义知道 word ptr 和 byte ptr ,但我无法理解它们的概念。
    据我
  • al = b
  • bx = 0
  • dl = F

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

    最佳答案

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

    关于assembly - 字节ptr和字ptr的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10413759/

    相关文章:

    java - 指向 Java LinkedList 节点的指针

    assembly - 如果汇编程序中的CALLed代码块中没有return语句怎么办

    c++ - GCC/g++ cout << 与 printf()

    assembly - 这部分MIPS代码中使用ori有什么用?

    c - 如何将内存数据从指针复制到数组 ASSEMBLY 8086

    c - 从 C 中另一个函数的指针获取输入

    c++ - 在 C++ 中引用 const 对象/指针

    c - 如何测量 C 中 ARM Cortex-M4 处理器的运行时间?

    assembly - Int 21h/ah=39h 在创建目录时返回 AX=3

    assembly - X86 余数的 IDIV 符号取决于 8/-3 和 -8/3 的被除数符号?