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