8086汇编,关于PTR运营商

rar*_*dea 2 x86 assembly x86-16

这可能是简单而愚蠢的,但无论如何我会问它,因为我似乎无法弄明白.

一个简单的代码片段:

 assume cs:code, ds:data
 data segment
    b dd 256
 data ends

 code segment
 start:
        mov ax,data
        mov ds,ax
        mov ax,word ptr b     -> the result of this operation will be ax:= 256 (100h)

        mov bx,word ptr b+1   -> while this is going to be bx:= 1
Run Code Online (Sandbox Code Playgroud)

我想它与地址有关,它被一个字节或其他东西移动但我不完全确定,我真的需要理解.

提前致谢 !

sha*_*oth 10

这个

mov ax,word ptr b
Run Code Online (Sandbox Code Playgroud)

在格式化时更容易理解:

mov ax, word ptr [b]
Run Code Online (Sandbox Code Playgroud)

它具有将地址中的单词复制b到ax中的效果.所以这

mov bx,word ptr b+1 
Run Code Online (Sandbox Code Playgroud)

实际上是

mov bx,word ptr [b+1]
Run Code Online (Sandbox Code Playgroud)

具有将地址中的单词复制b+1到bx的效果.

现在dd指示分配一个dword并为其分配256.十六进制256表示为00000100h.将DWORD将在这样的内存分配00010000h-字节00h,01h,00h,00h因为在x86低字节存储在较低的地址(所谓小端).

当存储器被读入寄存器时,字节顺序被改变,使得较低字节占据寄存器中的较低位("自然",即所谓的大端).因此00h,01h在内存变成0100h一个寄存器内01h,00h内存变成0001h内部寄存器.

所以第一个movb(00h,01h)获取前两个字节并使ax== 0100h,第二个从b(01h,00h)得到中间两个字节,并使bx== 0001h.