【问题标题】:Brackets on registers in Intel x86 assembly syntaxIntel x86 汇编语法中寄存器上的括号
【发布时间】:2013-04-15 22:26:06
【问题描述】:

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

mov ax, [LABEL]

LABEL:
db "X", 0

但我不明白以下两条流水线:

mov al, [ebx]

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

mov al, ebx

还是这个,我不明白为什么需要括号……

mov [edx], ax

【问题讨论】:

    标签: assembly syntax x86 nasm cpu-registers


    【解决方案1】:

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

    mov ax, [LABEL]
    
    LABEL:
    db "X", 0
    

    您正在使用LABEL 标记的内存中的 加载ax。在这种情况下,您要将“X”(0x58 ASCII)复制到ax 寄存器中,同时将0 复制到ax 的高字节中。所以ax = 0x0058ah = 0al = 0x58

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


    这不是一个有效的操作:

    mov al, ebx
    

    还有这个:

    mov [edx], ax
    

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

    【讨论】:

    • 注意,在一些汇编程序中(实际上,我见过的大多数不是 NASM 和 Yasm),mov ax, LABEL 实际上读取 LABEL 的值。在这些汇编程序中,您需要 mov ax, offset LABEL 之类的东西来获得 of LABEL 的值。
    • "您实际上是用 ebx 值的第一个字节设置 al。" vs“您正在将“edx指定的值”的前两个字节设置为ax的值。”。您正在谈论第一个字节和前两个字节。你怎么知道区别? 16 位 vs 32 位?
    • 看看这个问题:stackoverflow.com/questions/228200/…AX是16位寄存器,AL是8位寄存器,EDX是32位寄存器。
    • 是的,但是你说我们将edx指向的值的前两个字节设置为寄存器ax的值。是不是因为 ax 是一个 16 位(2 个字节)的寄存器,所以 edx 的高字节会被设置为 0x00?
    • @cHao 您所说的适用于 MASM/TASM,而不适用于 NASM/FASM/YASM。
    【解决方案2】:

    如果我们使用 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
    

    德克

    【讨论】:

      猜你喜欢
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 2014-02-04
      相关资源
      最近更新 更多