【问题标题】:Moving a register into an index of an array in x86 assembly language在 x86 汇编语言中将寄存器移动到数组的索引中
【发布时间】:2013-03-26 10:52:57
【问题描述】:

我正在尝试将bl 寄存器移动到 x86 汇编语言中的字节数组中,但以下语句会从 masm 汇编器产生错误消息。

mov arr[2], bl 产生输出 1>p4.asm(48): error A2101: cannot add two relocatable labels

在 x86 汇编语言中是否可以将寄存器移动到数组中?

【问题讨论】:

  • 我花了几天时间寻找这个问题的答案,但我还没有找到答案。
  • bx是一个16位的寄存器,大于一个字节,如果你只需要bx中包含一个字节,你需要访问bl它的低8位部分
  • @Seki 我现在已经修复了该部分,但我仍在尝试找出如何将寄存器移动到数组的特定索引中。

标签: x86 masm


【解决方案1】:

对于硬编码的索引值,以下内容基本上适用:

mov byte ptr [arr + 2], bl  ;store bl

[] 是可选的:Confusing brackets in MASM32

对于更通用的方式:

mov si, 2                ;your index
mov al, bl               ;bl = byte value from your question
mov bx, offset arr
mov byte ptr [bx+si], al

【讨论】:

  • mov byte ptr [ax], bl 产生此错误:1>p4.asm(54): error A2031: must be index or base register
  • 对不起,虽然我可以很容易地阅读汇编,但我自己写一些有点生疏。我忘记了mov byte ptr 必须使用基址(bx / bp)或索引(si / di)寄存器。查看我的更新。
【解决方案2】:

如果我们使用带有立即操作数的指令,那么我们必须指定我们的操作数将获得多少字节。因此,我们必须使用 byteworddword 之类的关键字来告知汇编器我们想要 ram 位置的后续字节数访问。

mov byte ptr[bx+si], 01h
mov word ptr[bx+si], 0001h
mov dword ptr[bx+si], 00000001h

但是如果我们使用一个寄存器作为操作数(它在字节中是已知的),那么我们不需要它来指定(为了成为一个更小的列表,更容易概述)。

mov [bx+si], al
mov al, [bx+si]

mov [bx+si], ax
mov ax, [bx+si]

例外,MASM 和 DWORD 寄存器作为操作数。

mov dword ptr[bx+si], eax
mov eax, dword ptr[bx+si]

德克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2013-04-15
    • 1970-01-01
    相关资源
    最近更新 更多