2

这可能既简单又愚蠢,但无论如何我都会问它,因为我似乎无法弄清楚。

一个简单的代码片段:

 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

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

提前致谢 !

4

2 回答 2

10

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 将像这样在内存中分配00010000h- bytes 00h, 01h, 00h00h因为在 x86 上,低字节存储在低地址(所谓的小端)。

当内存被读入寄存器时,字节顺序被改变,低字节占据寄存器中的低位(“自然”,所谓的大端)。所以00h01h内存中变成0100h了寄存器内部01h00h内存中变成了0001h寄存器内部。

所以第一个从( , )mov获取前两个字节并生成== ,第二个从( , )获取中间两个字节并生成== 。b00h01hax0100hb01h00hbx0001h

于 2013-02-08T12:35:00.890 回答
0

只有当我们想将立即值写入 ram 位置时,我们才需要指定字节数。否则,我们的汇编器使用寄存器大小来确定我们要访问多少字节。

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

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

b DB 0, 1, 0, 0

寄存器大小是众所周知的,我们不需要指定:

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

使用中间值:

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

短剑

于 2014-01-07T10:43:57.980 回答