2 つの数値のどちらが大きいかを判断するためのアセンブラー構文は何ですか?
その下位レベル (マシン コード) は何ですか? もっと下げることはできますか?ビット レベルになると、何が起こるでしょうか。0 と 1 でどのように表されますか?
2 つの数値のどちらが大きいかを判断するためのアセンブラー構文は何ですか?
その下位レベル (マシン コード) は何ですか? もっと下げることはできますか?ビット レベルになると、何が起こるでしょうか。0 と 1 でどのように表されますか?
最初に CMP (比較) 命令が呼び出され、次に次のいずれかが呼び出されます。
jle - 以下の場合に行に
ジャンプ jge - 以上の場合に行にジャンプ
最も低いアセンブラは、ビットではなくバイトで動作します(とにかく直接)。ビットロジックについて知りたい場合は、回路設計を見る必要があります。
アセンブラごとに異なります。ほとんどのマシンは、R1 や EAX (Intel x86) などの記号名を持つレジスタを提供し、比較のために「CMP」などの命令名を持ちます。また、比較命令の場合は、別のオペランド、場合によってはレジスター、場合によってはリテラルが必要です。多くの場合、アセンブラーは命令の右側にコメントを入れることができます。
命令行は次のようになります。
<opcode> <register> <operand> ; comment
アセンブラは多少異なる場合があります。
Microsoft X86 アセンブラーの場合、次のように記述できます。
CMP EAX、23 ; レジスタ EAX を定数 23 と比較します
また
CMP EAX、XYZ ; レジスタ EAX を XYZ という名前のメモリ位置の内容と比較する
多くの場合、オペランドフィールドに複雑な「式」を記述して、命令が能力を持っている場合、さまざまな方法でメモリをアドレス指定できるようにすることができます。しかし、これはあなたの質問に答えていると思います。
(最近のほとんどのシステムでの) 基本的な手法は、2 つの数値を減算し、結果の符号ビットをチェックすることです。つまり、結果がゼロより大きい/等しい/小さいかどうかを確認します。アセンブリ コードでは、結果を直接 (レジスタに) 取得する代わりに、通常は状態に応じて分岐するだけです。
; Compare r1 and r2
CMP $r1, $r2
JLT lessthan
greater_or_equal:
; print "r1 >= r2" somehow
JMP l1
lessthan:
; print "r1 < r2" somehow
l1:
これは、話しているプロセッサに完全に依存しますが、次の形式になる傾向があります。
cmp r1, r2
ble label7
つまり、関連するフラグを設定するための比較命令と、それらのフラグに応じた条件分岐が続きます。
これは通常、プログラミングに必要な最低値です。アセンブラーを作成している場合は機械語を知っているだけでよく、プロセッサを作成している場合はマイクロコードや回路設計を知っているだけで済みます。
すでに述べたように、通常、比較は減算によって行われます。
たとえば、X86 アセンブリ/制御フロー。
ハードウェア レベルでは、加算器など、計算を行うための特別なデジタル回路があります。