Assembly 8086组件,关于PTR操作员

Assembly 8086组件,关于PTR操作员,assembly,x86,x86-16,Assembly,X86,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 (100

这可能是简单和愚蠢的,但我还是会问,因为我似乎无法理解它

一个简单的代码片段:

 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
我想这和地址有关,它被移动了一个字节或者别的什么,但我不太确定,我真的需要理解

提前谢谢

这个

mov ax,word ptr b
格式如下时更容易理解:

mov ax, word ptr [b]
它的作用是将地址
b
处的单词复制到ax中。那么这个

mov bx,word ptr b+1 
事实上

mov bx,word ptr [b+1]
其作用是将地址
b+1
处的单词复制到bx中

现在
dd
指示分配dword并为其分配256。256英寸十六进制表示为
00000100h
。dword将按如下方式分配到内存中:字节
000100000h
01h
00h
00h
,因为在x86上,较低的字节存储在较低的地址(所谓的小端)

当内存被读入寄存器时,字节顺序被改变,使得较低的字节占据寄存器中较低的位(“自然”,即所谓的big-endian)。因此,内存中的
00h
01h
在寄存器内变成
0100h
01h
00h
在寄存器内变成
0001h


因此,第一个
mov
b
00h
01h
)获取前两个字节,并使
ax
=
0100h
,第二个从
b
01h
00h
)获取中间两个字节并使
bx
==
0001h

仅当我们要将立即值写入ram位置时,才需要指定字节数。 否则,我们的汇编器将使用的registersize来确定要访问的字节数

除了通过使用MASM使用dword访问外,如果我们想要dword访问,那么我们还需要dword PTR的声明,例如将EAX的内容写入ram位置,或者将dword从ram位置读取到EAX。与所有其他32位寄存器相同

我认为,如果我们想要一个具有字节、字和/或dword访问的多重访问,最好用define bytes(DB)表示法声明一个命名的ram位置

b DB 0, 1, 0, 0
registersize是众所周知的,我们不需要指定:

mov al, [b]
mov [b], al

mov bl, [b+1]
mov [b+1], bl

mov ax, [b]
mov [b], ax

mov bx, [b+1]
mov [b+1], bx
除MASM外:

mov eax, dword ptr[b]
mov dword ptr[b], eax
使用imediate值:

mov byte ptr[b], 0
mov word ptr[b], 256
mov dword ptr[b], 256

Dirk

那么,你的问题是什么?这与CI中的指针解引用相同。很抱歉,我的回答含糊不清。我的问题是为什么bx:=1?因为b的内容是256,b+1是257?考虑到mov应该处理内容而不是地址。为什么mov bx,单词ptr b+1会导致bx:=1?