在间接寻址中非法使用寄存器

时间:2013-03-12 04:57:13

标签: assembly x86 masm

我正在尝试编写一个子程序,在x86程序集(MASM)中添加两个大数字。 si和di寄存器指向数字,函数应从右向左迭代,添加每个数据字并传递进位,并将结果保存为di。要添加的数据字数由前一块代码确定。

...
    mov       cx, ( number of data words to add )
adding:
    mov       bx,cx               ;copy the loop counter to bx
    lea       ax,[di+2*bx]        ;move ax to the destination word
    adc       ax,[si+2*bx]        ;add the source word into the destination word
    loop      adding              ;main sub loop
...

不幸的是,当我尝试编译此代码时,我收到错误A2032:在lea和adc行上无效使用register。我正在使用的语法有什么问题?

1 个答案:

答案 0 :(得分:3)

original 8086 addressing modes仅限于此图表中的组合:

     (disp)   (base)   (offset)
 mov [1234] + [bx]  +  [si], ax
              [bp]  +  [di]

必须从每个组中选择最多一个项目(位移,基础和偏移)。没有其他组合是有效的。

The 80386 addressing modes被延伸到更正交:

 mov  al, byte ptr [12345] + [esp + 8 * eax];

这里索引寄存器都是32位,esp可以用来直接指向堆栈变量,缩放项的合法值是1,2,4和8.这么多组合指令{{1}可以用来执行单个指令正交 3参数加法而不改变标志:[reg1] = [reg2] + [reg3];并执行一些其他算术,例如将寄存器乘以因子3,5或9。

如果没有32位寻址模式,则必须模拟缩放,例如与

LEA

另见purpose of LEA instruction