英特尔x86汇编语法中的寄存器括号

Pie*_*ard 3 syntax x86 assembly nasm cpu-registers

我试着理解x86汇编中的括号.在这个例子中,寄存器ax应该包含X,因为括号代表当前的地址LABEL.

mov ax, [LABEL]

LABEL:
db "X", 0
Run Code Online (Sandbox Code Playgroud)

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

mov al, [ebx]
Run Code Online (Sandbox Code Playgroud)

为什么我需要括号?是因为ebx是32位寄存器还是ax16位?区别在于:

mov al, ebx
Run Code Online (Sandbox Code Playgroud)

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

mov [edx], ax
Run Code Online (Sandbox Code Playgroud)

Nat*_*han 7

括号表示法用于访问寄存器指定的"值".

在:

mov ax, [LABEL]

LABEL:
db "X", 0
Run Code Online (Sandbox Code Playgroud)

ax使用value指定的设置进行设置LABEL,在这种情况下,您将'X'(0x58 ASCII)复制到ax寄存器中.

LABEL 包含"X"所在的地址.

这不是有效的操作:

mov al, ebx
Run Code Online (Sandbox Code Playgroud)

还有这个:

mov [edx], ax
Run Code Online (Sandbox Code Playgroud)

您正在将值移动ax到"指向的值"的前两个字节edx,因为它ax是一个16位寄存器,edx是一个32位寄存器,用于保存存储器地址.

  • 注意,在一些汇编器中(实际上,除了 NASM 和 Yasm 之外,我见过的大多数汇编器),`mov ax, LABEL` 实际上读取的是 `LABEL` 的值。在那些汇编程序中,您需要诸如 `mov ax、offset LABEL` 之类的东西来获取 *of* `LABEL` 的值。 (2认同)