PERINTAH-PERINTAH DASAR (UMUM) Data movement instruction Pada setiap program kita akan menghadapi pemindahan data antara memory dan register CPU pemindahan tersebut bisa dari memory ke beberapa register, dari register ke register, dari sebuah register ke stack, atau mentransmisikan data dari register ke port device eksternal, dan kebalikannya. Pemindahan data tersebut memiliki batasan yaitu: •
tidak dapat memindahan data dari lokasi memory ke lokasi memory lain secara langsung
•
tidak dapat memindahkan data langsung ke sebuah segment register, tapi harus melalui register CPU dulu.
--Perintah untuk men-copy data sebesar 1 byte adalah dengan MOV yang syntaksnya memiliki bentuk MOV destination,source Fungsi: untuk memindahkan (meng-copy) data dari source ke destination Ada
beberapa
kemungkinan
pemindahan
ini
berdasarkan
destination-nya: * Destination: memory.
Source: accumulator
* Destination: accumulator.
Source: memory
* Destination: memory/register.
Source: segment register
* Destination: register.
Source: register
* Destination: register.
Source: memory
* Destination: memory.
Source: register
* Destination: register.
Source: immediate data
* Destination: memory.
Source: immediate data
source
dan
Contoh: MOV AX,0006h ; menyimpan nilai 0006h ke alamat register AX MOV BX,AX Dalam
asembler
; memindahkan data/nilai di register AX ke register BX
untuk
mikroprosesor
x86
telah
dimungkinkan
untuk
memindahkan data block dalam bytes atau word. Untuk memindahkan group dalam n byte digunakan perintah MOVSB sedangkan untuk pemindahan n word untuk pemindahan n word data digunakan perintah MOVSW. Kedua perintah ini mengambil sebuah group nilai dari alamat DS:DI dan memindahkannya ke alamat ES:DI. Perintah MOVS atau MOVSB atau MOVSW, memiliki sintaks: MOVS ;tanpa parameter Fungsi: memindahkan ggroup data dari source address yang berada di register SI ke destination address di register DI Contoh: MOV SI, OFFSET VAR1 MOV DI, OFFSET VAR2 MOVS pada perintah tersebut pertama didefinisikan nilai dari SI dan Di berturut-turut yaitu VAR1 dan VAR2 setelah perintah MOVS maka nilai VAR1 akan di-copy ke VAR2
Untuk pemindahan data ke stack digunakan perintah PUSH, dan untuk mengambil data dari stack digunakan perintah POP. Ingat: pada stack data yang pertama kita simpan adalah data yang akan terakhir kita ambil. Contoh pengguan perintah PUSH dan POP : PUSH AX PUSH BX PUSH CX POP CX POP BX POP AX Pada mikroprosesor x86 untuk komunikasi dengan device eksternal dapat digunakan peintah OUT. Untuk mengirim data ke port dan IN untuk membaca data dari suatu port. Contoh: OUT DX, AX
; ax berisi informasi yang akan dicopy ke port dx
IN AX, DX
; dx berisi informasi yang akan disimpan di register ax
LEA LDS LES LODS
STOS CMPS Arithmeetics and logic instructions: ADD ADC SUB DEC INC MUL DIV IDIV IMUL CMP TEST beberapa perintah untuk operasi logika adalah sebagai berikut: Or AND XOR NOT NEG ROL ROR SHL
SHR Program Control Instructions: Instruksi yang sering digunakan untuk pengontrol program adalah Conditional Jump. Ada dua bagian jenis JUMP yaitu unsigned (yang tidak mepedulikan tanda positif atau negatif) dan signed conditional jump. Ada juga instruksi yang jump yang tidak mengecek tanda dari nilai. Perhatikan tabel perintah jump dibawah ini:B Unsigned conditional jumps JA
Jump if above
JAE
Jump if above or equal
JB
Jump if below
JBE
Jump is below or equal
JNA
Jump if not above (same as JBE)
JNAE
Jump if not above or equal (same as JB)
JNB
Jump if not below (Same as JBE)
JNBE
Jump if not below or equal (same as JA) Signed conditional jumps
JG
Jump if greater
JGE
Jump if greater of equal
JL
Jump if less
JLE
Jump if less or equal
JNG
Jump if not greater (same as JLE)
JNGE
Jump if not greater or equal (same as JGE)
JNL
Jump if not lower (same as JGE)
JNLE
Jump if not lower or equal (same as JG)
Conditional jump (dont matter if it's signed or not) JZ
Jump if zero
JE
Jump if equal (same as JZ)
JNZ
Jump if not zero
JNE
Jump is equal (same as JNZ)
JZ atau JE pada dasarnya instruksi yang berdasarkan pengecekkan pada Zero Flag. Ini biasanya penting bagi crakerz untuk melewati suatu subrutin dengan cara mengeset langsung zero flag-nya. Perintah jump yang sering digunakan adalah JZ, JNZ, JA dan JB. JMP JA JB JNA JNB JE JZ LOOP CALL RET INT IRET
* Pencabangan program *
Cara pencabangan program (conditional brach) adalah menggunakan instruksi yang mengecek flag-flag tertentu (dalam BASIC: if flag=1 then go to ...). Setiap akhir instruksi, flag-flag di-set/reset sesuai dengan hasilnya. Perhatikan contoh berikut: MOV
AL, BL
; AL=BL
CMP
AL,07
; bandingkan AL dengan 07, jika sama: set zero di set, ; jika AL < 07 flag borrow di set
JZ
(suatu alamat) ; check flag: apakah flag zero set? jika ya loncat ke
alamat ... Untuk mengecek bit-bit tertentu dapt digunakan TEST Untuk mengecek nol atau tidaknya suatu register dapat digunakan 'CMP AL, 0' atau 'OR AL, AL' (instruksi ini lebih sering digunakan karena dalam byte yang lebih kecil).