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?