contoh program lainnya
itu adalah perogram pemanggilan karakter yang diikuti oleh tanda bunyi beep pada setiap karakter yang telah tercetak. source kodenya sebagai berikut:
; nama EDDY YUDIANTO
; MODIFIKASI ...
; contoh program mencetak string dengan
; yang mengandung'$' disertai BELL
#MAKE_COM# ; membuat berkas COM
ORG 100h
JMP START
; Data:
msg DB '==EDDY YUDIANTO==',0
; simpan alamat label msg ke register DX:
START:
MOV AH, 2 ; fungsi mencetak karakter'
MOV BX, 0 ; tanda indeks data
ulang:
MOV DL, msg[BX] ; baca karakter simpan di DL
CMP DL, 0 ; apakah kode ASCII 0?
JZ selesai ; YA, selesai!
INT 21h ; TIDAK, cetak karakter!
CALL bunyi_bel ; panggil prosedur bunyi_bel
INC BX ; naikkan indeksnya
JMP ulang ; ulangi lagi
selesai:
RET ; kembali ke sistem operasi
bunyi_bel PROC
MOV DL, 7
MOV AH, 2
INT 21h
RET
bunyi_bel ENDP
END
; MODIFIKASI ...
; contoh program mencetak string dengan
; yang mengandung'$' disertai BELL
#MAKE_COM# ; membuat berkas COM
ORG 100h
JMP START
; Data:
msg DB '==EDDY YUDIANTO==',0
; simpan alamat label msg ke register DX:
START:
MOV AH, 2 ; fungsi mencetak karakter'
MOV BX, 0 ; tanda indeks data
ulang:
MOV DL, msg[BX] ; baca karakter simpan di DL
CMP DL, 0 ; apakah kode ASCII 0?
JZ selesai ; YA, selesai!
INT 21h ; TIDAK, cetak karakter!
CALL bunyi_bel ; panggil prosedur bunyi_bel
INC BX ; naikkan indeksnya
JMP ulang ; ulangi lagi
selesai:
RET ; kembali ke sistem operasi
bunyi_bel PROC
MOV DL, 7
MOV AH, 2
INT 21h
RET
bunyi_bel ENDP
END
Label:
download,
education,
Jaringan komputer,
kuliah elektronika
program jam analog
emu8086 merupakan program emulator untuk bahasa assembly yang mungkin sangat susah dipelajari, karena ini merupakan bahasa tingkat rendah yang dapat dimengerti oleh mesin, kali ini saya mencoba menshare contoh program dengan menggunakan emu8086, untuk source kodenya, seperti ini
data segment
col dw 320
row dw 240
x dw 320, 330, 340, 350, 360
dw 370, 378, 386, 394, 400
dw 406, 411, 415, 417, 419
dw 420, 419, 417, 415, 411
dw 406, 400, 394, 386, 378
dw 370, 360, 350, 340, 330
dw 320, 309, 299, 289, 279
dw 270, 261, 253, 245, 239
dw 233, 228, 224, 222, 220
dw 220, 220, 222, 224, 228
dw 233, 239, 245, 253, 261
dw 269, 279, 289, 299, 309
y dw 140, 140, 142, 144, 148
dw 153, 159, 165, 173, 181
dw 189, 199, 209, 219, 229
dw 240, 250, 260, 270, 280
dw 290, 298, 306, 314, 320
dw 326, 331, 335, 337, 339
dw 340, 339, 337, 335, 331
dw 326, 320, 314, 306, 298
dw 290, 280, 270, 260, 250
dw 240, 229, 219, 209, 199
dw 190, 181, 173, 165, 159
dw 153, 148, 144, 142, 140
mx dw 320, 329, 338, 347, 356
dw 365, 372, 380, 386, 392
dw 397, 402, 405, 408, 409
dw 410, 409, 408, 405, 402
dw 397, 392, 386, 380, 372
dw 365, 356, 347, 338, 329
dw 320, 310, 301, 292, 283
dw 275, 267, 259, 253, 247
dw 242, 237, 234, 231, 230
dw 230, 230, 231, 234, 237
dw 242, 247, 253, 259, 267
dw 274, 283, 292, 301, 310
my dw 150, 150, 151, 154, 157
dw 162, 167, 173, 179, 187
dw 194, 203, 212, 221, 230
dw 240, 249, 258, 267, 276
dw 285, 292, 300, 306, 312
dw 317, 322, 325, 328, 329
dw 330, 329, 328, 325, 322
dw 317, 312, 306, 300, 292
dw 285, 276, 267, 258, 249
dw 240, 230, 221, 212, 203
dw 195, 187, 179, 173, 167
dw 162, 157, 154, 151, 150
hx dw 320, 350, 371, 380, 371
dw 350, 320, 290, 268, 260
dw 268, 290
hy dw 180, 188, 209, 240, 270
dw 291, 300, 291, 270, 240
dw 210, 188
r dw ?
lcolor db ?
parac dw 4 dup(0)
data ends
;--------------------------------------------------------------------
code segment
main proc far
assume cs:code,ds:data,es:data
start: mov ax,data
mov ds,ax
mov es,ax
mv: mov ah,0
mov al,12h
int 10h
mov si,offset x
mov di,offset y
mov bl,60
init: mov ax,0c05h
mov bh,0
mov dx,[di]
mov cx,[si]
int 10h
inc si
inc si
inc di
inc di
dec bl
jne init
mov si,offset x
mov di,offset y
mov bl,12
init1: mov ax,0c03h
mov bh,0
mov dx,[di]
mov cx,[si]
int 10h
add si,10
add di,10
dec bl
jne init1
mov col,320
mov row,240
mov ah,2ch
int 21h
mov si,offset x
mov di,offset y
add dh,dh
mov al,dh
mov ah,00h
add si,ax
add di,ax
mov lcolor,0fh
call draw_line
mov ah,2ch
int 21h
mov si,offset mx
mov di,offset my
add cl,cl
mov al,cl
mov ah,00h
add si,ax
add di,ax
mov lcolor,0ah
call draw_line
mov ah,2ch
int 21h
mov si,offset hx
mov di,offset hy
mov al,ch
mov ah,00h
mov bl,12
div bl
add ah,ah
mov al,ah
mov ah,00h
add si,ax
add di,ax
mov lcolor,09h
call draw_line
mov ah,2ch
int 21h
cmp cl,59
jne con
cmp dh,55
jl con
call beep
call delay1
jmp last
con: mov ah,2ch
int 21h
cmp cl,0
jne con1
cmp dh,0
jne con1
call beep
call delay1
jmp last
con1:
call gensound
call delay
last: mov ah,0bh
int 21h
cmp al,0
jne exit
jmp mv
mov ah,4ch
int 21h
exit: mov ah,4ch
int 21h
main endp
;---------------
dapat didownload disini
Macro hampir sama dengan procedure, yang dapat membantu anda dalam membuat program yang besar. Dengan Macro anda tidak perlu menggunakan perintah "CALL" dan anda juga bisa menggunakan parameter dengan mudah. Suatu ciri dari pemrograman bahasa tingkat tinggi!
17.1. MEMBUAT MACRO
Macro adalah lebih mudah dibuat daripada procedure. Untuk membuat Macro bisa anda gunakan bentuk seperti pada gambar 17.1.
---------------------------------------------------------------
NamaM MACRO [P1,P2,,]
+------------+
| Program |
+------------+
ENDM
---------------------------------------------------------------
Gambar 17.1. Model Macro
"P1" dan "P2" adalah parameter yang bisa anda gunakan pada macro. Parameter ini berbentuk optional, artinya bisa digunakan ataupun tidak. Supaya lebih jelas bisa anda lihat pada program MAC1 yang menggunakan macro ini untuk mencetak karakter.
Cetak_Kar MACRO Kar
MOV CX,3
MOV AH,02
MOV DL,Kar
Ulang :
INT 21h ; Cetak Karakter
LOOP Ulang
ENDM ; End Macro
;-----------------------------------;
; Program : MAC1.ASM ;
; Fungsi : Menggunakan Macro ;
; Untuk mencetak ;
; huruf 'SSS' ;
;-----------------------------------;
.MODEL SMALL
.CODE
ORG 100h
Proses:
Cetak_Kar 'S' ; Cetak Huruf S
INT 20h
END Proses
Program 17.1. Menggunakan Macro
Dari program MAC1 bisa anda lihat betapa mudahnya untuk menggunakan macro. Pada procedure, setiap kali kita memanggilnya dengan perintah CALL maka program akan melompat pada procedure tersebut, sehingga setiap procedure hanya terdapat satu kali saja pada program. Lain halnya dengan Macro, setiap terjadi pemanggilan terhadap macro atau dapat dikatakan secara kasar, setiap kita memanggil macro dengan menuliskan nama macronya dalam program, maka seluruh isi macro akan dipindahkan pada program yang memanggilnya. Dengan demikian bila pada program anda memanggil suatu macro sebanyak 10 kali maka macro tersebut akan disisipkan 10 kali pada program. Hal inilah yang menyebabkan program yang menggunakan macro ukuran programnya menjadi lebih besar. Tetapi hal ini juga yang menyebabkan program yang menggunakan macro lebih cepat daripada procedure, karena pada procedure komputer harus melakukan lompatan tetapi pada macro tidak perlu.
17.2. LABEL PADA MACRO
Pada macro anda bisa menggunakan label seperti biasa. Tetapi anda harus ingat, karena setiap pemanggilan Macro akan menyebabkan seluruh isi macro tersebut disisipkan pada program, maka pada macro yang didalamnya menggunakan label hanya dapat dipanggil sebanyak satu kali. Bila anda menggunakanya lebih dari satu kali maka akan terjadi "**Error** Symbol already defined elsewhere: ULANG" karena dianggap kita menggunakan label yang sama.
Untuk menghindari hal itu, gunakanlah directif LOCAL. Dengan directif LOCAL assembler akan membedakan label tersebut setiap kali terjadi pemanggilan terhadapnya.
Cetak_Kar MACRO Kar
LOCAL Ulang ; Label 'Ulang' jadikan Local
MOV CX,3
MOV AH,02
MOV DL,Kar
Ulang:
INT 21h ; Cetak Karakter
LOOP Ulang
ENDM ; End Macro
;-----------------------------------;
; Program : MAC2.ASM ;
; Fungsi : Menggunakan Macro ;
; Untuk mencetak ;
; huruf 'PPPCCC' ;
;-----------------------------------;
.MODEL SMALL
.CODE
ORG 100h
Proses:
Cetak_Kar 'P' ; Cetak Huruf P
Cetak_Kar 'C' ; Cetak Huruf C
INT 20h
END Proses
88
Program 17.2. Menggunakan Perintah LOCAL
17.3. PUSTAKA MACRO
Bila kita sering menggunakan suatu fungsi seperti mencetak kalimat pada setiap program yang kita buat, tentu saja akan sangat membosankan karena setiap kali kita harus membuat fungsi yang sama. Dengan macro anda bisa menghindari hal tersebut dengan membuat suatu pustaka macro. Pustaka tersebut bisa anda simpan dengan suatu nama, misalnya 'pustaka.mcr'. File yang tersimpan adalah dalam bentuk ASCII, tanpa perlu di compile.
;/========================\;
; Program : PUSTAKA.MCR ;
;\========================/;
Cetak_Kar MACRO Kar ; Macro untuk mencetak
MOV AH,02 ; Karakter
MOV DL,Kar
INT 21h
ENDM
Cetak_Klm MACRO Klm ; Macro untuk mencetak
LEA DX,Klm ; kalimat
MOV AH,09
INT 21h
ENDM
Program 17.3. Pustaka.MCR
Setelah program 17.3. anda ketikkan, simpanlah dengan nama 'PUSTAKA.MCR'. Anda bisa menggunakan macro pada file pustaka.mcr dengan hanya manambahkan kata:
INCLUDE PUSTAKA.MCR
Sebagai contohnya bisa anda lihat pada program 17.4. yang menggunakan file pustaka.mcr ini untuk mencetak kalimat dan karakter.
;/====================================\;
; Program : TPTK.ASM ;
; Fungsi : Contoh menggunakan ;
; pustaka macro ;
;\====================================/;
INCLUDE PUSTAKA.MCR ; Gunakan file PUSTAKA.MCR
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Kal0 DB 'PENGGUNAAN PUSTAKA MACRO $'
Proses:
Cetak_Klm Kal0 ; Cetak Kalimat Kal0
Cetak_Kar 'Y' ; Cetak Huruf 'Y'
INT 20h
END TData
Program 17.4. Menggunakan Pustaka.MCR
Setelah program 17.4. anda jalankan, maka pada layar akan ditampilkan:
PENGGUNAAN PUSTAKA MACRO Y
17.4. MACRO ATAU PROCEDURE ?
Banyak pro dan kontra mengenai macro dan procedure ini. Sebagian orang menganggap macro akan merugikan program, tetapi banyak juga yang menganggap macro adalah pemecahan yang tepat dalam pemrograman assembler yang terkenal sulit untuk digunakan. Kini apa yang akan anda pakai ? Macro ataukah procedure ? Untuk itu marilah kita lihat dahulu perbedaan antara procedure dan macro ini.
- Procedure tidak memperpanjang program, karena hanya muncul sekali saja pada program.
- Macro akan muncul pada program setiap terjadi pemanggilan terhadap macro, sehingga macro akan memperpanjang program.
- Untuk menggunakan procedure anda harus memanggilnya dengan perintah CALL dan dalam procedure diakhiri dengan RET.
- Macro bisa anda gunakan dengan memanggil langsung namanya dan pada macro tidak perlu diakhiri dengan RET.
- Procedure akan memperlambat program, karena setiap pemanggilan terhadap procedure, komputer harus melakukan lompatan.
- Macro tidak memperlambat program karena komputer tidak perlu melakukan lompatan.
- Pada procedure anda tidak bisa menggunakan parameter secara langsung. Bila anda ingin menggunakan parameter bisa dengan melalui stack atau register.
- Macro dengan mudah bisa menggunakan parameter, suatu ciri bahasa tingkat tinggi.
- Macro lebih mudah dibuat dan digunakan daripada procedure.
Setelah melihat perbedaan-perbedaan tersebut, kapankah kita menggunakan procedure dan kapankah menggunakan macro ?
- Jika fungsi tersebut jarang dipanggil, gunakanlah MACRO karena macro tidak
memperlambat proses.
- Jika fungsi tersebut sering dipanggil, gunakanlah PROCEDURE karena
procedure tidak memperbesar program.
- Jika fungsi tersebut kecil, gunakanlah MACRO. Karena pengaruh terhadap
besarnya program hanya sedikit dan program akan lebih cepat.
- Jika fungsi tersebut besar, gunakanlah PROCEDURE. Karena procedure tidak
memperbesar program.
Label:
education,
kuliah elektronika