web-dev-qa-db-ja.com

2つの数値を比較するアセンブリ

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

その下位レベル(マシンコード)は何ですか?さらに低くできますか?ビットレベルに到達すると、どうなりますか? 0と1でどのように表されますか?

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

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

<opcode>   <register> <operand>   ; comment

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

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

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

または

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

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

7
Ira Baxter

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

jle-以下の場合は行にジャンプ
jge-以上の場合、行にジャンプします

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

6
Spencer Ruport

(ほとんどの最新システムでの)基本的な手法は、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:
6
Edmund

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

cmp r1, r2
ble label7

言い換えると、関連するフラグを設定する比較命令の後に、それらのフラグに応じて条件分岐が続きます。

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

4
paxdiablo

TASM(x86アセンブリ)では、次のようになります。

cmp BL, BH
je EQUAL       ; BL = BH
jg GREATER     ; BL > BH
jmp LESS       ; BL < BH

この場合、レジスタBの上位部分と下位部分に一時的に格納する2つの8ビット数値を比較します。または、jbe(BL <= BHの場合)またはjgeの使用も検討できます。/jae(BL> = BHの場合)。

うまくいけば誰かがそれが役に立ったと思う:)

3
LihO

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

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

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

enter image description here

0
mesutpiskin