assembly - Intel x86 汇编语法中寄存器上的括号

标签 assembly syntax x86 nasm cpu-registers

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

mov ax, [LABEL]

LABEL:
db "X", 0

但我不明白以下两条 assembly 线:

mov al, [ebx]

为什么需要括号?是因为 ebx 是 32 位寄存器而 ax 是 16 位吗?有什么区别:

mov al, ebx

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

mov [edx], ax

最佳答案

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

mov ax, [LABEL]

LABEL:
db "X", 0

您正在使用LABEL标记的内存中的加载ax。在本例中,您将“X”(0x58 ASCII)复制到 ax 寄存器中,同时将 0 复制到 ax 的高字节中>。因此,ax = 0x0058,以及 ah = 0al = 0x58

LABEL 附加到“X”所在的地址。

<小时/>

这不是一个有效的操作:

mov al, ebx

还有这个:

mov [edx], ax

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

关于assembly - Intel x86 汇编语法中寄存器上的括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16156933/

相关文章:

c - 如何在汇编中正确调用函数

java - 定义没有名字的java类

syntax - 尝试导入 `reqwest::async` 错误说明 `async` 是保留关键字

c - 哪种顺序在汇编语言中更有效?

c - 使用 GCC 将程序集 (AT&T) 文件与 C 程序链接时出现问题

c - 为什么我会通过这种无条件跳转获得 SIGSEGV?

multithreading - “XORL AX, AX”如何用作内存屏障? [复制]

c++ - RDTSCP 是否跨多核单调递增?

assembly - 是否可以将 ymm16 - ymm31 用于 AVX2 vpcmpeq{size} 指令?

python - 如何制作 Sublime Text 2 主题?