2009-07-14 9 views

答えて

5

アセンブラによって異なります。 ほとんどのマシンは、R1、EAX(Intel x86)のようなシンボル名 を持つレジスタを提供しており、比較のために "CMP"のような命令を持つ という名前のコマンドを持っています。そして、比較のために 命令を実行するには、別のオペランドが必要です。時には というレジスタがあります。多くの場合、アセンブラ は命令の右側にコメントを許可します。あなたのアセンブラは多少異なる場合があり

<opcode> <register> <operand> ; comment 

:よう

命令ラインが見えます。マイクロソフトX86アセンブラについては

、あなたが書くことができます。

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

または

CMP EAX、XYZ;さまざまな方法で メモリに対処するために、多くの場合、1は、オペランドフィールド、それは能力を持っている場合は、命令を有効 に複雑な「式」を書くことができ

XYZ

という名前のメモリ位置の内容をEAXを比較レジスタ。しかし、私はこれがあなたの質問に答えると思う。

+0

比較の後、アセンブラが一般的に何をしますか?値を返すか、それは使用可能か、特定のレジスタに値を格納しますか? –

+2

CMP命令が実行されると、ほとんどのマシンでは結果が "less"、 "greater"、 "equal"となり、特殊な "条件"レジスタに格納されます。プログラマは通常、条件レジスタを検査し、条件が真であればプログラムフローをjmp命令のタルベットに変更させる "JMP on condition"(例えば "JE"または "jmp equal")をCMP命令に書込みます。アセンブラは何もしなくてはなりません。指示書を次々と書き込むのはプログラムの責任です。アセンブラは、各命令ソース行をバイナリに変換するだけです。 –

+0

ああ大丈夫です!説明ありがとう。それは、私が思うより簡単にしたいことを、 –

4

まずCMP(比較)命令は、以下のいずれか、次いで呼ばれる:

JLE - 行にジャンプする場合以下
JGEに等しい - 行にジャンプする場合以上

に等しいです

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

+0

はジャンプを行う前に、CMPレジスタ1、レジスタ2を行うことを忘れてはいけません。 MOV AX、1; MOVE BX、2; CMP AX、BX; JLEどこか.. –

4

基本的な手法(最新のシステムでは)は、2つの数値を減算し、結果の符号ビットをチェックすることです。つまり、結果が0より大きい/等しい/小さいかどうかを確認することです。アセンブリコードではなく、直接結果を取得(レジスタに)状態に応じて、あなたは通常、ちょうどブランチ:

; Compare r1 and r2 
    CMP $r1, $r2 
    JLT lessthan 
greater_or_equal: 
    ; print "r1 >= r2" somehow 
    JMP l1 
lessthan: 
    ; print "r1 < r2" somehow 
l1: 
+0

これらの 'JLT'と' JMP'演算子の間にパフォーマンスの違いはありますか? – rejnev

4

これは、あなたが話しているが、それはの傾向にあるプロセッサに完全に依存し形式:

cmp r1, r2 
ble label7 

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

これは一般に、プログラミングのために必要な程度に低くなっています。アセンブラを書く場合は、機械語を知る必要があります。プロセッサを構築する場合は、マイクロコードや回路設計だけを知る必要があります。

1

すでに言及したように、通常はです。比較は、減算によって行われます。
たとえば、X86 Assembly/Control Flowです。

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

3

(x86のアセンブリ)、それは次のようになります。この場合は

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

それは2つの8ビット、我々は一時的に高いに格納番号とレジスタBの下部を比較また、あなたは可能性がありますjbe(BL < = BHの場合)またはjge/jae(BL> = BHの場合)を使用することも検討してください。

うまくいけば、誰かがそれが役に立つ見つけた:)

+0

にしてくれました。おかげで、まっすぐに、より大きい、より少ない、同じくより大きい、より小さい、等しく等しいかより小さいかどうかをあなたのコメントで見てください。 –

-2
input password program 
.modle small 
.stack 100h 
.data 
s pasword db 34 
input pasword db "enter pasword","$" 
valid db ? 
invalid db? 
.code 
mov ax, @ data 
mov db, ax 
mov ah,09h 
mov dx, offest s pasword 
int 21h 
mov ah, 01h 
cmp al, s pasword 
je v 
jmp nv 
v: 
mov ah, 09h 
mov dx, offset valid 
int 21h 
nv: 
mov ah, 09h 
mov dx, offset invalid 
int 21h 
mov ah, 04ch 
int 21 
end 
+1

これは本当にこの特定の質問に答えません。 – Unihedron

0

は、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