3

我坚信我理解 x86 程序集中的括号。在此示例中,寄存器ax应包含X,因为括号表示 的当前地址LABEL

mov ax, [LABEL]

LABEL:
db "X", 0

但我不明白以下两条装配线:

mov al, [ebx]

为什么我需要括号?是因为ebx是32位寄存器和ax16位吗?有什么区别:

mov al, ebx

或者这个,我不明白为什么我需要括号......

mov [edx], ax
4

2 回答 2

11

括号表示法用于让您访问寄存器或标签的“指向的值”。

mov ax, [LABEL]

LABEL:
db "X", 0

您正在从标记为 的内存中ax加载LABEL。在这种情况下,您将 'X' (0x58 ASCII) 复制到ax寄存器中,同时复制0ax. 因此ax = 0x0058,与ah = 0, al = 0x58

LABEL附在“X”所在的地址上。


这不是一个有效的操作:

mov al, ebx

和这个:

mov [edx], ax

您正在将值移动ax到“指向的值”的前两个字节中edx,因为ax它是一个 16 位寄存器,并且edx只是保存应该写入的内存地址。

于 2013-04-22T21:36:24.870 回答
3

如果我们使用括号中的 32 位寄存器“EDX”作为地址寄存器,那么 EDX 内部的值将用作指向 ram 位置的地址。从这个位置开始,我们可以读取或写入一个字节、两个字节或四个字节。

写一个字节、两个字节和四个字节的例子:

location DB ?, ?, ?, ?
mov edx, offset location
mov eax, 04030201h

写一个字节:

mov [edx], al
result:
location DB 01, ?, ?, ?

写另一个字节:

mov [edx], ah
result:
location DB 02, ?, ?, ?

写两个字节:

mov [edx], ax
result:
location DB 01, 02, ?, ?

写入四个字节:

mov [edx], eax
result:
location DB 01, 02, 03, 04

短剑

于 2013-05-05T07:43:55.300 回答