Perakitan - Kondisi

Eksekusi bersyarat dalam bahasa assembly dilakukan dengan beberapa instruksi perulangan dan percabangan. Instruksi ini dapat mengubah aliran kendali dalam suatu program. Eksekusi bersyarat diamati dalam dua skenario -

Sr.No. Instruksi Bersyarat
1

Unconditional jump

Ini dilakukan dengan instruksi JMP. Eksekusi bersyarat sering melibatkan transfer kendali ke alamat instruksi yang tidak mengikuti instruksi yang sedang dieksekusi. Pengalihan kendali mungkin maju, untuk mengeksekusi serangkaian instruksi baru atau mundur, untuk menjalankan kembali langkah yang sama.

2

Conditional jump

Ini dilakukan oleh sekumpulan instruksi lompat j <condition> tergantung pada kondisinya. Instruksi bersyarat mentransfer kontrol dengan memutus aliran sekuensial dan melakukannya dengan mengubah nilai offset di IP.

Mari kita bahas instruksi CMP sebelum membahas instruksi bersyarat.

Instruksi CMP

Instruksi CMP membandingkan dua operan. Ini umumnya digunakan dalam eksekusi bersyarat. Instruksi ini pada dasarnya mengurangi satu operan dari yang lain untuk membandingkan apakah operannya sama atau tidak. Itu tidak mengganggu tujuan atau operan sumber. Ini digunakan bersama dengan instruksi lompat bersyarat untuk pengambilan keputusan.

Sintaksis

CMP destination, source

CMP membandingkan dua bidang data numerik. Operand tujuan dapat berupa register atau memori. Operand sumber dapat berupa data, register, atau memori konstan (langsung).

Contoh

CMP DX,	00  ; Compare the DX value with zero
JE  L7      ; If yes, then jump to label L7
.
.
L7: ...

CMP sering digunakan untuk membandingkan apakah nilai pencacah telah mencapai berapa kali perulangan perlu dijalankan. Pertimbangkan kondisi khas berikut -

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

Lompat Tanpa Syarat

Seperti disebutkan sebelumnya, ini dilakukan oleh instruksi JMP. Eksekusi bersyarat sering melibatkan transfer kendali ke alamat instruksi yang tidak mengikuti instruksi yang sedang dieksekusi. Pengalihan kendali mungkin maju, untuk mengeksekusi serangkaian instruksi baru atau mundur, untuk menjalankan kembali langkah yang sama.

Sintaksis

Instruksi JMP memberikan nama label dimana aliran kendali ditransfer segera. Sintaks dari instruksi JMP adalah -

JMP	label

Contoh

Potongan kode berikut menggambarkan instruksi 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

Lompatan Bersyarat

Jika beberapa kondisi tertentu terpenuhi dalam lompatan bersyarat, aliran kontrol ditransfer ke instruksi target. Ada banyak instruksi lompat bersyarat tergantung pada kondisi dan datanya.

Berikut adalah instruksi lompat bersyarat yang digunakan pada data bertanda yang digunakan untuk operasi aritmatika -

Petunjuk Deskripsi Bendera diuji
JE / JZ Jump Equal atau Jump Zero ZF
JNE / JNZ Lompat tidak Sama atau Lompat Bukan Nol ZF
JG / JNLE Lompat Lebih Besar atau Lompat Tidak Kurang / Sama DARI, SF, ZF
JGE / JNL Lompat Lebih Besar / Setara atau Lompat Bukan Lebih Sedikit DARI, SF
JL / JNGE Lompat Lebih Sedikit atau Lompat Tidak Lebih Besar / Sama DARI, SF
JLE / JNG Lompat Lebih Sedikit / Sama dengan atau Lompat Tidak Lebih Besar DARI, SF, ZF

Berikut ini adalah instruksi lompat bersyarat yang digunakan pada data unsigned yang digunakan untuk operasi logis -

Petunjuk Deskripsi Bendera diuji
JE / JZ Jump Equal atau Jump Zero ZF
JNE / JNZ Lompat tidak Sama atau Lompat Bukan Nol ZF
JA / JNBE Lompat Di Atas atau Lompat Tidak Di Bawah / Setara CF, ZF
JAE / JNB Lompat Di Atas / Sama dengan atau Lompat Tidak Di Bawah CF.
JB / JNAE Lompat di Bawah atau Lompat Tidak Di Atas / Sama CF.
JBE / JNA Lompat Di Bawah / Sama dengan atau Lompat Tidak Di Atas AF, CF

Instruksi lompat bersyarat berikut memiliki kegunaan khusus dan memeriksa nilai bendera -

Petunjuk Deskripsi Bendera diuji
JXCZ Lompat jika CX adalah Nol tidak ada
JC Lompat Jika Membawa CF.
JNC Lompat Jika Tidak Membawa CF.
JO Langsung Jika Meluap DARI
JNO Lompat Jika Tidak Ada Luapan DARI
JP / JPE Jump Parity atau Jump Parity Even PF
JNP / JPO Jump No Parity atau Jump Parity Odd PF
JS Jump Sign (nilai negatif) SF
JNS Jump No Sign (nilai positif) SF

Sintaks untuk set instruksi J <condition> -

Contoh,

CMP	AL, BL
JE	EQUAL
CMP	AL, BH
JE	EQUAL
CMP	AL, CL
JE	EQUAL
NON_EQUAL: ...
EQUAL: ...

Contoh

Program berikut menampilkan tiga variabel terbesar. Variabel adalah variabel dua digit. Ketiga variabel num1, num2 dan num3 masing-masing memiliki nilai 47, 22 dan 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

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

The largest digit is: 
47