Assembly-programming-assembly-conditions

提供:Dev Guides
移動先:案内検索

組み立て-条件

アセンブリ言語での条件付き実行は、複数のループおよび分岐命令によって実現されます。 これらの命令は、プログラムの制御の流れを変えることができます。 条件付き実行は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