21

2 つの数値のどちらが大きいかを判断するためのアセンブラー構文は何ですか?

その下位レベル (マシン コード) は何ですか? もっと下げることはできますか?ビット レベルになると、何が起こるでしょうか。0 と 1 でどのように表されますか?

4

8 に答える 8

12

最初に CMP (比較) 命令が呼び出され、次に次のいずれかが呼び出されます。

jle - 以下の場合に行に
ジャンプ jge - 以上の場合に行にジャンプ

最も低いアセンブラは、ビットではなくバイトで動作します(とにかく直接)。ビットロジックについて知りたい場合は、回路設計を見る必要があります。

于 2009-07-14T04:18:33.953 に答える
9

アセンブラごとに異なります。ほとんどのマシンは、R1 や EAX (Intel x86) などの記号名を持つレジスタを提供し、比較のために「CMP」などの命令名を持ちます。また、比較命令の場合は、別のオペランド、場合によってはレジスター、場合によってはリテラルが必要です。多くの場合、アセンブラーは命令の右側にコメントを入れることができます。

命令行は次のようになります。

<opcode>   <register> <operand>   ; comment

アセンブラは多少異なる場合があります。

Microsoft X86 アセンブラーの場合、次のように記述できます。

CMP EAX、23 ; レジスタ EAX を定数 23 と比較します

また

CMP EAX、XYZ ; レジスタ EAX を XYZ という名前のメモリ位置の内容と比較する

多くの場合、オペランドフィールドに複雑な「式」を記述して、命令が能力を持っている場合、さまざまな方法でメモリをアドレス指定できるようにすることができます。しかし、これはあなたの質問に答えていると思います。

于 2009-07-14T04:20:21.797 に答える
7

(最近のほとんどのシステムでの) 基本的な手法は、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:
于 2009-07-14T04:19:28.133 に答える
4

これは、話しているプロセッサに完全に依存しますが、次の形式になる傾向があります。

cmp r1, r2
ble label7

つまり、関連するフラグを設定するための比較命令と、それらのフラグに応じた条件分岐が続きます。

これは通常、プログラミングに必要な最低値です。アセンブラーを作成している場合は機械語を知っているだけでよく、プロセッサを作成している場合はマイクロコードや回路設計を知っているだけで済みます。

于 2009-07-14T04:19:32.440 に答える
1

2 つの数値を比較します。はい「Y」に等しい場合、等しくない場合は画面に「いいえ」「N」を出力します。emu8086を使用しています。SUB または CMP コマンドを使用できます。

MOV AX,5h
MOV BX,5h
SUB AX,BX 
JZ EQUALS
JNZ NOTEQUALS

EQUALS:
MOV CL,'Y'
JMP PRINT

NOTEQUALS:
MOV CL,'N'

PRINT:
MOV AH,2
MOV DL,CL
INT 21H

RET

ここに画像の説明を入力

于 2016-11-30T20:30:38.930 に答える
1

すでに述べたように、通常、比較は減算によって行われます。
たとえば、X86 アセンブリ/制御フロー

ハードウェア レベルでは、加算器など、計算を行うための特別なデジタル回路があります。

于 2009-07-14T04:41:49.930 に答える