Materi ke-7
BAB XIII
BANDINGKAN DAN LOMPAT
Pada tabel 13.1. dapat anda lihat bahwa terdapat dua operasi yang berbeda,
yaitu operasi bilangan bertanda dan tidak bertanda. Bilangan bertanda adalah
bilangan yang akan membedakan bilangan negatif dan positif(Mis. 37 dan -37).
Sedangkan bilangan tidak bertanda adalah bilangan yang tidak akan
membedakan positif dan negatif, jadi angka -1 untuk operasi bilangan bertanda
akan dianggap FFh pada bilangan tidak bertanda. Lebih jauh mengenai bilangan
bertanda dan tidak ini bisa anda lihat pada bab1.
;/=========================================\;
; Program : CMPJ.ASM ;
; Author : S’to ;
; Fungsi : Mendemokan perintah lompat ;
; yang mengikuti perintah CMP ;
; ;
;\=========================================/;
.MODEL SMALL
.CODE
ORG 100h
Bila dilihat pada daftar 13.2., perintah untuk lompat sebenarnya sangat mudah
untuk digunakan karena setiap huruf melambangkan suatu kata. Dengan
demikian kita tidak perlu untuk mengingat-ingat semua perintah diatas, kita
hanya harus ingat bahwa huruf J=Jump, E=Equal, N=Not, S=Sign, Z=Zero,
P=Parity, O=Overflow, C=Carry, G=Greater Than, A=Above, L=Less dan
B=Below.
Ingatlah:
Huruf G dan L yang artinya Greater Than dan Less digunakan khusus untuk
operasi bilangan bertanda. Sedangkan Huruf A dan B yang artinya Above dan
Below digunakan khusus untuk operasi bilangan tidak bertanda.
;/================================================
\;
; Program : JMPL.ASM ;
; Author : S’to ;
; Fungsi : Mencetak kalimat secara perkarakter ;
; sampai ditemui karakter '*' ;
; ;
;\================================================
/;
.MODEL SMALL
.CODE
ORG 100h
;/=========================================\;
; Program : NSTACK.ASM ;
; Author : S’to ;
; Fungsi : Mencetak kalimat 2 kali ;
; dengan operasi yang mirip ;
; dengan stack ;
;\=========================================/;
.MODEL SMALL
.CODE
ORG 100h
MOV AH,09
INT 21h
LEA DX,Ganti
INT 21h
MOV DX,Stacks
INT 21h
Bila program 14.1. dan 14.2. dijalankan, maka pada layar akan ditampilkan:
LANG LING LUNG
LANG LING LUNG
Perhatikanlah, perintah:
LEA DX,Kal
MOV Stacks,DX
Pada baris pertama kita mendapatkan alamat efektif dari "Kal" dan disimpan
pada DX. Kemudian kita simpan nilai DX yang menunjuk pada offset "Kal" ini
pada variabel Stacks. Sehingga pada saat kita hendak mencetak 'Kal' untuk
kedua kalinya, kita tinggal mengambil nilai dari variabel Stacks dengan perintah
"MOV DX,Stacks".
Kini akan kita lihat bagaimana menggunakan stack yang sebenarnya untuk
tugas ini.
;/=========================================\;
; Program : STACK.ASM ;
; Author : S’to ;
; Fungsi : Mencetak kalimat 2 kali ;
; dengan operasi stack yang ;
; sebenarnya ;
;\=========================================/;
.MODEL SMALL
.CODE
ORG 100h
MOV AH,09
INT 21h
LEA DX,Ganti
INT 21h
POP DX
INT 21h
MOV CX,10
i:
PUSH CX
MOV CX,5
j:
PUSH CX
MOV CX,3
s:
LOOP s
POP CX
LOOP j
POP CX
LOOP i
Dari gambar 14.2. dapat anda lihat bahwa nilai yang terakhir dimasukkan(99)
akan terletak pada puncak tabung stack.
Untuk mengambil keluar koin nilai pada tabung stack, digunakan perintah pop
dengan syntax:
POP Reg16Bit
Perintah POP akan mengambil koin nilai pada stack yang paling atas dan
dimasukkan pada Reg16Bit. Dari sini dapat anda lihat bahwa data yang terakhir
dimasukkan akan merupakan yang pertama dikeluarkan. Inilah sebabnya operasi
stack dinamankan LIFO(Last In First Out).
Sebagai contohnya, untuk mengambil nilai dari register AX, BX dan CX yang
disimpan pada stack harus dilakukan pada register CX dahulu barulah BX dan
AX, seperti:
POP CX ; Ambil nilai pada puncak stack, masukkan ke CX
POP BX ; Ambil nilai pada puncak stack, masukkan ke BX
POP AX ; Ambil nilai pada puncak stack, masukkan ke AX
Perhatikan:
Bila anda terbalik dalam mengambil nilai pada stack dengan POP AX kemudian
POP BX dan POP CX, maka nilai yang akan anda dapatkan pada register AX, BX
dan CX akan terbalik. Sehingga register AX akan bernilai 99 dan CX akan bernilai
12.
TRIK:
Seperti yang telah kita ketahui, data tidak bisa dicopykan antar segment atau
memory. Untuk mengcopykan data antar segment atau memory anda harus
menggunakan register general purpose sebagai perantaranya, seperti:
MOV AX,ES ; Untuk menyamakan register
MOV DS,AX ; ES dan DS
Dengan adanya stack, anda bisa menggunakannya sebagai perantara, sehingga
akan tampak seperti:
PUSH ES ; Untuk menyamakan register
POP DS ; ES dan DS
Perintah PUSHF dan POPF digunakan untuk menyelamatkan kondisi dari flag
terhadap perubahan. PUSHF dan POPF biasanya digunakan pada operasi yang
sangat mementingkan nilai pada flag ini, seperti pada operasi aritmatika.