4

CHの内容をEAXx86 アセンブリに追加する必要がありますが、これをサポートしているように見えるアドレス モードはありません。理想的には、次のようなアドレッシング モードが必要です。

ADD EAX,r8

また

ADD r32,r8

また

ADD r/m32,r8

しかしADD、これらのモードはありません。ECX他の場所で使用する他のジャンクが含まれているためマスクできず、他のすべてのレジスタを使い果たしたため、メモリアクセスを使用するしかないようです。この問題を解決する方法はありますか?

キャリーがないため、次のようなモードは使用できないことに注意してくださいr/m8,r8

4

6 に答える 6

2

レジスタをこぼすと、分岐を避けることができます。例えば、

subl $4, %esp

次の命令シーケンスを使用します。

movl %eax, (%esp)
...
movzbl %ch, %eax
...
addl (%esp), %eax

最後にスタックポインタを復元します。

addl $4, %esp

問題がある場合、このブロック内のコードをデバッグしようとすると、大混乱を招く可能性があります。


または、Doug Currie の提案に従ってください。

addb %ch, %al
jnc  done
addl 0x100, %eax
done:
于 2013-04-03T18:50:12.417 に答える
1

ダグの答えを言い換える(インテルの構文で):

  add al, ch
  jnc no_carry
  add eax, 100h
no_carry:
于 2013-04-03T21:06:44.563 に答える
1

eaxの場合は簡単です:

add al,ch
adc ah,0
rorx eax,16
adc ax,0
rorx eax,16

最初の命令では下位部分を追加してキャリー フラグを保持し、2 番目の命令ではレジスタの上位部分にキャリー フラグを追加します。また、ソースの内容も保持されます。ただし、レジスタのストールに注意し、コードを他の命令と組み合わせて回避してください。
追加した:

add al,ch
adc ah,0
bswap eax
xchg al,ah
adc ax
xchg al,ah
bswap eax
于 2014-10-18T11:33:58.250 に答える
0

32 ビット値を追加して、24 msb:s の追加を元に戻すこともできます。

 add eax, ecx
 xor cl,cl           // also `and ecx, 0xffffff00` is possible
 sub eax, ecx

これは付加価値を自然に破壊しますが、がらくたは保存します。(そして質問を読み直すと、実際にはコードブロックを で囲む必要がありxchg cl,ch、これによりソリューションがタスクに最適ではなくなります。)

于 2013-04-03T20:25:31.040 に答える