Assembly-programming-assembly-conditions
組み立て-条件
アセンブリ言語での条件付き実行は、複数のループおよび分岐命令によって実現されます。 これらの命令は、プログラムの制御の流れを変えることができます。 条件付き実行は2つのシナリオで観察されます-
Sr.No. | Conditional Instructions |
---|---|
1 |
Unconditional jump これは、JMP命令によって実行されます。 条件付き実行では、現在実行中の命令の後に続かない命令のアドレスへの制御の転送が含まれることがよくあります。 制御の転送は、同じ手順を再実行するために、新しい命令セットを実行するために順方向、または逆方向に行われる場合があります。 |
2 |
Conditional jump これは、条件に応じて一連のジャンプ命令j <condition>によって実行されます。 条件付き命令は、シーケンシャルフローを中断することにより制御を転送し、IPのオフセット値を変更することにより制御を行います。 |
条件付き命令について説明する前に、CMP命令について説明します。
CMP命令
CMP命令は2つのオペランドを比較します。 通常、条件付き実行で使用されます。 この命令は、基本的に、オペランドが等しいかどうかを比較するために、一方のオペランドを他方から減算します。 宛先またはソースのオペランドを乱すことはありません。 意思決定のための条件付きジャンプ命令とともに使用されます。
構文
CMP destination, source
CMPは2つの数値データフィールドを比較します。 デスティネーションオペランドは、レジスタまたはメモリにあります。 ソースオペランドは、定数(イミディエート)データ、レジスタ、またはメモリです。
例
CMP DX, 00 ; Compare the DX value with zero
JE L7 ; If yes, then jump to label L7
.
.
L7: ...
CMPは、ループの実行が必要な回数にカウンター値が達したかどうかを比較するためによく使用されます。 次の典型的な条件を考慮してください-
INC EDX
CMP EDX, 10 ; Compares whether the counter has reached 10
JLE LP1 ; If it is less than or equal to 10, then jump to LP1
無条件ジャンプ
前述のように、これはJMP命令によって実行されます。 条件付き実行では、現在実行中の命令の後に続かない命令のアドレスへの制御の転送が含まれることがよくあります。 制御の転送は、同じ手順を再実行するために、新しい命令セットを実行するために順方向、または逆方向に行われる場合があります。
構文
JMP命令は、制御のフローがすぐに転送されるラベル名を提供します。 JMP命令の構文は-
JMP label
例
次のコードスニペットは、JMP命令を示しています-
MOV AX, 00 ; Initializing AX to 0
MOV BX, 00 ; Initializing BX to 0
MOV CX, 01 ; Initializing CX to 1
L20:
ADD AX, 01 ; Increment AX
ADD BX, AX ; Add AX to BX
SHL CX, 1 ; shift left CX, this in turn doubles the CX value
JMP L20 ; repeats the statements
条件付きジャンプ
条件付きジャンプで指定された条件が満たされると、制御フローはターゲット命令に転送されます。 条件とデータに応じて、多数の条件付きジャンプ命令があります。
以下は、算術演算に使用される符号付きデータで使用される条件付きジャンプ命令です-
Instruction | Description | Flags tested |
---|---|---|
JE/JZ | Jump Equal or Jump Zero | ZF |
JNE/JNZ | Jump not Equal or Jump Not Zero | ZF |
JG/JNLE | Jump Greater or Jump Not Less/Equal | OF, SF, ZF |
JGE/JNL | Jump Greater/Equal or Jump Not Less | OF, SF |
JL/JNGE | Jump Less or Jump Not Greater/Equal | OF, SF |
JLE/JNG | Jump Less/Equal or Jump Not Greater | OF, SF, ZF |
以下は、論理演算に使用される符号なしデータで使用される条件付きジャンプ命令です-
Instruction | Description | Flags tested |
---|---|---|
JE/JZ | Jump Equal or Jump Zero | ZF |
JNE/JNZ | Jump not Equal or Jump Not Zero | ZF |
JA/JNBE | Jump Above or Jump Not Below/Equal | CF, ZF |
JAE/JNB | Jump Above/Equal or Jump Not Below | CF |
JB/JNAE | Jump Below or Jump Not Above/Equal | CF |
JBE/JNA | Jump Below/Equal or Jump Not Above | AF, CF |
次の条件付きジャンプ命令には特別な用途があり、フラグの値を確認します-
Instruction | Description | Flags tested |
---|---|---|
JXCZ | Jump if CX is Zero | none |
JC | Jump If Carry | CF |
JNC | Jump If No Carry | CF |
JO | Jump If Overflow | OF |
JNO | Jump If No Overflow | OF |
JP/JPE | Jump Parity or Jump Parity Even | PF |
JNP/JPO | Jump No Parity or Jump Parity Odd | PF |
JS | Jump Sign (negative value) | SF |
JNS | Jump No Sign (positive value) | SF |
命令のJ <条件>セットの構文-
例、
CMP AL, BL
JE EQUAL
CMP AL, BH
JE EQUAL
CMP AL, CL
JE EQUAL
NON_EQUAL: ...
EQUAL: ...
例
次のプログラムは、3つの変数のうち最大のものを表示します。 変数は2桁の変数です。 3つの変数num1、num2、num3の値はそれぞれ47、22、31です-
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov ecx, [num1]
cmp ecx, [num2]
jg check_third_num
mov ecx, [num2]
check_third_num:
cmp ecx, [num3]
jg _exit
mov ecx, [num3]
_exit:
mov [largest], ecx
mov ecx,msg
mov edx, len
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov ecx,largest
mov edx, 2
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1
int 80h
section .data
msg db "The largest digit is: ", 0xA,0xD
len equ $- msg
num1 dd '47'
num2 dd '22'
num3 dd '31'
segment .bss
largest resb 2
上記のコードをコンパイルして実行すると、次の結果が生成されます-
The largest digit is:
47