2

したがって、2 つの unsigned int を追加したい場合は、単純に次のように記述します。

dat1 db ff
dat2 db ff
res dw ?

そしてコードセグメントで:

mov ax, dat1
add ax, dat2
mov dl,0
adc dl,0 ;initialize the contents of dl and use it to store the carry flag
mov byte ptr res, ax
mov byte ptr res+1, dl

しかし、2 つの SIGNED 整数を追加したい場合、コードはどのようになりますか? どうにかしてサインフラグにアクセスできますか?

4

2 に答える 2

3

最初のエラー:

  • 8 ビットのみを割り当てる変数から 16 ビットを読み取ります。
  • アドレス res+1 に書き込むのも意味がありません (しかし res+2 に)。
  • 書き込もうとしてもmov byte ptr addr, ax失敗するはずです
    • する必要がありますmov word ptr res, ax

最初の質問への答えは次のとおりです。特別なことは何もありません。
add ax, bx署名されているかどうかは気にしません。面白いのは、ステータス レジスタを検査するときです。キャリー フラグサイン フラグオーバーフロー フラグがあります。(および 25 以上の無関係なフラグ)。補足として、同じ符号の加数に対してCarry_flag != sign_flag の場合、オーバーフロー フラグが設定されます。これは、2 つの負の数の加算/減算を正と解釈したり、2 つの正の数の加算を負と解釈したりできることを意味します。符号が異なる加数 (3) + (-2) の場合、オーバーフローは発生しません。

符号フラグは、比較と分岐によってアクセスできます。

add ax,bx  
jns process_unsigned   // or
js process_signed  

または、レジスタの符号ビットを別の場所に転送することに関心がある場合は、次のことができます
- mov cl, 16; sar ax, cl; // 符号ビットをワード ax または
- add ax, ax(または shl ax,1) // 符号ビットを AX の「左」側からシフトアウトしてキャリービット

さらに、pushf フラグpop axを汎用レジスターにステータスし、個々のビットを検査することができます。

于 2012-11-21T14:41:16.550 に答える
1

サンプルコードのバグを無視します(Akiの回答を参照)...

24 ビットの数値のペアを追加しようとしている場合。mov dl,0この数値の符号ビットは、(命令で) DL に移動する 0 のビット 7 にあるため、最初の 24 ビット数値は正です。2 番目の 24 ビット数も正です。これは、その符号ビットが (adc dl,0命令で) DL に追加する 0 のビット 7 にあるためです。

この場合、加算の結果は正になり (2 つの正の数を加算すると正の結果が得られます)、CPU の符号フラグは、24 ビットの数値を加算した結果が正であったことを正しく示します。CPU のキャリー フラグとオーバーフロー フラグも正しくなります (両方ともクリアされます)。jsそのため、 、 、 などのjg命令を使用して通常どおりテストできますjo(それらがすべて明確であり、条件分岐が削除されるか、 に変換される可能性があることはわかっていますがjmp)。ただし、CPU のパリティ フラグとゼロ フラグが間違っている可能性があります (たとえば、ゼロ フラグは上位 8 ビットがすべてゼロである場合にのみ表示され、24 ビット全体がすべてゼロであるかどうかは表示されません)。

ただし、符号付きの 16 ビットの数値を追加している (そして 24 ビットの結果を得ようとしている) と思っていたら、それは間違っているので、間違った結果が得られます。符号付きの 16 ビット数値を加算して 24 ビットの結果を得るには、16 ビット数値を「符号拡張」して 24 ビットにする必要がありますが、それらの数値を「ゼロ拡張」する必要はありません。たとえば、16 ビット (負) の数値 0xCDEF は、24 ビット (正) の数値 0x00CDEF ではなく、24 ビット (負) の数値 0xFFCDEF になる必要があります。

もう 1 つの方法は、通常のように 16 ビットの数値を加算し、その結果を 24 ビットに符号拡張することです。これは、16 ビットの加算がオーバーフローしない場合にのみ機能し、加算がオーバーフローしない場合は、最初から 24 ビットの結果は必要ありません。

于 2012-11-21T15:11:53.860 に答える