在间接非法使用寄存器寻址(Illegal use of register in indirect a

2019-07-21 09:12发布

我试着写一个子程序,在x86汇编(MASM)增加了两个大数。 这些数字是指向由Si和二寄存器和函数应从右到左进行迭代,将每个数据字和通过进位和保存的结果二。 补充的是由代码先前块确定的数据字的数目。

...
    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线都无效使用寄存器。 什么是错的,我使用的语法?

Answer 1:

在最初的8086种寻址模式限于此表中的组合:

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

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

80386种寻址模式被扩展向多个正交:

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

这里,索引寄存器都是32位,尤指可用于直接指向堆栈变量,并且缩放术语具有1,2,4和8采用这种许多组合的指令合法值LEA可以用来执行单指令正交 3参数除了不改变国旗:[REG1] = [REG2] + [REG3]; 并执行一些其它算术运算,诸如通过3,5-或9乘以系数寄存器。

无32位寻址模式中的一种具有效仿缩放例如用

     mov bx, (N-1)*2          // constant expression
 a:  mov ax, [bx + di]
     adc ax, [bx + si]
     sub bx, 2
     jns a

又见LEA指令的目的 。



文章来源: Illegal use of register in indirect addressing