1

次のコードを使用して、ebxの下位2バイトを上位2バイトに「格納」し、下位bxを「プール」へのオフセットにアクセスするための一時変数として使用しようとします。最後に、データを右にシフトして、元の値(元々は下位2バイトのみを使用)を復元します。

rol ebx, 16

mov bl, dl
;(other operations involving bx)    
mov [pool+bx], dword esi

shr ebx, 16

これはnasmで問題なく組み立てられますが、エラーが発生します

適合するように切り捨てられた再配置:`.data'に対するR_386_16

リンクするとき。このエラーを回避する方法について何かアドバイスはありますか?文字通りすべてのレジスタがespを保存し、セグメントレジスタが使用されているため、単に別のレジスタを使用することはできません。

編集:誰かが尋ねると思いますので、32ビットアセンブリを使用しています

4

2 に答える 2

2

実効アドレスで使用bxしたため、アセンブラは16ビットアドレスが必要であると考え、リンカが不満を持っていた16ビットの再配置を生成しました。変数がアドレス空間の下位64kにある可能性は低いため、32ビットモードではおそらく機能しません。

空きレジスタがない場合は、スタックを使用できます。

push ebx
mov bl, dl
;(other operations involving bx)
movzx ebx, bx
mov [pool+ebx], esi
pop ebx

下位16ビットのみebxが使用されたとおっしゃいました。その場合は、次のように、の上位16ビットをedx保存できます。dxebx

shl ebx, 16
mov bx, dx
;(other operations involving dx)
movzx edx, dx
mov [pool+edx], esi
mov dx, bx
shr ebx, 16

いいえ、セグメントレジスタに任意の値を保存することはできません。

于 2012-12-31T01:40:46.127 に答える
0

bxをmovzxebx、bxで切り捨ててから、テーブルmov [pool + ebx]、esi:)へのインデックスとして使用します。

于 2012-12-31T01:18:58.937 に答える