我坚信我理解 x86 程序集中的括号。在此示例中,寄存器ax
应包含X
,因为括号表示 的当前地址LABEL
。
mov ax, [LABEL]
LABEL:
db "X", 0
但我不明白以下两条装配线:
mov al, [ebx]
为什么我需要括号?是因为ebx
是32位寄存器和ax
16位吗?有什么区别:
mov al, ebx
或者这个,我不明白为什么我需要括号......
mov [edx], ax
我坚信我理解 x86 程序集中的括号。在此示例中,寄存器ax
应包含X
,因为括号表示 的当前地址LABEL
。
mov ax, [LABEL]
LABEL:
db "X", 0
但我不明白以下两条装配线:
mov al, [ebx]
为什么我需要括号?是因为ebx
是32位寄存器和ax
16位吗?有什么区别:
mov al, ebx
或者这个,我不明白为什么我需要括号......
mov [edx], ax
括号表示法用于让您访问寄存器或标签的“指向的值”。
mov ax, [LABEL]
LABEL:
db "X", 0
您正在从标记为 的内存中ax
加载值LABEL
。在这种情况下,您将 'X' (0x58 ASCII) 复制到ax
寄存器中,同时复制0
到ax
. 因此ax = 0x0058
,与ah = 0
, al = 0x58
。
LABEL
附在“X”所在的地址上。
这不是一个有效的操作:
mov al, ebx
和这个:
mov [edx], ax
您正在将值移动ax
到“指向的值”的前两个字节中edx
,因为ax
它是一个 16 位寄存器,并且edx
只是保存应该写入的内存地址。
如果我们使用括号中的 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
短剑