1

我正在尝试编写一个在 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 行上的寄存器使用无效。我使用的语法有什么问题?

4

1 回答 1

3

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

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

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

80386 寻址模式向更正交的方向扩展:

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

这里的变址寄存器都是 32 位的,esp 可以用来直接指向栈变量,缩放项的合法值是 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 指令的目的

于 2013-03-12T07:04:17.827 回答