我正在尝试编写一个子程序,在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。我正在使用的语法有什么问题?
答案 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