2

この種のエラーが発生しています:

beroset-p-637-無効な実効アドレス

エラー行を含むサンプル コード ブロックを次に示します。

mov eax, 3
mov ebx, 0
lea ecx, [record + count*patient + firstName]          ;this one
int 80h

上記のコード ブロックの変数は次のとおりです。

patient equ 37
firstName equ 0

count resb 1
record resb patient*5

カウント変数は患者との乗算に使用できませんか?


x86 Ubuntu 13でNASMを使用しています

4

4 に答える 4

3

アドレスを計算するときに、変数を掛けることはできません。したがって、count * 患者を個別に乗算し、後で追加する必要があります。

于 2013-09-04T05:48:05.573 に答える
2

実際に必要な操作:

 mov eax, count
 imul eax, patient
 lea ecx, [eax + record+ firstName]

imul の理由は、アドレス指定操作でレジスタに 1、2、4、8 以外の定数を掛けることができないためです。そして、患者は本当に奇妙な定数です (37)。

leaを使用して、1、2、4、8 のさまざまな倍数を組み合わせることで、複雑な乗算を行うことができます。37 = 32 + 5 であることに注意すると、次のことができます。

 mov   eax, count
 lea   ebx, [eax*8]       ; 8 * count
 lea   eax, [eax+4*eax]   ; 5 * count
 lea   eax, [ebx*4+eax]   ; 4*8*count +5*count
 lea   ecx, [eax + record+ firstName]

最新の x86 では、lea 命令は非常に高速です。これは、imul の計算を上回る可能性があります。それが実際の患者にとって重要かどうかは疑問です。

于 2013-09-04T07:10:03.010 に答える
2

変数を別々のレジスタに入力してから乗算する必要があります。2 つの変数を直接乗算することはできません。

于 2013-09-09T00:05:37.860 に答える