0

これは私が最近遭遇した宿題の質問です.8 ビットの数値 A を引数として受け取り、A の 2 の補数に対応する 8 ビットの値を返す twoscom というサブルーチンを作成してください。:/ 8F ベース 16 でテスト

4

1 に答える 1

0

ほとんどのプロセッサの数値は既に 2 の補数としてエンコードされており、それらを「変換」する必要はありません。そして一般的に、「2 の補数」は人間による数字の解釈です。

もう 1 つの対処法は、与えられた値の負の数を計算したい場合 (実際には 2 の補数です)、つまり y = -x が必要な場合です。

多くのプラットフォームでは、このような簡単な操作は特別な命令によって実装されており、関数を使用する必要はありません。

; x86
    neg al

neg命令が利用できないCPU では、2 つの命令で非常に簡単に実装できます。

; pseudo cpu
    not reg8
    inc reg8

; or 
    xor reg8, 0ffh
    add reg8, 1

; or any other combination available

この操作がサブルーチンとして実装するのに適していないのはなぜですか? このようなサブルーチンは次のようになります。

; al contains the argument and return the result.
twoscom:
      neg al
      ret

次に、それを使用して cl の 2 の補数を計算する場合は、次のことを行う必要があります。

      mov  al, cl
      call twoscom

この方法では、16 ビット プログラムでは 8 バイト長、32 ビット プログラムでは 10 バイト長の 4 つの命令を実行します。さらに悪いことに、単一の命令ではなく、メモリの読み書き (call/ret のスタック操作) に影響を与えます。

      neg cl    ; always 2 bytes and memory access.

2 の補数は非常に基本的な操作です。2 つの数を加算するサブルーチンを作成しませんね。

于 2013-08-03T08:28:39.717 に答える