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