1

x86 アセンブリ (MASM) で 2 つの大きな数値を加算するサブルーチンを作成しようとしています。数値は 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]

各グループ(変位、ベース、オフセット)から最大1つのアイテムを選択する必要があります。他の組み合わせは有効ではありません。

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 に答える