bahasa asembler 2

Tampilkan postingan dengan label bahasa asembler 2. Tampilkan semua postingan
Tampilkan postingan dengan label bahasa asembler 2. Tampilkan semua postingan

bahasa asembler 2















Pada baris pertama pelajar memperoleh alamat efektif dari "Kal" dan disimpan pada DX. lalu pelajar simpan nilai DX yang menunjuk pada offset "Kal" ini pada variabel Stacks. Sehingga pada saat pelajar hendak mencetak 'Kal' untuk kedua kalinya, pelajar tinggal mengambil nilai dari variabel Stacks dengan perintah "MOV DX,Stacks". .Kini akan pelajar lihat bagaimana memakai stack yang sebetulnya untuk tugas ini. .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kal DB 'LANG LING LUNG $' Ganti DB 13,10,'$' Stacks DW ? Proses: LEA DX,Kal PUSH DX MOV AH,09 INT 21h LEA DX,Ganti INT 21h POP DX INT 21h Exit : INT 20h END TData program Operasi Stack Dengan perintah "PUSH", pelajar menyimpan nilai register DX pada stack, lalu pada perintah "POP" pelajar mangambil keluar nilai yang disimpan itu dari stack. Dari program ini dapat dilihat bagaimana stack menggantikan varibel pada program yang dipakai untuk menyimpan nilai pada register DX. Kini lihatlah bagaimana program yang memakai pengulangan didalam pengulangan dengan memanfaatkan stack ini. Dalam bahasa Pascal program nya akan tampak seperti berikut: For i:= 10 DownTo 1 Do For j:= 5 DownTo 1 Do For s:= 3 DownTo 1 Do Begin End Dalam bahasa assembler akan tampak seperti: 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 Stack dapat pelajar bayangkan sebagai sebuah tabung yang panjang. sedang nilai pada register dapat dibayangkan berbentuk koin yang dapat dimasukkan dalam tabung itu . Untuk memasukkan nilai suatu register pada stack, dipakai perintah push dengan syntax: PUSH Reg16Bit contoh : pada perintah: MOV AX,12 MOV BX,33 MOV CX,99 PUSH AX ; Simpan nilai AX pada stack PUSH BX ; Simpan nilai BX pada stack PUSH CX ; Simpan nilai CX pada stack Maka pada stack akan tampak seperti: <<<< Gbr142.PIX >>>>> gambar kode Penyimpanan Nilai Pada Stack Dari gambar kode dapat kita lihat bahwa nilai yang terakhir dimasukkan(99) akan terletak pada puncak tabung stack. Untuk mengambil keluar koin nilai pada tabung stack, dipakai perintah.pop dengan syntax: POP Reg16Bit Perintah POP akan mengambil koin nilai pada stack yang paling atas dan dimasukkan pada Reg16Bit. Dari sini dapat kita lihat bahwa data yang terakhir dimasukkan akan menjadi yang pertama dikeluarkan. Inilah sebabnya operasi stack dinamankan LIFO(Last In First Out). contoh : , 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 kita terbalik dalam mengambil nilai pada stack dengan POP AX lalu POP BX dan POP CX, maka nilai yang akan kita dapatkan pada register AX, BX dan CX akan terbalik. Sehingga register AX akan bernilai 99 dan CX akan bernilai 12. TRIK: ,, data tidak bisa dicopykan antar segment atau memory. Untuk menyalinkan data antar segment atau memory kita harus memakai register general purpose sebagai perantaranya, seperti: MOV AX,ES ; Untuk menyamakan register MOV DS,AX ; ES dan DS Dengan adanya stack, kita bisa memakai nya sebagai perantara,.sehingga akan tampak seperti: PUSH ES ; Untuk menyamakan register POP DS ; ES dan DS PUSF dan POPF, seperti dengan perintah PUSH dan POP. Perintah PUSFdipakai untuk menyimpan nilai dari flags register pada stack sedang POPF dipakai untuk mengambil nilai pada stack dan disimpan pada flags register. Kedua perintah ini dipakai tanpa operand: PUSHF ; Simpan nilai Flags pada stack POPF ; Ambil nilai pada stack Perintah PUSHF dan POPF dipakai untuk menyelamatkan kondisi dari flag pada perubahan. PUSHF dan POPF biasanya dipakai pada operasi yang sangat mementingkan nilai pada flag ini, seperti pada operasi aritmatika. MASUKAN DARI KEYBOARD Keyboard yaitu sarana bagi pelajar untuk berkomunikasi dengan program .Pada bagian ini akan pelajar lihat bagaimana caranya untuk menanggapi masukan dari keyboard. namun sebelumnnya kita tentunya harus mengerti sedikit mengenai beberapa hal penting yang berkaitan dengan keyboard itu. Prosesor pada keyboard mendeteksi setiap penekanan atau pelepasan tombol pada keyboard. Prosesor ini menterjemahkan setiap sinyal yang terjadi berdasar posisi tertentu menjadi apa yang dinamakan kode Scan. Dengan demikian tombol "A" dan "B" akan memiliki kode Scan yang berbeda sebab posisinya memang berbeda. Lain halnya untuk tombol "A" dan "a" yang ada pada posisi yang sama, akan memiliki kode Scan yang sama. Kode Scan ini biasanya tidak berguna bagi pelajar . pelajar biasanya hanya memakai kode ASCII dan Extended yaitu hasil terjemahan dari kode scan oleh keyboard handler. Kode ASCII yaitu kode yang melambangkan suatu huruf baik berupa huruf,angka, atau simbol-simbol grafik. contoh angka "1" akan dilambangkan dengan kode ASCII 49. Untuk kode ASCII ini bisa kita lihat pada lampiran. Kode ASCII sudah menyediakan sebanyak 256 huruf dengan beberapa huruf kontrol, contoh #10 untuk pindah baris dan #13 untuk Enter yang akan menggerakkan kursor kesamping kiri. namun fungsi yang sudah disediakan ini tidak mampu untuk menampilkan ataupun mendeteksi tombol fungsi contoh F1, F2, F3 dan Home. Tombol kombisasi juga tidak dapat dideteksi oleh huruf ASCII , contoh penekan tombol shif ditambah tombol F1, penekanan Ctrl .ditambah tombol Home, dan lain-lain. Penekanan pada tombol-tombol fungsi dan tombol kombinasi akan menghasilkan kode ASCII 0. sebab alasan diatas maka diciptakanlah suatu kode yang dinamakan sebagai kode EXTENDED. Kode Extended ini dapat mendeteksi penekanan pada tombol-tombol fungsi atau tombol kombinasi. Untuk kode extended bisa kita lihat pada lampiran. Interupsi dari BIOS, yaitu interupsi 16h servis 0 dapat dipakai untuk memperoleh masukan satu huruf dari keyboard. Hasil dari pembacaan huruf fungsi ini akan diletakkan pada register AX. Bila terjadi penekanan pada tombol biasa maka byte rendah dari AX, akan menandakan kode ASCII dari tombol itu dan byte tnggi dari AX akan berisi kode Scan dari tombol itu . Bila yang ditekan yaitu tombol khusus(extended) yang akan menghasilkan kode ASCII 0 maka byte rendah dari register AX akan menghasilkan kode ASCII 0 dan byte tinggi dari AX akan akan berisi kode extended dari tombol itu . ; INTERUPSI 16h ; ; Input: OutPut: ; ; AH = 0 bila tombol biasa, maka: ; ; AL = ASCII ; ; AH = SCAN ; ; ; ; bila Tombol khusus, maka ; ; AL = 00 ; ; AH = Extended ; ; ; ;\========================================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses T_ASCII DB 13,10,'Ini yaitu tombol ASCII : $' T_Extended DB 13,10,'Ini yaitu tombol Extended $' Proses : MOV AH,0 ; Servis Input satu huruf INT 16h ; lakukan PUSH AX ; Simpan hasil pembacaan pada stack CMP AL,00 ; Apakah ini huruf extended ? JE Extended ; Ya !, Lompat ke Extended ASCII: LEA DX,T_ASCII ; Ambil alamat efektif T_ASCII MOV AH,09 ; Servis cetak kalimat INT 21h ; Cetak kalimat ! POP AX ; Ambil kembali nilai AX pada stack MOV DL,AL ; Ambil kode ASCII yang ditekan MOV AH,2 ; Servis cetak huruf INT 21h ; Cetak huruf ! CMP AL,'Q' ; Apakah yang ditekan huruf 'Q' ? JE exit ; Ya !, lompat ke Exit CMP AL,'q' ; Apakah yang ditekan huruf 'q' ? JE exit ; Ya !, lompat ke Exit JMP Proses ; Lompat ke Proses Extended: LEA DX,T_Extended ; Ambil alamat efektif T_Extended MOV AH,09 ; Servis cetak kalimat INT 21h ; Cetak kalimat ! JMP Proses ; Lompat ke Proses exit: INT 20h ; Kembali ke DOS ! END TData program Menunggu masukan satu huruf dari Keyboard Bila kita menekan tombol extended, seperti penekanan tombol anak panah,.F1, F2 dan sebagainya maka pada layar akan ditampilkan : Ini yaitu tombol Extended Bila kita ingin mengetahui lebih lanjut mengenai tombol apa yang ditekan maka kode extendednya bisa dilihat pada register AH. sedang bila yang ditekan yaitu tombol biasa, seperti huruf 'S' maka pada layar akan ditampilkan: Ini yaitu tombol ASCII : S program akan selesai bila kita menekan tombol "q" atau "Q". Dengan fungsi 11h dari interupsi 16h, pelajar bisa mendeteksi pada penekanan tombol,seperti seperti yang dilakukan oleh fungsi keypressed pada bahasa pascal. Fungsi ini akan mendeteksi keyboard buffer, bila pada keyboard buffer ada suatu tombol maka ia akan membuat zerro flags menjadi nol<0> dan register AL berisi kode ASCII dari huruf itu sedang register AH akan berisi kode Scan dari tombol itu . Sebaliknya bila pada keyboard buffer tidak ada huruf maka zerro flags akan bernilai satu <1>. Keyboard buffer yaitu suatu penampung yang dipakai untuk menampung setiap penekanan tombol pada keybaord. Daya tampung normal dari keyboard buffer yaitu 15 huruf . bila keyboard buffer sudah penuh, speaker akan mengeluarkan tanda berupa suara beep. ; Input: OutPut: ; ; AH = 1 bila Ada tombol yang ditekan ; ; ZF = 0 dan ; ; AL = kode ASCII ; ; AH = Scan Code ; ; ; ; bila Tidak ada penekanan Tombol ; ; ZF = 1 ; ; ; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kal0 DB 'Tekan sembarang tombol untuk berhenti ! ' DB 13,10,'$' Proses : MOV AH,1 ; Servis untuk mengecek buffer keyboard INT 16h ; lakukan ! JNZ EXIT ; bila ada tombol yang ditekan, lompat ; Ke EXIT MOV AH,09 ; Servis untuk cetak kalimat LEA DX,Kal0 ; Ambil alamat efektif Kal0 INT 21h ; Cetak kalimat ! JMP Proses ; Lompat ke Proses exit : INT 20h ; Kembali ke DOS ! END TData program Membuat fungsi Keypressed Bila program dijalankan, maka pada layar akan ditampilkan tulisan: Tekan sembarang tombol untuk berhenti ! Tulisan ini akan ditampilkan terus sampai kita menekan sembarang tombol. Pada program -program sebelumnya pelajar hanya bisa memperoleh masukan satu .huruf pada keybaord, bagaimana bila diinginkan masukan berupa suatukalimat? Untuk itu DOS sudah menyedikannya. Interupsi 21h servis ke 0Ah, dipakai untuk memperoleh masukan dari keyboard lebih dari satu huruf . sedang aturan pemakainya yaitu: INPUT OUTPUT AH = 0Ah Buffer yang berisi string DS:DX= Buffer hasil masukan dari keyboard Untuk memakai fungsi ini kita harus menyediakan sebuah buffer untuk .menampung hasil masukan dari keyboard. kita bisa membuat sebuah buffer seperti: Buffer DB X,Y,Z DUP(?) Pada byte pertama yang pelajar gambarkan sebagai "X", dipakai sebagai tanda dari banyaknya huruf yang dapat dimasukkan dari keyboard ditambah 1. Seperti bila kita memberi nilai 23, maka huruf maksimum yang dapat dimasukkan yaitu 22 huruf , sebab satu huruf lagi dipakai khusus oleh tombol Enter(0Dh). Pada byte kedua yang pelajar gambarkan sebagai "Y" ,dipakai oleh fungsi ini sebagai indikator banyaknya huruf yang sudah diketikkan oleh user(Tombol Enter<0dh> tidak akan dihitung). kita bisa memberi tanda "?" untuk byte kedua ini, sebab nilainya akan diisi secara otomatis nantinya. Pada byte ketiga yang pelajar gambarkan sebagai "Z" inilah yang nantinya yaitu awal dari masukan string akan ditampung. kita harus menyediakan banyaknya byte yang dibutuhkan, sesuai dengan byte pertama("X"). ; INTERUPSI 21h ; ; Input: ; ; AH = 0Ah ; ; DS:DX = Penampung dengan spesifikasi: ; ; Byte 1 = Maksimum huruf yang dapat dimasukkan ; ; Byte 2 = Akan dijadikan Indikator banyaknya ; ; huruf yang dimasukkan ; ; Byte 3 keatas = Tempat hasil masukan ditampung ; .MODEL SMALL .CODE ORG 100h TData : JMP Proses T_Enter EQU 0Dh Kal0 DB 'Ketikkan satu Kalimat : $' Kal1 DB 13,10,'Kalimat pada buffer : $' Buffer DB 23,?,23 DUP(?) Proses : MOV AH,09 LEA DX,Kal0 INT 21h ; Cetak kalimat Kal0 MOV AH,0Ah ; Servis Input kalimat LEA DX,Buffer ; DX menunjuk pada offset Buffer INT 21h ; Input kalimat ! MOV AH,09 LEA DX,Kal1 INT 21h ; Cetak kalimat Kal1 LEA BX,Buffer+2 ; BX menunjuk byte ke 3 Buffer Ulang: CMP BYTE PTR [BX],T_Enter ; Apakah huruf Enter? JE EXIT ; Ya! Lompat ke Exit MOV DL,[BX] ; Masukkan huruf pada DL MOV AH,02 ; Servis cetak huruf INT 21h ; Cetak huruf INC BX ; BX := BX+1 JMP Ulang ; Lompat ke Ulang EXIT: INT 20h ; Kembali ke DOS ! END TData program Masukan string dari Keyboard,Contoh dari hasil eksekusi program sesudah memperoleh masukan dari keyboard: Ketikkan satu Kalimat : Equasoft Kalimat pada buffer : Equasoft sedang proses yang dilakukan pada program yaitu: MOV AH,09 LEA DX,Kal0 INT 21h Pertama-tama cetak kalimat Kal0 dengan servis 9 interupsi 21h, sesudah itu: MOV AH,0Ah LEA DX,Buffer INT 21h Pada bagian inilah pelajar meminta masukan dari keyboard, dengan DX.menunjuk pada buffer yang dipakai sebagai penampung. MOV AH,09 LEA DX,Kal1 INT 21h Sesudah itu cetaklah kalimat pada Kal1 LEA BX,Buffer+2 Dengan perintah ini maka BX akan menunjuk pada byte ke 3, atau awal.masukan string dari keyboard. agar lebih jelas, nilai pada buffer sesudah memperoleh masukan yaitu: Offset BX=Offset+2 _ _ +---+---+---+---+---+---+---+---+---+---+---+ | 9 | 8 | E | q | u | a | s | o | f | t | 0D| +---+---+---+---+---+---+---+---+---+---+---+ Sesudah BX mnunjuk pada huruf pertama hasil masukan, maka: CMP BYTE PTR [BX],T_Enter JE EXIT Periksalah, apakah huruf yang ditunjukkan BX yaitu 0D(Enter)? Bila ya, berarti akhir dari masukan. ,disini, bahwa pelajar memakai BYTE PTR. Bila tidak dipakai , assembler akan bingung apakah pelajar ingin membandingkan isi alamat BX sebanyak 1 byte atau lebih dengan T_Enter. MOV DL,[BX] MOV AH,02 INT 21h Bila bukan huruf enter, maka ambil huruf itu dan masukkan pada register DL untuk dicetak. INC BX JMP Ulang Tambahlah BX denga satu sehingga BX akan menunjuk pada huruf selanjutnya. Proses dilanjutkan sampai ketemu tanda 0D atau huruf Enter. Procedure yaitu suatu alat bantu yang sangat berguna. Dengan procedure suatu program yang besar bisa diselesaikan dengan lebih mudah. Proses pencarian kesalahanpun akan lebih mudah bila dipakai procedure. Untuk membuat procedure bisa kita pakai bentuk seperti pada gambar ini NamaP PROC NEAR/FAR +---------+ | program | +---------+ RET NamaP ENDP ------------------------------------------------------------- gambar kode Model Procedure "NamaP" yaitu nama dari procedure yang pelajar diartikan sendiri. Untuk memudahkan nama untuk procedure bisa kita diartikan sesuai dengan fungsi dari procedure itu , seperti CLS untuk procedure yang tugasnya menghapus layar. Dibelakang kata "PROC" kita harus memilih bentuk dari procedure itu , yaitu "NEAR" atau "FAR". Bentuk "NEAR" dipakai bila procedure .itu nantinya dipanggil oleh program yang letaknya masih satu segment dari procedure itu . Pada program COM yang terdiri atas satu segment, pelajar akan selalu memakai bentuk "NEAR". Sebaliknya bentuk "FAR" ini dipakai bila procedure dapat dipanggil dari segment lain. Bentuk ini akan pelajar pakai pada program EXE. Perintah "RET(Return)" dipakai untuk mengembalikan Kontrol program pada sipemanggil procedure. Pada bentuk NEAR perintah RET ini akan memPOP atau mengambil register IP dari stack sebagai alamat loncatan menuju program pemanggil procedure. sedang pada bentuk "FAR" perintah RET akan mengambil register IP dan CS dari stack sebagai alamat loncatan menuju program pemanggil procedure. Alamat kembali untuk procedure disimpan pada stack pada saat procedure itu dipanggil dengan perintah "CALL", dengan syntax: CALL NamaP Perintah Call ini akan menyimpan register IP saja bila procedure yang dipanggil berbentuk "NEAR". Bila procedure yang dipanggil berbentuk "FAR", maka perintah "CALL" akan menyimpan register CS dan IP. Sebagai contoh dari pemakaian procedure akan pelajar lihat pada program yang mencetak huruf dengan procedure. .MODEL SMALL .CODE ORG 100h Proses : CALL Cetak_Kar ; Panggil Cetak_Kar INT 20h Cetak_Kar PROC NEAR MOV AH,02h MOV DL,'S' INT 21h ; Cetak huruf RET ; Kembali kepada si pemanggil Cetak_Kar ENDP ; END Procedures END Proses program memakai Procedure Bila program dijalankan, maka pada layar akan ditampilkan huruf "S". Untuk membuat sebuah procedure ingatlah untuk menyimpan semua register yang dipakai oleh procedure itu dan mengembalikan semua isi register pada akhir procedure. ini dilakukan untuk menjaga agar program utama yang memakai procedure itu tidak menjadi kacau nantinya. Sebagai contohnya bisa kita lihat pada program .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kar DB ? Klm DB 'BATMAN SI MANUSIA KELELAWAR ' ; 28 huruf Proses : MOV CX,28 ; Banyaknya pengulangan XOR BX,BX ; Addressing Mode Ulang : MOV DL,Klm[BX] MOV Kar,DL CALL Cetak_Kar ; Panggil Cetak_Kar INC BX LOOP Ulang INT 20h Cetak_Kar PROC NEAR PUSH AX ; Simpan semua register PUSH DX ; Yang dipakai MOV AH,02h MOV DL,Kar INT 21h ; Cetak huruf POP DX ; Kembalikan semua register POP AX ; Yang disimpan RET ; Kembali kepada si pemanggil Cetak_Kar ENDP ; END Procedures END TData program memakai Procedure Bila program dijalankan, maka pada layar akan ditampilkan: BATMAN SI MANUSIA KELELAWAR Pada procedure pelajar tidak bisa memakai parameter, inilah salah satu kelemahan dari procedure yang sangat berarti. Untuk memakai parameter kita harus memakai MACROS. MACRO Macro hampir sama dengan procedure, yang dapat membantu kita dalam membuat program yang besar. Dengan Macro kita tidak perlu memakai perintah "CALL" dan kita juga bisa memakai parameter dengan mudah. Suatu ciri dari pemprograman bahasa tingkat tinggi! Macro yaitu lebih mudah dibuat daripada procedure. Untuk membuat Macro bisa kita pakai bentuk seperti pada gambar kode --------------------------------------------------------------- NamaM MACRO [P1,P2,,] +------------+ | program | +------------+ ENDM --------------------------------------------------------------- gambar kode Model Macro "P1" dan "P2" yaitu parameter yang bisa kita pakai pada macro. Parameter ini berbentuk optional, artinya bisa dipakai ataupun tidak. agar lebih jelas bisa kita lihat pada program MAC1 yang memakai macro ini untuk mencetak huruf . Cetak_Kar MACRO Kar MOV CX,3 MOV AH,02 MOV DL,Kar Ulang : INT 21h ; Cetak huruf LOOP Ulang ENDM ; End Macro ;-----------------------------------; ; program : MAC1.ASM ; ; Fungsi : memakai Macro ; ; Untuk mencetak ; ; huruf 'SSS' ; ;-----------------------------------; .MODEL SMALL .CODE ORG 100h Proses: Cetak_Kar 'S' ; Cetak Huruf S INT 20h END Proses program 17.1. memakai Macro (88) Dari program MAC1 bisa kita lihat betapa mudahnya untuk memakai macro. Pada procedure, setiap kali pelajar memanggilnya dengan perintah CALL maka program akan melompat pada procedure itu , sehingga setiap procedure hanya ada satu kali saja pada program . Lain halnya dengan Macro, setiap terjadi pemanggilan pada macro atau dapat dikatakan secara kasar, setiap pelajar memanggil macro dengan menuliskan nama macronya dalam program , maka seluruh isi macro akan dipindahkan pada program yang memanggilnya. sehingga bila pada program kita memanggil suatu macro sebanyak 10 kali maka macro itu akan disisipkan 10 kali pada program . ini lah yang memicu program yang memakai macro ukuran program nya menjadi lebih besar. namun ini juga yang memicu program yang memakai macro lebih cepat daripada procedure, sebab pada procedure komputer harus melakukan lompatan namun pada macro tidak perlu. Pada macro kita bisa memakai label seperti biasa. namun kita harus ingat, sebab setiap pemanggilan Macro akan memicu seluruh isi macro itu disisipkan pada program , maka pada macro yang didalamnya memakai label hanya dapat dipanggil sebanyak satu kali. Bila kita memakai ya lebih dari satu kali maka akan terjadi "**Error** Symbol already defined elsewhere: ULANG" sebab dianggap pelajar memakai label yang sama. Untuk menghindari hal itu, pakai lah directif LOCAL. Dengan directif LOCAL assembler akan membedakan label itu setiap kali terjadi pemanggilan pada nya. Cetak_Kar MACRO Kar LOCAL Ulang ; Label 'Ulang' jadikan Local MOV CX,3 MOV AH,02 MOV DL,Kar Ulang: INT 21h ; Cetak huruf LOOP Ulang ENDM ; End Macro ;-----------------------------------; ;-----------------------------------; .MODEL SMALL .CODE ORG 100h Proses: Cetak_Kar 'P' ; Cetak Huruf P Cetak_Kar 'C' ; Cetak Huruf C INT 20h END Proses program . memakai Perintah LOCAL Bila pelajar sering memakai suatu fungsi seperti mencetak kalimat padasetiap program yang pelajar buat, tentu saja akan sangat membosankan sebab setiap kali pelajar harus membuat fungsi yang sama. Dengan macro kita bisa menghindari hal itu dengan membuat suatu pustaka macro. Pustaka itu bisa kita simpan dengan suatu nama, contoh 'pustaka.mcr'. File yang tersimpan yaitu dalam bentuk ASCII, tanpa perlu di compile. Cetak_Kar MACRO Kar ; Macro untuk mencetak MOV AH,02 ; huruf MOV DL,Kar INT 21h ENDM Cetak_Klm MACRO Klm ; Macro untuk mencetak LEA DX,Klm ; kalimat MOV AH,09 INT 21h ENDM program Pustaka.MCR Sesudah program kita ketikkan, simpanlah dengan nama 'PUSTAKA.MCR'. kita bisa memakai macro pada file pustaka.mcr dengan hanya manambahkan kata: INCLUDE PUSTAKA.MCR contoh : bisa kita lihat pada program yang memakai file pustaka.mcr ini untuk mencetak kalimat dan huruf . INCLUDE PUSTAKA.MCR ; pakai file PUSTAKA.MCR .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kal0 DB 'pemakaian PUSTAKA MACRO $' Proses: Cetak_Klm Kal0 ; Cetak Kalimat Kal0 Cetak_Kar 'Y' ; Cetak Huruf 'Y' INT 20h END TData program memakai Pustaka.MCR Sesudah program kita jalankan, maka pada layar akan ditampilkan: pemakaian PUSTAKA MACRO Y Banyak pro dan kontra mengenai macro dan procedure ini. Sebagian pelajar menganggap macro akan merugikan program , namun banyak juga yang menganggap macro yaitu pemecahan yang tepat dalam pemprograman assembler yang terkenal sulit untuk dipakai . Kini apa yang akan kita pakai ? Macro ataukah procedure ? Untuk itu marilah pelajar lihat dahulu perbedaan antara procedure dan macro ini. - Procedure tidak memperpanjang program , sebab hanya muncul sekali saja pada program . - Macro akan muncul pada program setiap terjadi pemanggilan pada macro, sehingga macro akan memperpanjang program . - Untuk memakai procedure kita harus memanggilnya dengan perintah CALL dan dalam procedure diakhiri dengan RET. - Macro bisa kita pakai dengan memanggil langsung namanya dan pada macro tidak perlu diakhiri dengan RET. - Procedure akan memperlambat program , sebab setiap pemanggilan pada procedure, komputer harus melakukan lompatan. - Macro tidak memperlambat program sebab komputer tidak perlu melakukan lompatan. - Pada procedure kita tidak bisa memakai parameter secara langsung. Bila kita ingin memakai parameter bisa dengan melalui stack atau register. - Macro dengan mudah bisa memakai parameter, suatu ciri bahasa tingkat tinggi. - Macro lebih mudah dibuat dan dipakai daripada procedure. Sesudah melihat perbedaan-perbedaan itu , kapankah pelajar memakai procedure dan kapankah memakai macro ? - bila fungsi itu jarang dipanggil, pakai lah MACRO sebab macro tidak memperlambat proses. - bila fungsi itu sering dipanggil, pakai lah PROCEDURE sebab procedure tidak memperbesar program . - bila fungsi itu kecil, pakai lah MACRO. sebab pengaruh pada besarnya program hanya sedikit dan program akan lebih cepat. - bila fungsi itu besar, pakai lah PROCEDURE. sebab procedure tidak memperbesar program . OPERASI PADA LAYAR Layar dapat dikat akan menjadi media yang menarik untuk dibahas, sebab pada layar ini tampilan program bisa dijadikan semenarik mungkin. Pada bagian ini yang paling penting dan harus kita kuasai yaitu bagian yang menerangkan mengenai memory layar yang dipakai sebagai data ditampilkan gambar/teks dilayar. Pada layar disediakan suatu buffer atau memory yang mencatat tentang apa yang akan ditampilkan dilayar. Komputer akan membaca data pada memory layar untuk memperbaharui tampilan pada layar yang dilakukan kurang lebih 70 kali setiap detiknya. Cepatnya penulisan kembali gambar kode pada layar ini dinamakan sebagai "refresh rate". Pada layar monitor monokrom(tidak berwarna), alamat memory yang dipakai sebagai buffer dipakai lokasi memory dimulai pada alamat B000h:0000. Pada monitor berwarna dipakai lokasi memory mulai alamat B800h:0000. Untuk pembahasaan pelajar selanjutnya akan selalu dipakai alamat buffer layar berwarna(B800h). Pada modus teks, setiap saat komputer akan selalu melihat pada alamat B800h:0000 sebanyak satu byte untuk menampilkan huruf ASCII pada posisi kolom 0 dan baris 0. lalu alamat B800h:0001 dipakai sebagai atribut dari posisi kolom 0 dan baris 0. Alamat B800h:0002 dipakai sebagai data untuk menampilkan huruf ASCII pada posisi kolom 1 dan baris 0. Dan alamat B800h:0003 dipakai sebagai data untuk menampilkan atribut dari posisi kolom 1 baris 0. Demikian seterusnya memory layar dipakai (Lihat gambar kode 18.1). <<< Gbr181.PIX >>> gambar kode 18.1. pemakaian Memory Layar Untuk Menampilkan Teks Dan Atributnya Dari sini sudah dapat pelajar ketahui bahwa sebuah huruf pada saat ditampilkan dimonitor memakai 2 byte, yang mana byte pertama dipakai untuk kode ASCII-nya dan byte berikutnya dipakai untuk atribut dari huruf itu . sebab pada mode default, layar teks dibagi menjadi 80 kolom dan 25 baris(80*25), maka memory yang dibutuhkan untuk satu layar yaitu: 80 * 25 * 2 = 4000 Byte Dengan alamat memory yang dipakai secara berurutan ini, yang mana teks akan menempati offset genap dan atribut menempati offset ganjil, alamat dari posisi huruf atau atribut bisa dihitung dengan memakai rumus: Offset huruf = (Baris * 160) + (Kolom * 2) Offset Atribut = (Baris * 160) + (Kolom * 2)+1 sehingga bila pelajar ingin menampilkan huruf 'S' pada posisi kolom 40 dan baris 12 maka alamat yang dipakai yaitu: (12*160)+(40*2)=2000, atau tepatnya B800h:2000. Untuk menampilkan atribut pada posisi kolom 40 dan baris 12 maka alamat yang dipakai yaitu:(12*160)+(40*2)+1=2001, atau tepatnya B800h:2001. contoh : bisa kita lihat pada program 18.1. yang akan menampilkan huruf "S" pada posisi kolom 40 dan baris 12 dengan atributnya 95. Tulis_Kar MACRO X,Y,Kar,Attr MOV AX,0B800h MOV ES,AX ; ES Menunjuk pada segment layar MOV AH,Y MOV AL,160 MUL AH ; Hitung offset baris MOV BX,AX ; Simpan hasilnya pada BX MOV AH,X MOV AL,2 MUL AH ; Hitung offset kolom ADD BX,AX ; Tambahkan hasilnya pada BX MOV AL,Kar ; AL=huruf yang akan ditampilkan MOV AH,Attr ; AH=Atribut yang akan ditampilkan MOV ES:[BX],AL ; Tampilkan huruf dan atributnya MOV ES:[BX+1],AH ; pada posisi kolom X dan baris Y ENDM ;---------------------- .MODEL SMALL .CODE ORG 100h Proses : Tulis_Kar 40 12 'S' 95 ; Tulis huruf 'S' dengan ; no atribut 95 pada posisi INT 20h ; kolom 40 dan baris 12 END Proses program Menuliskan langsung pada memory layar Dengan mengertinya kita pada program ini maka banyak program menarik yang dapat kita hasilkan, seperti program rontok, menu sorot, shadow dan lain sebagainya. Pada bagian ini akan pelajar lihat, bagaimana caranya menggeser geser tulisan dengan mengakses memory layar secara langsung dengan program rontok. program rontok yaitu program yang akan membersihkan layar dengan cara menjatuhkan atau merontokkan huruf pada layar satu persatu. Delay MACRO PUSH CX ; Macro ini dipakai untuk XOR CX,CX ; menunda program , dan Loop1: LOOP Loop1 ; hanya melakukan looping POP CX ENDM Geser MACRO PosY PUSH AX PUSH BX PUSH CX ; Simpan semua register yang dipakai XOR CX,CX MOV AL,26 SUB AL,PosY MOV CL,AL ; CX=banyaknya pergeseran kebawah Loop2: MOV AL,BYTE PTR ES:[BX] ; AL=huruf pada layar MOV BYTE PTR ES:[BX+160],AL ; Geser ke bawah Hilang: MOV BYTE PTR ES:[BX],' ' ; Hapus huruf ; sebelumnya Delay ; delay, agar bisa ; tampak ADD BX,160 ; Menuju baris selanjutnya LOOP Loop2 ; Ulangi ke Loop2 POP CX POP BX POP AX ; Kembalikan semua register yang dipakai ENDM ;/===========================/ .MODEL SMALL .CODE ORG 100h TData : JMP Proses PosY DB ? Proses: MOV AX,0B800h MOV ES,AX ; ES mencatat segment layar MOV BX,3998 ; Posisi huruf 80,25 MOV CX,25 ; Banyaknya pengulangan baris UlangY : MOV PosY,CL ; PosY mencatat posisi baris PUSH CX ; CX mencatat posisi Y MOV CX,80 ; Banyaknya pengulangan Kolom UlangX : CMP BYTE PTR ES:[BX],33 ; Apakah ada huruf ; pada layar ? JB Tdk ; Lompat ke Tdk, bila tidak ada Geser PosY ; Geser huruf itu ke bawah Tdk : SUB BX,2 ; BX menunjuk huruf selanjutnya LOOP UlangX ; Proses 80 kali untuk kolom POP CX ; Ambil posisi Y LOOP UlangY ; Ulangi dan ganti baris ke atas EXIT: INT 20h END TData program 18.2. Merontokkan huruf pada layar Bila program 18.2 dijalankan, maka semua huruf pada layar akan dirontokkan satu persatu sampai habis. <<< Gbr182.PIX >>> gambar kode 18.2. Hasil eksekusi program 18.2. sedang penjelasan program nya yaitu: Delay MACRO PUSH CX XOR CX,CX Loop1: LOOP Loop1 POP CX ENDM Macro ini dipakai untuk menunda program . Dengan menolkan CX, maka looping yang akan diperoleh menjadi FFFFh kali, sebab pengurangan 0 dengan 1 akan akan menghasilkan nilai -1 atau FFFFh. Geser MACRO PosY PUSH AX PUSH BX PUSH CX Pada macro inilah nantinya huruf-huruf pada layar akan digeser. Untuk itu simpanlah semua register yang dipakai oleh macro ini sebab pada program utama, register-register juga dipakai . XOR CX,CX MOV AL,26 SUB AL,PosY MOV CL,AL Ini yaitu bagian dari macro geser yang akan menghitung banyaknya pergeseran kebawah yang akan dilakukan, dengan melihat posisi dari huruf yang digeser pada variabel "PosY". Loop2: MOV AL,BYTE PTR ES:[BX] MOV BYTE PTR ES:[BX+160],AL Hilang: MOV BYTE PTR ES:[BX],' ' Delay ADD BX,160 LOOP Loop2 Bagian inilah yang akan menggeser geser tulisan pada layar. Register BX ditambah dengan 160 untuk mengakses baris dibawahnya. POP CX POP BX POP AX ENDM Pada akhir macro, kembalikanlah semua register yang sudah disimpan pada awal macro. Ingat urutannya harus terbalik. Pada program utama: .MODEL SMALL .CODE ORG 100h TData : JMP Proses PosY DB ? Pertama-tama siapkanlah sebuah variabel untuk menampung posisi dari baris yang sedang diakses. Proses: MOV AX,0B800h MOV ES,AX MOV BX,3998 MOV CX,25 Register ES, pelajar pakai sebagai penunjuk segment layar, yaitu pada segment B800h. Register BX yang nantinya akan pelajar pakai sebagai penunjuk offset dari ES diberi nilai 3998. sehingga pasangan ES:BP akan menunjuk pada huruf dipojok kanan bawah atau posisi 79,24. UlangY : MOV PosY,CL PUSH CX MOV CX,80 UlangX : CMP BYTE PTR ES:[BX],33 JB Tdk Geser PosY Tdk : SUB BX,2 LOOP UlangX POP CX LOOP UlangY EXIT: INT 20h END TData lalu lakukanlah proses dengan melihat apakah ada huruf atau tidak. ini dapat dilakukan dengan membandingkannya dengan kode ASCII 33, bila data pada buffer layar dibawah ASCII 33 artinya tidak ada huruf pada layar. bila ada huruf pada layar maka proses geser dilakukan, sebaliknya bila tidak ada huruf proses akan menuju pada posisi selanjutnya dan melakukan hal yang sama. BIOS menyediakan suatu fungsi yang dapat dipakai untuk mengulung layar dengan batasan yang pelajar tentukan. sedang aturan pemakaian dari interupsi ini yaitu: INPUT: AH = Diisi dengan 6 untuk menggulung layar keatas, untuk menggulung layar kebawah diisi dengan 7. AL = Banyaknya pergeseran yang akan dilakukan. bila diisi dengan nol, maka seluruh isi window akan dihapus. CH = Posisi baris kiri atas window CL = Posisi kolom kiri atas window DH = Posisi baris kanan bawah window DL = Posisi kolom kanan bawah window BH = Atribut yang akan mengisi hasil penggulungan window Sesudah semuanya kita persiapkan lakukan lah interupsi 10h. kita bisa membersihkan layar dengan fungsi ini dengan meletakkan 0 pada register AL, dan membuat window pada posisi 0,0 dan 79,24. DELAY MACRO ; Macro untuk menunda program LOCAL Ulang PUSH CX XOR CX,CX Ulang: LOOP Ulang POP CX ENDM Scrool MACRO X1,Y1,X2,Y2,Arah PUSH CX MOV AH,Arah ; Servis Gulung keatas atau kebawah MOV AL,1 ; Jumlah Baris MOV CL,X1 ; Kolom kiri atas MOV CH,Y1 ; Baris kiri Atas MOV DL,X2 ; Kolom kanan bawah MOV DH,Y2 ; Baris kanan bawah MOV BH,01000111b ; Atribut hasil penggulungan INT 10h POP CX ENDM ;/========================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses G_Atas EQU 6 ; Servis untuk menggulung ke atas G_Bawah EQU 7 ; Servis untuk menggulung ke bawah Proses: MOV CX,7 Ulang: Scrool 20 7 60 14 G_Bawah delay LOOP Ulang INT 20h END TData program 18.3. Mengulung layar Bila program 18.3. kita jalankan, maka pada layar akan tampak seperti gambar kode 18.2. <<< Gbr183.PIX >>> gambar kode 18.3. Hasil eksekusi program 18.3. Untuk memindahkan posisi kursor, seperti dengan perintah GOTOXY pada pascal, bisa kita pakai interupsi dari BIOS. Interupsi yang dipakai yaitu interupsi 10h dengan aturan pemakaian: INPUT: AH = 2 DH = Posisi Baris(00-24) DL = Posisi Kolom(00-79) BH = Halaman layar(0=default) sedang contoh dari pemakaian fungsi ini dalam bentuk macro yaitu: GOTOXY MACRO X,Y MOV AH,02 XOR BX,BX MOV DH,Y MOV DL,X INT 10h (100) ENDM seperti dengan fungsi WhereX dan WhereY dalam pascal, didalam assembler kita juga bisa mengetahui posisi dari kursor. Untuk itu sudah tersedia interupsi 10h dari BIOS dengan aturan pemakaian: INPUT: OUTPUT: AH = 03 DH = Posisi Baris BH = Halaman Layar(0=default) DL = Posisi Kolom sedang contoh pemakaian fungsi ini dalam bentuk macro bisa kita lihat sebagai berikut: WherePos MACRO X,Y MOV AH,03 MOV BH,0 MOV X,DL MOV Y,DH ENDM Dewasa ini, menu-menu yang disabila n oleh program yang besar hampir semuanya dalam bentuk menu sorot. Kini dengan sedikit pengetahuan mengenai memory layar akan pelajar buat suatu menu sorot yang sederhana. Menu ini bisa dikembangkan atau dipakai untuk program yang kita buat. Cls MACRO ; Macro untuk menghapus layar MOV AX,0600h XOR CX,CX MOV DX,184Fh MOV BH,10 ; Atribut Hijau diatas hitam INT 10h ENDM GotoXY MACRO X,Y ; Macro untuk memindahkan kursor MOV AH,02 XOR BX,BX MOV DH,Y MOV DL,X INT 10h ENDM SimpanL MACRO ; Macro untuk menyimpan seluruh LOCAL Ulang ; isi layar monitor MOV AX,0B800h MOV ES,AX MOV CX,4000 XOR BX,BX Ulang: MOV AL,ES:[BX] MOV Layar[BX],AL INC BX LOOP Ulang ENDM BalikL MACRO ; Macro untuk mengembalikan semua LOCAL Ulang ; isi layar yang sudah disimpan MOV CX,4000 XOR BX,BX Ulang: MOV AL,Layar[BX] MOV ES:[BX],AL INC BX LOOP Ulang ENDM Sorot MACRO X,Y ; Macro untuk membuat sorotan LOCAL Ulang ; pada menu MOV BL,Y MOV AL,160 MUL BL MOV BX,AX MOV AL,X MOV AH,2 MUL AH ADD BX,AX INC BX ; Alamat warna pada posisi X,Y MOV CX,25 ; Panjangnya sorotan Ulang: MOV BYTE PTR ES:[BX],4Fh ; Atribut sorotan ; putih diatas merah ADD BX,2 LOOP Ulang ENDM Readkey MACRO ; Macro untuk membaca masukan dari MOV AH,00 ; keyboard. INT 16h ; hasilnya AH=Extended, AL=ASCII ENDM MenuL MACRO String ; Macro untuk mencetak menu MOV AH,09 LEA DX,String INT 21h ENDM ;/=======================/; .MODEL SMALL .CODE ORG 100h TData: JMP Proses Layar DB 4000 DUP (?) Menu DB 9,9,'+=============================+',13,10 DB 9,9,'| »»» MENU SOROT ««« |',13,10 DB 9,9,'+=============================+',13,10 DB 9,9,'| |',13,10 DB 9,9,'| 1. Pilihan pertama |',13,10 DB 9,9,'| 2. Pilihan Kedua |',13,10 DB 9,9,'| 3. Pilihan Ketiga |',13,10 DB 9,9,'| 4. Pilihan Keempat |',13,10 DB 9,9,'| |',13,10 DB 9,9,'+=============================+$' PosX DB 22 ; Posisi kolom mula-mula PosY DB 12 ; Posisi baris mula-mula Panah_Atas EQU 72 ; Kode tombol panah atas Panah_Bawah EQU 80 ; Kode tombolpanah bawah TEnter EQU 0Dh ; Kode tombol Enter Proses : Cls ; Hapus layar GotoXY 0 8 ; kursor = 0,8 MenuL Menu ; gambar kode menu SimpanL ; Simpan isi layar Ulang : BalikL ; Tampilkan isi layar yang ; disimpan Sorot PosX,PosY ; Sorot posisi X,Y Masukan: Readkey ; Baca masukan dari keyboard CMP AH,Panah_Bawah ; Panah bawah yang ditekan ? JE Bawah ; Ya! lompat bawah CMP AH,Panah_Atas ; Panah atas yang ditekan ? JE CekY ; Ya, lompat CekY CMP AL,TEnter ; Tombol enter yang ditekan ? JNE Masukan ; Bukan, lompat ke ulangi JMP Selesai ; Ya, lompat ke selesai CekY : CMP PosY,12 ; Apakah sorotan paling atas ? JE MaxY ; Ya! lompat ke MaxY DEC PosY ; Sorotkan ke atas JMP Ulang ; Lompat ke ulang MaxY : MOV PosY,15 ; PosY=Sorotan paling bawah JMP Ulang ; lompat ke ulang Bawah : CMP PosY,15 ; apakah sorotan paling bawah ? JE NolY ; Ya! lompat ke NolY INC PosY ; Sorotkan ke bawah JMP Ulang ; Lompat ke ulang NolY : MOV PosY,12 ; Sorotan paling atas JMP Ulang ; Lompat ke ulang Selesai: INT 20h END TData program 18.4. Membuat Menu Sorot Bila program 18.4. dijalankan, maka kita akan memperoleh suatu menu sorot yang menarik, seperti pada gambar kode 18.4. <<< Gbr184.PIX >>> gambar kode 18.4. Hasil eksekusi program 18.4. sudah pelajar bahas bahwa pada normalnya satu layar memakai 4000 byte memory. namun memory yang disediakan untuk layar ini sebetulnya malah beberapa kali lipat lebih banyak dari 4000 byte, sebab nya terciptalah apa yang dinamakan 'paging' atau halaman tampilan layar. Banyaknya halaman tampilan ini sangat bervariasi sebab tergantung jumlah memory yang tersedia dan jumlah memory yang dipakai oleh satu halaman tampilan. Untuk alamat awal dari masing-masing halaman tampilan bisa kita lihat pada gambar kode 18.5. +----------+--------------+ | Halaman | 80 X 25 | +----------+--------------+ | 0 | B800:0000h | | 1 | B800:1000h | | 2 | B800:2000h | | 3 | B800:3000h | | 4 | B800:4000h* | | 5 | B800:5000h* | | 6 | B800:6000h* | | 7 | B800:7000h* | +----------+--------------+ Ket : * tidak berlaku pada CGA gambar kode 18.5. Alamat Awal Halaman Tampilan Untuk mengakses memory halaman tampilan yang lain pada modus teks, rumus yang sudah pelajar buat terdahulu bisa kita perbaharui menjadi: Offset huruf = (Baris * 160)+(Kolom * 2) + (Halaman*1000h) Offset Atribut = (Baris * 160)+(Kolom * 2)+1+(Halaman*1000h) Secara default halaman tampilan yang dipakai yaitu halaman tampilan ke 0, yang beralamat awal pada B800:0000h. Untuk merubah halaman tampilan yang aktif ini bisa kita pakai servis 5 dari interupsi 10h. sedang aturan pemakaian servis ini yaitu: INPUT: AH = 5 AL = Nomor halaman tampilan yang akan diaktifkan Delay MACRO Rep ; Macro ini untuk menunda program LOCAL Ulang PUSH CX MOV DX,Rep SUB CX,CX Ulang: LOOP Ulang DEC DX CMP DX,0 JNZ Ulang POP CX ENDM Ak_Page MACRO No ; Macro ini dipakai untuk MOV AH,5 ; mengaktifkan halaman layar MOV AL,No INT 10h ENDM ;/========================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kal0 DB 'INI yaitu HALAMAN TAMPILAN KE 2 ',13,10 DB ' DENGAN ALAMAT AWAL B800:1000h !!! $' Proses: Ak_Page 2 ; Aktifkan halaman layar yang ke 2 MOV AH,09 ; LEA DX,Kal0 ; Tulis kalimat pada halaman ke 2 INT 21h ; MOV CX,3 ; Banyaknya pengulangan Ulang: Ak_Page 2 ; Aktifkan halaman ke 2 Delay 100 Ak_Page 0 ; Aktifkan halaman ke 0 Delay 100 LOOP Ulang INT 20h END Tdata program 18.5. Halaman Layar Bila program 18.5. kita jalankan, maka dapat kita lihat perpindahan halaman aktif dari halaman tampilan 0 (default DOS) dan halaman tampilan 2. Catatan: Bila kita melakukan CLS dengan DOS, maka hanya halaman tampilan aktif yang akan terhapus, sedang data pada halaman tampilan yang lain akan tetap. Pada modus teks, huruf tersusun atas titik-titik yang dinamakan pixel. Pixel-pixel yang membentuk huruf - huruf ini disimpan dalam tabel. pada EGA ada 4 buah tabel, sedang pada VGA ada 8 buah tabel huruf (Masing- masing 8 KB). huruf yang ditampilkan pada layar monitor diambil dari tabel-tabel yang membentuk huruf ini. Secara default tabel yang akan dipakai yaitu tabel ke nol(0). Bila monitor kita yaitu monitor EGA keatas, maka bentuk huruf bisa diubah dengan mengubah isi dari tabel yang menyusun huruf ini. Untuk itu BIOS sudah menyediakan interupsi 10h, service 11h, subservis 00 untuk keperluan ini. sedang aturan dari pemakaiannya yaitu: INPUT: AH = 11h AL = 00h CX = Jumlah bentuk huruf yang akan diganti DX = Kode ASCII huruf awal yang akan diganti BL = Nomor tabel huruf yang diubah BH = Jumlah byte perhuruf ES:BP = Alamat buffer pola huruf ;/================================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Tabel DB 00011000b ; __ DB 00011000b ; __ DB 10011001b ; _ __ _ DB 11111111b ; ________ DB 10011001b ; _ __ _ DB 00011000b ; __ DB 00011000b ; __ DB 00011000b ; __ DB 00011000b ; __ DB 00011000b ; __ DB 00011000b ; __ DB 00011000b ; __ DB 00011000b ; __ DB 00011000b ; __ DB 00011000b ; __ DB 00001000b ; _ Proses : MOV AX,1100h ; Servis MOV DX,'A' ; huruf ASCII awal yang akan diganti MOV CX,1 ; Banyaknya huruf yang akan diganti MOV BL,0 ; Nomor blok pemuatan huruf MOV BH,16 ; Jumlah byte perhuruf LEA BP,Tabel ; Lokasi tabel INT 10h INT 20h END TData program 18.6. Merubah bentuk huruf Bila program 18.6. dijalankan, maka semua huruf "A" akan akan segera berubah bentuknya menjadi berbentuk pedang(gambar kode 18.6.). <<<< Gbr186.PIX >>>> gambar kode 18.6. Hasil eksekusi program 18.6. Huruf-huruf yang dipakai akan kembali normal, bila dilakukan pergantian mode. Cobalah kita buat sebuah program yang akan mengganti mode layar dan lihatlah hasil yang akan terjadi sesudah membaca bagian 18.10 dibawah ini. Suatu subsistem video bisa memiliki lebih dari satu mode video, namun hanya satu mode yang dapat aktif pada satu saat. Banyaknya mode video yang ada pada suatu jenis subsistem tergantung pada adapter yang dipakai. Makin canggih adapter yang dipakai, makin banyak pula mode video yang didukungnya. Untuk lebih jelasnya mengenai mode video ini dapat dilihat pada gambar kode 18.7. +------+--------+---------+-----------+----------+----------+ | Mode | Teks/ | Jumlah | Resolusi | Sistem | Jumlah | | | Grafik | Warna/ | | Video | Halaman | | | | Mono | | | Tampilan | +------+--------+---------+-----------+----------+----------+ | 00h | T | Gray | 40X 25 | CMEV | 8 | | 01h | T | 16 | 40X 25 | CMEV | 8 | | 02h | T | Gray | 80X 25 | CMEV | 8 | | 03h | T | 16 | 80X 25 | CMEV | 8 | | 04h | G | 4 | 320X200 | CMEV | 1 | | 05h | G | Gray | 320X200 | CMEV | 1 | | 06h | G | 2 | 640X200 | CMEV | 1 | | 07h | T | Mono | 80X 25 | DEV | 8 | | 0Dh | G | 16 | 320X200 | EV | 8 | | 0Eh | G | 16 | 640X200 | EV | 4 | | 0Fh | G | Mono | 640X350 | EV | 2 | | 10h | G | 16 | 640X350 | EV | 2 | | 11h | G | Mono | 640X480 | MV | 1 | | 12h | G | 16 | 640X480 | V | 1 | | 13h | G | 256 | 320X200 | MV | 1 | +------+--------+---------+-----------+----------+----------+ Ket. C = CGA (Color Graphics Adapter) M = MCGA (Memory Controller Card Array) D = MDA (Monochrome Display Adapter) E = EGA (Enchanced Graphics Adapter) V = VGA (Video Graphics Array) gambar kode 18.7. Tabel Mode Video