仮想マシンとそのためのCコンパイラを作成しています。ただし、ほとんどの命令セットにはIMULとIDIVがありますが、ISUBとIADDはありません。subは通常署名されていないsubなので、x86のようなことをどのように行うことができますか
MOV EAX,1
MOV EDX,3
SUB EAX,EDX,EAX
そして-2を取得しますか?
仮想マシンとそのためのCコンパイラを作成しています。ただし、ほとんどの命令セットにはIMULとIDIVがありますが、ISUBとIADDはありません。subは通常署名されていないsubなので、x86のようなことをどのように行うことができますか
MOV EAX,1
MOV EDX,3
SUB EAX,EDX,EAX
そして-2を取得しますか?
引数が符号付きであるか符号なしであるかに関係なく、減算と加算は同じ結果をもたらすため、それぞれに 1 つの命令しかありません。
符号付き加算は常に、符号なし加算と同じビット パターンを出力として生成します。それらの解釈のみが異なります。したがって、2 つのケースに対して個別の命令を用意する必要はありません。引き算も同じです。
一般的な ADD および SUB 命令は、条件フラグの 2 つのグループを設定するため、符号なし比較の場合は ja/jb、符号付き比較の場合は jg/jl を使用して、SUB ベースの比較の結果を後で確認できます。
(より正確には、2^wordlen を法とする符号なし加算/減算を行う命令が既にある場合、それらが生成するビット パターンは、真の結果が表現可能な 2 の補数の符号付き加算/減算ごとに正しくなります。数学的には、符号なし整数と2 の補数の符号付き整数は、2^語長を法とする剰余クラスの正準表現の単なる異なる選択です)。