Anda di halaman 1dari 37
Snr BAB 3 Instruksi Pemindahan Data ES PENDAHULUAN Dalam bab ini, kita akan mempelajari semua instruksi pemindahan data 8086/ 8088. Ini mencakup: MOV, PUSH, POP, XCHG, XLAT, IN, OUT, LEA, LDS, LES, LAH, SAHF dan string MOVS, LODS, dan instruksi STOS. Kami menya- Jikan instruksi pemindahan data pertama karena mereka mungkin paling sering digunakan dan paling mudah dipahami dan dikuasai. Kami juga akan mempelajari secara rinci beberapa pseudo-operasi bahasa rakitan. Mikroprosesor 8086/8088 hampir selalu membutuhkan suatu tipe perakit Karena instruksi bahasa mesin begitu kompleks untuk dibentuk. (Teks ini meng- anggap bahwa si pemakai sedang mengembangkan software bahasa rakitan pada komputer personal IBM dengan perakit MACRO atau sistem software yang mi- rip. Apendiks di belakang menjelaskan secara singkat perakit itu dan memberikan suatu rincian mengenai linker). Akhimya, kami akan menjelaskan format yang diminta untuk menghasilkan instruksi bahasa mesin, karena kadang-kadang jika perlu kita menginterpretasi- kan suatu dump heksadesimal dari kode mesin. TUJUAN Setelah mempelajari bab ini, anda akan mampu: 64 Instruksi Pemindahan Data 65 1. Menjelaskan operasi setiap instruksi pemindahan data dengan semua mode addressing yang bisa diterapkan. 2. Menjelaskan tujuan dari beberapa pseudo operasi bahasa rakitan dan kata- kata kunci seperti EQU, DB, DW, DD, ALIGN, OFFSET, ASSUME, ORG. 3. Dengan tugas pemindahan data tertentu, anda bisa memilih instruksi bahasa rakitan 8086/8088 yang tepat untuk mendapatkannya. 4. Dengan instruksi bahasa mesin heksadesimal, anda bisa tentukan opcode simbolis, sumber, tujuan dan mode addressing. ee MOV YANG DIULANG Kita menggunakan instruksi MOV dalam Bab 2 untuk menjelaskan mode ad- dressing 8086/8088. Dalam bab ini, kita akan menggunakannya untuk menjelas- kan bentuk bahasa mesin yang tersedia bagi si programer untuk berbagai mode addressing. Kita memperkenalkan kode mesin karena kadang-kadang kita perlu menginterpretasikan bila suatu program yang dihasilkan oleh sebuah perakit membutuhkan instruksi bahasa rakitan dalam Apendiks A. Bahasa Mesin Instruksi bahasa mesin untuk 8086/8088 bervariasi panjangnya mulai dari | hingga 6 bytes. Meskipun tampaknya ini adalah suatu pengaturan yang tidak bisa diatasi, terdapat suatu urutan untuk bahasa mesin mikroprosesor ini. Pertama, byte 1 dari semua instruksi bahasa mesin adalah opcode, yang me- nunjukkan operasi (penambahan, pengurangan, dsb), yang dilakukan oleh mikro- prosesor. Gambar 3-1 menggambarkan bentuk umum opcode untuk sebagian besar instruksi bahasa mesin 8086/8088. Di sini 6 bit pertama dari byte | adalah opcode, dan yang sisanya 2 bit menunjukkan arah (D) dari arus data dan apakah data itu adalah byte atau kata (W). Jika D = 1, arus data ke register (REG) yang diuraikan dalam byte 2, dan jika D = O, arus data dari register yang diuraikan da- lam byte 2. Jika W = 0, opcode melakukan operasi pada byte, dan jika W = 1, opcode beroperasi pada kata. Gambar 3-2 menggambarkan byte 2, yang digunakan untuk menguraikan mode operasi (MOD), register (REG), dan lokasi memori atau register (R/M) di mana dia beroperasi. 66 Pengantar Mikroprosesor MOD Field, Mod field memilih salah satu dari berbagai macam bentuk ad- dressing dan displacement atau operasi untuk instruksi. Bentuk-bentuk ini dicatat dalam Tabel 3-1. Jika MOD field mengandung 11, R/M field dari byte 2 mena- ngani suatu register, dan jika MOD field mengandung 00, 01, atau 10, R/M me- ngacu pada satu dari sejumlah mode operasi memori-addressing, Bila MOD me- milih mode addressing memori, dia menunjukkan bahwa mode addressing tidak mengandung (00), suatu displacement tanda yang diperluas (01), atau displace- ment 16-bit (10). piw Opeode GAMBAR 3-1 Byte I dari sejumlah instruksi bahasa mesin, yang menggambarkan posisi opcode, D, dan W. MOD REG GAMBAR 3-2. Byte 2 dari sejumlah instruksi bahasa mesin, menggambarkan posisi MOD, REG, dan R/M field. mop OPERATION 00 No displacement on S-bit sign-extended displacement 10 16-bit displacement 1" A register — TABEL 3-1 Spesifikasi field MOD Instruksi Pemindahan Data 67 Semua displacement 8-bit diperluas dengan tanda menjadi displacement 16- bit di dalam mikroprosesor 8086/8088. Jika displacement 8-bit adalah OOH-7FH (positif), dia diperluas dengan tanda menjadi 0000H-007FH, dan jika dia 80H- FFH (negatif), dia diperluas dengan tanda menjadi FF80H-FFFH. Dengan kata lain, bila sebuah bilangan diperluas dengan tanda, bit tanda dikopi ke dalam byte order yang lebih tinggi berikutnya. Register Assignments. Tabel 2-3 mencatat register assignment untuk field REG maupun field R/M jika MOD = 11. Perhatikan bahwa tabel ini berisi dua daftar register assignment: satu digunakan jika W = 1 untuk kata-kata, dan yang satunya digunakan bila W = 0 untuk bytes. Misalkan instruksi 2-byte, 8BECH ditemukan dalam sebuah prigram bahasa mesin, Instruksi ini diubah ke dalam biner dan ditempatkan di format instruksi untuk bytes 1 dan 2 seperti yang digambarkan pada Gambar 3-3. Opcode adalah 100010. Jika anda melihat Apendiks A, yang mencatat instruksi bahasa mesin, anda akan melihat bahwa ini adalah opcode untuk instruksi KOV. Juga perhatikan bahwa baik bit D maupun W adalah 1, yang berarti bahwa kata dipindahkan ke dalam register yang dijelaskan di dalam field REG. REG berisi 101, yang menun- jukkan register BP, sehingga instruksi MOV memindahkan data ke dalam BP. Karena field MOD berisi 11, field R/M menunjukkan suatu register. R/M = 100 (SP), sehingga instruksi ini memindahkan data dari SP dan BP dan ditulis dalam bentuk simbolis sebagai MOV BP.SP. R/M Memori Addressing. Sika field MOD berisi 00, 01, atau 10, maka field R/M mempunyai arti yang baru. Tabel 3-3 mencatat mode-mode addressing-me- mori untuk field R/M. Perhatikan bahwa semua mode addressing yang ditunjukkan dalam Bab 2 di- catat di dalam tabel ini. Displacement yang dibahas dalam Bab 2 ditentukan oleh field MOD. Jika MOD = 00 dan RM = 101, mode addressing adalah [D1], namun jika MOD = 01 atau 10, maka mode addressing adalah, misalnya, displacement [DI atau DATA(DI). Mode Addressing Khusus. Ada mode addressing khusus yang tidak muncul dalam Tabel 3-1, 3-2, atau 3-3, yang digunakan bila data memori ditunjukkan hanya oleh displacement — misalnya, instruksi MOV (1000H), DL atau MOV DATA, DL. Instruksi dalam contoh pertama memindahkan isi DL ke dalam lokasi memori yang ditangani oleh jumlah displacement 1000H dn DS x 10H. 68 Pengantar Mikroprosesor Opcoue D w op REG RAL [laos 1 T tot Opeade = MOV REG = BP R/M = SP "REG? Mis regiver Gambar 3-3 menggambarkan versi bahasa mesin dari instruksi MOV DL. [DI]. Instruksi ini panjangnya 2 bytes dan memiliki opcode 100010.D = I (untuk meregister dari R/M), MOD = 00 (tidak ada displacement), REG = 010 (DL), dan R/M = 101 [DI]. TF _ Code W = 0 (Byte) o11 100 101 110. 11 AL cL OL BL AH CH DH BH AX cx Dx BX sP BP st o W = 7 (Word) eT TABEL 3-2 REG dan R/M Assignment (bila MOD = 11) W=0 (byte), Bila suatu instruksi memiliki hanya satu displacement, field MOD selalu 00 dan field R/M selalu 110. Kombinasi ini diharapkan akan menunjukkan bahwa in- struksi itu tidak memiliki displacement dan menggunakan mode addressing (BP), namun anda sebenarnya tidak bisa menggunakan mode addressing (BP) tanpa displacement. Perakit melakukan hal ini dengan menggunakan secara otomatis suatu displacement 8-bit (MOD = 01) ooH bila bentuk addressing (BP) digunakan —(BP +0). Gambar 3-5 menggambarkan pola bit biner yang dibutuhkan untuk memecah- kan kode (encode) MOV [1000H], instruksi DL ke dalam bahasa mesin. Jika individual tidak mengetahui bentuk khusus addressing ini, instruksi ini dianggap tidak benar sebagai MOV [BP],DL. Instruksi Pemindahan Data 69 —_——_ Code Function 000 {Bx + SI] 001 (BX + DI] 010 (er + Sl] ont (BP + On 100 (sil 101 (oH 110 (ery a1 {Bx} ——_——_— "See text under Special Addressing Mode. TABEL 3-3 Mode-mode addressing-memori R/M Gambar 3-6 menunjukkan bentuk apa yang dihasilan oleh perakit untuk in- struksi MOV[BP},DL. Ini adalah instruksi 3-byte dengan byte ketiga digunakan sebagai displacement 00H. Instruksi Immediate (Langsung). Misalkan bahwa instruksi MOV WORD PTR [BX + 1000H], 1234H dikodekan ke dalam bahasa mesin. Instruksi ini me- mindahkan 1234E1 ke dalam kata memori yang ditangani oleh jumlah 1000H, BX, dan DS x 10H. Instruksi 6-byte menggunakan 2 bytes untuk menguraikan opcode, D, W, MOD, REG dan R/M; 2 bytes untuk nilai data 1234H, dan 2 bytes untuk nilai displacement 1000H. Gambar 3-7 menggambarkan pola bit yang diberikan pada setiap 6 bytes instruksi ini. Instruksi MOV Segmen. Tika isi register segmen dipindahkan oleh instruksi MOV, PUSH atau POP, suatu set register bit khusus (field REG) memilih register segmen yang tepat (lihat Tabel 3-4). Gambar 3-8 | menggambarkan instruksi MOV BX,CS. Perhatikan bahwa op- code untuk tipe MOV ini berbeda dengan instruksi MOV lainnya yang dibahas sejauh ini. Meskipun ini belum merupakan pembahasan yang lengkap mengenai koding bahasa mesin, namun ini akan merupakan suatu awal yang baik dalam pemrogra- man bahasa mesin. Ingat, program ini selalu ditulis dalam bahasa mesin simbolik (bahasa rakitan) dan diterjemahkan oleh sebuah program yang disebut assembler 70 Pengantar Mikroprosesor Opcode DW MOD REG RM CC Opcode = Mov D = To register (REG) W = Byte MOD = No displacement REG = DL RIM = [DI] IDO DOCNOE GAMBAR 3-4 Instruksi MOV DL,[DI] dikodekan ke dalam bahasa mesin biner, Opcode DW MOD REG RM Byte 1 Byte 2 eee 09000000 0//oav0to0000 Byte 3 Byte 4 GAMBAR 3-5 _Instruksi MOV [1000H], DL dikodekan ke dalam bahasa mesin biner. Perhatikan ‘bahwa dua bytes tambahan dibutuhkan untuk displacement 1000H. Opode «DW MOD REG RM [vototo"ofofo] [ov tfo op o Bye | Byte 2 S-bit displacement oo0000000 Byte 3 GAMBAR 3-6 _Instruksi MOV,DL dikodekan ke dalam bahasa mesin biner membutuhkan dis- placement I-byte 00H agar 8086/8088 bisa melakukan instruksi itu. Instruksi Pemindahan Data 71 opcode W MOD eM Bye 1 Bue? Dinplacement—How Diplacement—high 0000000 0;/j00010000 Bytes Bue Data—lon Daia—mish oT oT oo] [oo 0 1.0.0 10 Bytes Byte 6 ‘Note: D and REG are not used in immediate memory addressing. GAMBAR 3.7. Kata MOV PTR[PBR + 1000H], instruksi 1234H diubah menjadi bahasa mesin biner membutuhkan 6 bytes memori: 2 untuk instruksi, 2 untuk displacement 1000H, dan 2 untuk data intermediate 1234H. Code Segment Register 000 Es 001 cs 010 ss o11 ps “MOV CS,XX and POP CS are not allowed. TABEL 3.4 Bits seleksi register segmen (perakit), atau kadang-kadang, oleh tangan pada bahasa mesin biner. Dengan 8086/8088, kita berharap sebuah perakit akan tersedia untuk perubahan karena proses ini sangat memakan waktu. 72 Pengantar Mikroprosesor 3-2 Opeode MOD REG RM rooortraolfs ootford Note: Wand D are not prevent in thts instruction. GAMBAR 3-8 _Instruksi MOV BX,CS dibuah ke dalam bahasa mesin biner. Di sini REG di-en- code sebagai register CS dan R/M di-encode sebagai register BX. PUSH/POP PUSH dan POP adalah instruksi penting yang digunakan untuk menyimpan dan menarik data dari memori stack LIFO. Mikroprosesor 8086/8088 memil empat bentuk instruksi PUSH dan POP: register, register/memori, segmen register, dan flags. Register addressing memungkinkan isi semua register 16-bit ditransfer ke atau dari stack. Register/memori addressing menyimpan baik isi dari register 16-bit maupun lokasi memori pada stack. Segmen register addressing memungkinkan setiap segmen register didorong ke atas stack dan semua kecuali kode segmen register (CS) ditarik dari stack. Bentuk yang terakhir, flag addressing, memung- kinkan register flas atau status ditransfer antara register flag dan stack. PUSH Instruksi PUSH selalu mentransfer 2 byte data ke dalam stack. Sumber datanya bisa register flag, setiap register internal 16-bit, semua register segmen, atau se- mua 2 bytes memori data. Bila data dipaksakan masuk ke dalam stack, byte data pertama (yang paling penting) disimpan di dalam segmen stack pada lokasi yang diaddress oleh SP-1. Byte data kedua (yang kurang penting) disimpan di dalam segmen stack pada lokasi yang di-addrress oleh SP-2. Setelah data disimpan dengan PUSH, register SP di-dekrementasi oleh 2. Gambar 3-9 menggambarkan operasi instruksi PUSH AX, yang mentransfer kopi dari isi register AX ke dalam stack ([SP - 1] = AH, [SP - 2] = AL, dan SP = SP - 2). Instruksi Pemindahan Data 73 Stack segment FFF Ax 6ABS L~H SE = — aS 03800 pefore PUSH AX 037FF a. 0800 ‘Riter PUSH, axt 037FE Sa _ ‘SP = 1FE c L—— oS —OooTCEerY) ps SS 0300 eee need | 03000 GAMBAR 3-9 Dampak dari instruksi PUSH AX pada register SP dan lokasi memori stack 037FFH dan 037FEH. Tabel 3-5 mencatat empat bentuk instruksi PUSH yang ada pada mikropro- sesor 8086/8088 selain juga pola bit biner setiap byte pada setiap perintah. PUSHF Instruksi PUSHF mengkopi isi dari register flag pada stack. Seperti instruksi PUSH, PUSHE menyimpan porsi yang paling penting dari flag ke dalam stack pada lokasi SP - 1 dan poris yang kurang penting pada SP - 2. Setelah menyimpan register flag, register SP didekrementasi oleh 2 POP Instruksi POP melakukan operasi inversi dari instruksi PUSH. POP memindah- kan data dari stack dan menempatkannya ke dalam register sadaran, flag atau lokasi memori kata. Seperti instruksi PUSH, POP tersedia dalam empat bentuk: register, register/memori, segmen register, dan flags. 74 Pengantar Mikroprosesor ‘Anggaplah bahwa instruksi POP BX dilakukan, Byte data pertama dipinda- hkan dari memori stack (lokasi memori yang diaddress oleh SP) dan ditempatkan dalam register BL. Byte kedua dipindahkan dari lokasi SP + 1 dan ditempatkan dalam register BH. Setelah kedua byte dipindahkan dari stack, pointer stack diinkrementasi oleh 2. Gambar 3-10 secara grafis menggambarkan operasi in- struksi POP BX. Tabel 3-6 mencatat opcode, komposisi dan contoh setiap tipe instruksi POP. Perhatikan bahwa instruksi POP CS tidak diperbolehkan. Menginisialisasi Stack Bila area stack diinisialisasi, baik register segmen stack (SS) maupun pointer stack (SP) dimasukkan, Biasanya, kita biasa menunjukkan area memori sebagai segmen stack dengan memasukkan SS dengan lokasi dasar dari segmen stack. Misalnya, jika segmen stack akan menduduki lokasi memori 10000H-1 FF- FFH, maka register SS dimasukkan dengan 1000H. (Ingat bahwa mikro- prosesor menggandakan isi dari register segmen oleh 10H untuk mendapatkan address memori segmen yang sebenarnya), Untuk memulai stack pada bagian atas segmen stack, pointer stack (SP) dimasukkan dengan 0000H. Gambar 3-11 menggambarkan bagaimana nilai ini menyebabkan data dipaksa masuk ke atas segmen stack dengan instruksi PUSH CX. Ingat bahwa semua segmen adalah bersifat siklus, yaitu lokasi atas sebuah segmen berkaitan dengan lokasi dasar segmen. ———— Symbolic Byte 1 Byte 2 Example PUSH reg 0101 Orrr PUSH BX PUSH mem 11171111 mmttQaaa_—- PUSH [BX] PUSH seg 000s s110 PUSH DS PUSHF 1001 1100 PUSHF LE _ Notes: aaa = any memory addressing mode, mm = MOD code, Mr = any 16-bit register, and ss = any segment register. TABEL 3-5 _Instruksi PUSH. Instruksi Pemindahan Data Stack segment ° 1006 Before POP BX 9, By SY a DS) s (0000 —>| GAMBAR 3-10 POP BX memindahkan 2 byte data dari segmen stack dan meletakkannya ke dalam register BX. —_—— Symbolic ‘Byte 1 Byte 2 Example POP reg 0101 tnrr POP DI POP mem 10001111 mm000aaa_ POP [DI + 2} POP seg 000s s111 POP ES POPF 1001 1101 POPF ae CO —_—_——_—_ ‘Notes: aaa = any memory addressing mode, mm = MOD code. irr = any 16-bit register, and ss = any Segment register. TABEL 3-6 _Instruksi POP — 3-3 ADDRESS LOAD-EFEKTIF ‘Ada tiga instruksi address load-efektif yang digunakan untuk memasukkan suatu register atau register dan segmen register dengan address. Perhatikan bahwa suatu OFFFF 01008 01007 01006 ‘00000 76 Pengantar Mikroprosesor ax) BX address dimasukkan ke dalam register dengan instruksi ini, bukan data dari address ini. Tabel 3-7 mencatat tiga bentuk address load-efektif yang ada pada 8086/8088. LEA Instruksi LEA digunakan untuk memasukkan suatu register dengan address data yang dijelaskan oleh operand. Seperti pada contoh dalam Tabel 3-7, address operand DATA dimasukkan ke dalam register AX, bukan isi dari address DATA. Dengan membandingkan LEA dengan MOV, kita bisa mengamati dampak berikut ini: LEA BX. [DI] memasukkan address yang dijelaskan oleh [DI] (isi dari Di) ke dalam register BX; MOV BX,[DI] memasukkan data yang tersimpan pada lokasi memori yang ditangani oleh [DI] ke dalam register BX. Sebelumnya dalam teks ini, kita mempertimbangkan beberapa contoh yang melibatkan pseudo-operasi OFFSET, yang pada dasarnya melakukan fungsi yang sama sebagai instruksi LEA untuk address operand yang lebih sederhana. Misal- Stack segment -——\ 30 7 SSS 10000 | GAMBAR 3-11 PUSH CX menggambarkan sifat siklus dari segmeri stack. Perhatikan bahwa SP dimulai pada 0000H dan, setelah didekrementasi, berakhir pada FFFEH. Instruksi Pemindahan Data 77 Symbolic Function LEA AX,DATA —_AX is loaded with the address at DATA LDS DILLIST —_DI_and DS are loaded with the address at LIST LES BX,CAT —_BX and ES are loaded with the address at CAT TABEL 3-7 _Instruksi address load-efektif. nya, MOV BX.OFFSET LIST melakukan fungsi yang sama sebagai LEA BX. LIST. Kedua instruksi ini memasukkan address offset lokasi memori LIST ke dalam register BX. Namun mengapa pseudo-operasi OFFSET tersedia jika instruksi LEA mela- kukan tugas yang sama? Pertama, OFFSET bisa digunakan hanya untuk operand yang sederhana seperti LIST, DATA, dan semacam itu. Dia tidak bisa digunakan untuk operand seperti [DI], LIST[SI]. Pseudo-operasi OFFSET lebih efsien dari- pada instruksi LEA yang sederhana. Mikroprosesor 8086/8088 membutuhkan waktu yang lebih lama untuk melaksanakan instruksi LEA BX,LIST daripada waktu yang dibutuhkannnya untuk melaksanakan MOV BX,OFFSET LIST. (LEA BX.LIST membutuhkan waktu delapan clock sedangkan MOV BX.OFF- SET LIST membutuhkan waktu empat clock.) Instruksi MOV BX.OFFSET LIST berjalan dua kali lebih cepat daripada instruksi LEA BX, LIST karena perakit menghitung address offset dan menggunakan instruksi MOV langsung untuk memasukkan BX bukan meminta mikroprosesor untuk menghitung address offset seperti halnya dia menghitung instruksi LEA. Anggaplah bahwa 8086/8088 melakukan suatu instruksi LEA BX,{DI] dan DI berisi 1000H. Karena address offset disimpan di dalam DI, mikroprosesor men- transfer kopi DI ke dalam BX. Ini dicapai dengan instruksi MOV BX,DI jika efisiensi menjadi tujuan yang ingin dicapai dalam suatu program. Contoh lain adalah LEA CX, [BX + DI]. Di sini address offset adalah jumlah BX dan DI. Pelaksanaan instruksi ini memasukan CX dengan modulo- 64K jumlah dari BX + DI. Jika BX = 1000H dan DI = 2000H, address offset dimasukkan ke dalam CX adalah 3000H, dan jika BX = 1000H dan DI = FFOOH, address offset dimasukkan ke dalam CX adalah OFOOH. Perhatikan bahwa hasilnya di sini adalah modulo-64K. (Setiap pelaksanaan hasil 16-bit dibatalkan). 78 Pengantar Mikroprosesor LDS dan LES Instruksi LDS dan LES memasukkan register 16-bit dengan address offset dan baik register segmen DS maupun ES dengan address segmen yang baru. Instruksi ini menggunakan setiap mode memori-addressing yang berlaku untuk memilih lokasi dari address offset yang baru dan bilangan segmen. Mereka tidak boleh meng- gunakan register (MOD = 11). Misalnya, seperti ditunjukkan Gambar 3-12, instruksi LDS BX,[DI] akan mentransfer bilangan 32-bit yang ditangani oleh register DI menjadi register BX dan register DS. Instruksi LDS dan LES menunjuk pada suatu segmen data baru atau segmen tambahan dan juga memasukkan register khusus dengan address offset yang baru. Kami akan menggambarkan instruksi ini pada bab ini dengan menggunakan instruksi manipulasi string. Perhatikan bahwa address yang di- Data segment 1 FFF ax ax OF2A = * a oe B 1003 0 11002 2 oF 11004 st 2A 1000 bi 1900 ee La . ne bs To00 ST _] 10000 GAMBAR 3-12 LDS BX, [DI] memasukkan register BX dari lokasi 11000H dan 11001H dan register DS dari lokasi 11002H dan 11003H. Instruksi ini akan megubah segmen data dari 10000H- 1FFFFH ke 89300H-992FFH. Instruksi Pemndahan Data 79 masukkan ke dalam register harus disimpan di dalam memori sebelum instruksi LDS dan LES bisa digunakan untuk memasukkan address dari memori. Ee TRANSFER DATA STRING Ada tiga instruksi transfer data string — LODS, STOS, dan MOVS — masing- masing memungkinkan data ditransfer dalam bentuk blok atau kelompok atau byte atau kata tunggal. Namun, sebelum kita membahas instruksi ini, marilah kita pelajari mula-mula fungsi dari flag arah (D) dan register segmen seperti yang diterapkan pada register DI dan SI untuk operasi string. Flag Arah (D) Flag Arah (D) memilih mode operasi auto-inkrementasi (D = ) atau auto-dekre- meritasi (D = 1) untuk DI dan SI selama operasi string. Flag D dibebaskan dengan instruksi CLD dan diatur dengan instruksi STD. Sebab itu CLD memilih auto- inkrementasi dan ST memilih auto-dekrementasi. Transferal suatu byte dengan instruksi string menyebabkan penambahan (auto-inkrementasi) atau pengurangan (auto-dekrementasi) 1 dari DI dan/atau SI. Transferal suatu kata menyebabkan penambahan atau pengurangan 2. Hanya register yang digunakan untuk instruksi string yang diinkrementasi atau didekre- mentasi. Jika DI digunakan namun SI tidak, maka hanya Dilah yang diinkremen- tasi atau didekrementasi bila instruksi string dilaksanakan. Di dan SI Selama pelaksanaan instruksi string, kita mungkin bisa mengakses memori melalui register DI dan SI atau keduanya, Address offset DI biasanya ditem- patkan di dalam segmen ekstra (ES), dan address offset SI di dalam segmen data (DS). Tugas segmen dari register SI mungkin diubah oleh prefiks over- ride segmen, yang dibahas dalam bagian selanjutnya dalam bab ini. DI selalu ditempatkan dalam segmen tambahan dan tidak bisa diubah ke segmen lain- nya. 80 Pengantar Mikroprosesor LODS Instruksi LODS memasukkan AL dengan byte data dari lokasi memori yang ditangani oleh SI atau AX dengan kata data yang ditangani oleh SI. Tabel 3-8 mencatat bentuk yang mungkin dari instruksi LODS. LODSB dan LODSW menyebabkan transfer byte atau kata; LODS diikuti oleh suatu operand memilih transfer byte atau kata. Operand sering dijelaskan sebagai bytes dengan DB dan sebagai kata dengan DW. DB adalah pseudo-operasi yang menjelaskan bytes dan DW adalah pseudo-operasi yang menjelaskan kata. Symbolic Function Lops AL = [SI], byte transfer Lopsw A LODS BYTE AL LODS WORD AX [SI], word transfer SI], if BYTE is defined as a byte [SI], if WORD is defined as a word TABEL 3-8 Bentuk instruksi LODS Gambar 3-13 menggambarkan dampak dari pelaksanaan instruksi LODSW jika flag D = 0, SI = 1000H, dan DS = 10000H. Di sini bilangan 16-bit disimpan pada lokasi memori 11000H dan 11001H dimasukkan ke dalam register AX. Karena flag D sama dengan 0 dan ini adalah transfer kata, isi dari SI secara otomatis diinkrementasi dengan 2 setelah AX dimasukkan dengan data memori. STOS Instruksi STOS menyimpan AL atau AX pada lokasi memori yang ditangani oleh DI pada segmen tambahan. Tabel 3-9 mencatat bentuk-bentuk yang mungkin dari instruksi STOS. Seperti halnya dengan LODS, B atau W bisa digunakan untuk menunjukkan transfer byte atau kata, atau address operand yang dijelaskan seba- gai byte atau kata yang bisa dimasukkan. STOS Dengan REP. Prefiks Ulang (REP) bisa ditambahkan pada setiap instruksi string. REP menyebabkan CX diinkrementasi dengan I setiap kali instruksi string Instrukst Pemindahan Data 81 Data segment OFF ee wf 8032 ——— Cae 2 |}———— ar a0 st gece Before LODSW = C-~~ | DLE) es ——— bs 1000 ~~ —i 11002 Hoot F000 0000, GAMBAR 3-13 Dampak dari pelaksanaan instruksi LODSW jika DS = 1000H, SI = 1000H, D = 0, 11000H = 0. ae Symbolic Function ie sTOsB [Dl] = AL, byte transfer sTosw [Dl] = AX, word transfer ‘STOS BYTE {Ol] = AL, if BYTE is defined as a byte STOS WORD [DI] = AX, if WORD is defined as a word — TABEL 3-9 Bentuk instruksi STOS yang memprefiksnya dilakukan. Ini menyebabkan operasi string terulang hingga nilai CX (count) adalah 0. 84 Pengantar Mikroprosesor Symbolic Function movss [Dl] = [SI], byte transfer Movsw [01] = [SI], word transfer MOVS BYTE1,8YTE2 [Dl] = (SI, if BYTE and BYTE2 are bytes MOVS WORD1,WORD2 [Dl] = [SI], if WORD1 and WORD2 are words TABEL 3-10 Bentuk instruksi MOV BERBAGAI MACAM INSTRUKSI TRANSFER DATA Jangan terpengaruh oleh kata “berbagai macam”. Instruksi transfer data yang dijelaskan dalam bagian ini — XCHG, LAHF, SAHF, XLAT, IN dan OUT — adalah instruksi yang sangat penting, namun, karena mereka jarang digunakan dibandingkan yang lainnya, mereka dikelompokkan bersama dalam bagian ini, XCHG Instruksi XCHG saling menukarkan isi dari setiap register dengan isi dari setiap register atau lokasi memori, tidak termasuk register segmen atau saling pertukar- an memori-ke-memori. Ini menggunakan mode addressing dalam Bab 2. Tabel 3-11 mencatat bentuk-bentuk instruksi XCHG, bersama dengan pola bit biner yang diminta untuk setiap tipe. Seperti digambarkan tabel ini, XCHG antara AX dan register 16-bit lainnya adalah operasi yang paling efisien karena dia hanya membutubkan | byte memori untuk menyimpan instruksi itu. LAHF dan SAHF LAHF dan SAHF digunakan dalam penerjemahan software 8085 ke software 8086/8088, Dengan kata lain, mereka memiliki aplikasi yang sangat sedikit dalam pemrograman 8086/8088. Khususnya, transfer LAHF dan SAHF byte flag yang kurang begitu penting (seperti 8085) ke dan dari register AH. Operasi ini, berkait- Instruksi Pemindahan Data 85 an dengan PUSH AX atau POP AX, mengemulasi instruksi PUSH PSW 8086 dan POP PSW selama posisi relatif A dan F tidak penting. Urutan instruksi dalam Contoh 3-4 menunjukkan bagaimana mengemulasi suatu PUSH PSW sehingga posisi A dan F benar. yemulating the 8085 PUSH PSW instruction 000E 9F LAHF ;transfer flags OOOF 86 C4 XCHG AL, AH jposition A and F 0011 50 PUSH AX ;save them CONTOH 3-4 XLAT Instruksi XLAT (menerjemahkan) mengubah isi register AL menjadi suatu bilan- gan yang disimpabn dalam tabel. Instruksi ini digunakan untuk melakukan teknik lookup tabel secara langsung yang mengubah dari satu kode ke kode lainnya. Instruksi XLAT mula-mula menambahkan isi AL pada isi register BX untuk membentuk address memori dalam segmen data, Dia kemudian memasukkan data yang tersimpan di dalam address ini menjadi register AL. ‘Anggaplah bahwa tabel lookup display LED 7-segmen disimpan pada TABEL lokasi dan instruski terjemahan digunakan untuk mengubah isi akumulator dari BCD menjadi kode segmen. Contoh 3-5 memberikan program singkat untuk Symbolic Byte 1 Byte 2 XCHG AX,reg 1001 Orer XCHG reg,reg 1000 O11 141 raaa XCHG reg,mem 1000 011w mmr raaa Notes: aaa = any memory addressing mode, mm = mode mode (MOD), rrr = any register except a segment reg register, and w = wordbyte, TABEL 3-11 _Instruks: XCHG 86 Pengantar Mikroprosesor AX BX cs Ds Data segment verre L~] ee AL o5 a be ro ‘ons von ia ‘ro une L—__~_) aeons ree GAMBAR 3-14 Dampak dari pelaksanaan instruksi XLAT pada titik di mana sebelum lokasi memori 6DH 1100SH dibuka tutup ke dalam register AL. jusing XLAT to convert from BCD to 7-segment code 0012 BB 000 R MOV BX,OFFSET TABLE address lookup table 0015 D7 XLAT CONTOH 3-5 mendapatkan ini. Gambar 3-14 menggambarkan operasi dari urutran ini jika TABLE = 1000H, DS = 4000H, dan nilai inisial AL = 05H ( 5 BCD). IN dan OUT Tabel 3-12 mencatat bentuk-bentuk instruksi IN dan OUT. Perhatikan bahwa isi AX atau AL hanya ditransfer antara perangkat 1/O dan mikroprosesor. IN men- Instruksi Pemindahan Data 87 transfer data dari suatu perangkat 1/O ke dalam register AL atau AX, dan OUT mentransfer data dari AL atau AX ke perangkat I/O. Dua bentuk mode atau mode port-addressing tersedia dengan instruksi IN dan OUT: fixed port dan variabel port. Addressing fixed-port memungkinkan transfer data antara AL dan AX dan address port 8-bit I/O. Ini disebut “addressing fixed-port” karena bilangan port disimpan dengan instruksi, biasanya dalam ROM, di mana bilangan port telah fix. Addressing variabel-port memungkinkan transfer data antara AL dan AX dan port address 1/O 16-bit. Ini disebut “addressing variabel-port” karena bilangan port disimpan di dalam register DX, yang diubah dengan sengaja oleh programer. Misalnya, jika instruksi OUT 19H,AL dilaksanakan, dia akan mentransfer isi AL di luar mikroprosesor ke perangkat I/O dengan address 19H. Gambar 3-15 menggambarkan bagaimana informasi ini muncul pada koneksi pin eksternal dari sistem berdasarkan mikroprosesor 8088. 3-6 PREFIKS OVERRIDE SEGMEN Prefiks override segmen, yang bisa ditambahkan pada hampir semua instruksi 8086/8088 pada setiap mode addressing-memori, memungkinkan programer me- Symbolic Function IN AL,pp 8-bit data from port pp are input to AL IN AXpp 16-bit data from port pp are input to AX IN AL,DX 8-bit data from port DX are input to AL IN AX,DX 16-bit data from port DX are input to AX OUT pp.AL 8-bit data from AL are sent to port pp OUT pp.AX 16-bit data from AX are sent to port pp OUT DX,AL, 8-bit data from AL are sent to port OX OUT DX,AX 16-bit data from AX are sent to port DX Notes: pp = an &-bit VO port address and DX = the 16-bit /O port port address held in register DX. TABEL 3-12 _Instruksi [N dan OUT 88 Pengantar Mikroprosesor D, v Contents of 1 Data bus 1 AL ! Port data i 8088 A based ' system 19H | Address bus t Ay Port address 0 wR WR x 1 Port control Io (om GAMBAR 3-15 _ Lok 8085 untuk OUT 19H,AL, fri bilangan port atau address port, data dan sinyal kontrol pada buses ngubah segmen default untuk setiap instruksi dengan menambahkan byte tambah- an (prefiks override segmen) pada awal instruksi dalam kode mesin. Misalnya, MOV AX,[DI], yang biasanya menangani data di dalam segmen data, bisa dimodifikasi ke instruksi MOV AX,ES:(DI], yang kemudian akan menangani data di dalam segmen tambahan. Tabel 3-13 mencatat beberapa instruksi yang telah diubah oleh prefiks over- ride segmen. Perhatikan bahwa sebagian besar instruksi ini memungkinkan data diakses dalam setiap segmen. Karena prefiks override segmen menambahkan sua- tu byte tambahan pada instruksi, sebaiknya kita menggunakan bentuk ini semi mal mungkin untuk memaksimalkan efisiensi software. — 3-7 DIREKTIF PERAKIT Direktif perakit adalah perintah pada perakit yang mengarahkan proses perakitan. Bagian ini menunjukkan bagaimana menggunakan direktif perakit dan bagaimana menuliskan suatu program bahasa rakitan Instruksi Pemindahan Data 89 Direktif Perakit 8086/8088 mengenal banyak direktif perakit (lihat Tabel 3-14) yang menunjukkan bagaimana suatu operand diperlakukan oleh perakit atau bagai- mana perakit menangani suatu program/ Menyimpan Data dalam Segmen Memori Direktif DB, DW, atau DD (juga DQ dan DT) menyimpan byte, kata, atau kata ganda data di dalam memori. Contoh 3-6 menggambarkan bagaimana berbagai macam data disimpan. Memori bisa disimpan untuk data masa mendatang dengan menggunakan direktif DB, DW dan DD diiktui dengan direktif duplikat (DUP). DUP sendiri menunjuk pada perakit bahwa sebuah karakter yang dikelilingi oleh () akan diduplikasi; digit di depannya menjelaskan bilangan duplikasi. Jika tanda tanya muncul di dalam tanda kurung, maka tidak ada karakter yang diduplikasi dan memori dibiarkan tetap tidak berubah. Contoh 3-7 menggambarkan beberapa contoh direktif DUP. EQU dan THIS Pernyataan equate (EQU) digunakan untuk menyamakan suatu label bilangan, ASCII, atau label ke label lainnya. Equates digunakan untuk membuat program Symbolic Segment Accessed Normal Segment MOV AX,DS:{BP] Data segment Stack segment MOV AX,ES:[8P] Extra segment Stack segment MOV AX,SS:{DI] Stack segment Data segment MOV AX,CS{SI] Code segment Data segment MOV AX,ES:LIST Extra segment Data Segment TABEL 3-13 _Instruksi yang mencakup prefiks override segmen. 90 Pengantar Mikroprosesor —_— Word Function ALIGN Starts at an even memory address ASSUME —_ Indicates where the segments are located AT Stores the segment in the memory BYTE Acts as a byte operand oB Defines a byte (8 bits) DD Defines a double word (32 bits) ba Defines quad word (64 bits) oT Defines 10 bytes (80 bits) ouP Duplicates the following character ow Defines word (16 bits) END Indicates end of listing ENDP Indicates end of procedure ENDS Indicates end of segment equ Equates FAR Acts as far memory pointer (intersegment pointer) NEAR Acts as near memory pointer (intrasegment pointer) OFFSET Specifies the offset address ORG Sets origin within segment PROC Defines beginning of procedure PTR Acts as memory pointer SEGMENT Designates start of segment STACK Indicates stack segment THIS Used as THIS BYTE or THIS WORD WORD Acts as a word operand — ‘Note: Most of these key words are accepted by most versions of the 8086/ 8088 assembler. TABEL 3-14 Direktif perakit 8086/8088 bahasa rakitan lebih jelas untuk memungkinkan debugging di kemudian hari. Contoh 3-8 memberikan beberapa contoh yang berbeda mengenai pernyataan EQU ini. Instrukst Pemindahan Data 91 osc8 OScB o5cc oscp OSCE 0sD2 osp4 ospe osce sco 0sD3 osD4 OSES 0640 jusing the DB, DW, and DD directives DB O1,2,3 DB 45H DB ’A’ DB = 11110000B DW = 12,13 DW LIST1 DW 2345H DD OFFFFH 33 bytes defined byte defined byte defined ja binary 11110000 words defined word defined as LIST1 ;word defined as 2345H ;double-word defined using the duplicate (DUP) directive 01 02 03 DATA_ONE 45 41 FO 000c 000d 05co R DATA_TWO 2345 OOOOFFFF CONTOH 3-6 00 LIST_A oooar LIST_B 22 J 00 oooag LIST_C ] oo6r LIST_D 22222222 J 0064( ZEROS 00 ] CONTOH 3-7 DB? DB 10 DUP(?) ALIGN DW 10 DUP(?) DD 22 DUP(?) DB 100 DUP(0) jreserve one byte jreserve 10 bytes reserve 10 words ;xeserve double-words #store 100 zeros Direktif THIS menunjukkan nama label tanpa menjelaskan lokasi memori yang baru. Misalnya, bila stack diinisialisasi, pointer stack (SP) ditempatkan pada 92 Pengantar Mikroprosesor using the equate statement 000A TEN EQU 10 0041 LETTER_A EQU ‘A’ 0063 COUNT EQU 99 = 000A NUMB_10 EQU 10 CONTOH 3-8 using the THIS, WORD, and BYTE directives scat 0032{ STACK_MEM DW 50 DUP (?) reserve 50 bytes 222 1 = 062c STACK_TOP EQU THIS WORD jthis is the top 062c OA DB 10 jstore a 10 = 062D DATA EQU THIS BYTE ;DATA is a byte CONTOH 3-9 bagian atas stack dengan direktif THIS dan EQU. Contoh 3-9 menunjukkan bagaimana istilah WORD digunakan dengan THIS dan EQU untuk menunjukkan bagian atas stack. Pengaturan Memori Perakit menggunakan direktif khusus untuk menginformasikan perakit mengenai segmen memori yang berbeda. Direktif SEGMENT menyebutkan awal dari se- buah segmen, dan ENDS menunjukkan akhir dari suatu segmen. Jika direktif SEGMENT dan ENDS telah menciptakan suatu segmen, pernyataan ASSUME Instruksi Pemindahan Data 93 ooo 0000 o00ar 22 000A 000c[ 0006 0022 0000 0000 48454cac4r 0005 0000 0000 0032[ oe = 0064 0064 0000 0000 0000 Bc 0064 R 0003 Bg --- R 0006 8E D8 0008 000B 8£ CO oooD 00D CONTOH 3-10 DATA_SEG LIST_A . ] LIST_B ] DATA_SEG EXTRA_SEG STRING EXTRA_SEG STACK_SEG ] STACK_TOP STACK_SEG CODE_SEG BEGIN SEGMENT DB 10 DUP (?) DW 12 DUP (6) ENDS SEGMENT DB ‘HELLO’ ENDS SEGMENT STACK DW 50 DUP (?) BQU THIS WORD ENDS SEGMENT ASSUME CS:CODE_SEG,SS:STACK_SEG ASSUME DS: DATA_SEG, ES: EXTRA_SEG PROC FAR Mov SP,OFFSET STACK_TOP Mov AX, DATA_SEG MOV DS AK MoV AX, EXTRA_SEG MoV ES,AX }Program here BEGIN CODE_SEG ENDP ENDS END BEGIN 94 Pengantar Mikroprosesor menginformasikan perakit segmen mana yang digunakan untuk segmen data, tambahan, stack dan kode. Contoh 3-10 menunjukkan bagaimana menggunakan direktif ini, Perhatikan bagaimana SEGMENRT dan ENDS menunjukkan batasan dan nama setiap seg- men dan bagaimana pemyataan ASSUME menunjukkan segmen yang digunakan dengan CS, DS, SS, dan ES. Sistem operasi biasanya memasukkan register segmen kode, namun bukan datanya, stack, dan register segmen tambahan, yang harus dimasukkan pada awal setiap program. Dalam hal ini, register AX dimuat dengan address segmen data dan kemudian dipindahkan ke DS. Perhatikan bahwa direktif OFFSET tidak digunakan di sini: perakit secara otomatis menyisipkan OFFSET untuk setiap label yang dijelaskan sebagai nama segmen. Register ES dimasukkan dengan cara yang sama. Jika anda memperhatikan dengan baik Contoh 3-10, anda akan melihat bahwa contoh ini telah dirakit sedemikian rupa sehingga sebuah program yang terakit bisa dilihat. Perhatikan bagaimana empat segmen telah dibentuk untuk contoh ini. Segmen data, yang disebut DATA-SEG, mengandung dua variabel. LIST-A dijelaskan sebagai 10 byte memori, dan LIST-B dijelaskan sebagai 12 kata memori dengan setiap kata mengandung 0006. Segmen tambahan, disebut EX- TRA-SEG mengandung string karakter ASCII yang disebut STRING. Segmen stack disebut STACK-SEG mengandung area memori yaitu 50 kata panjangnya untuk stack sistem. Pethatikan bahwa pseudo-opcode, STACK dicatat di samping SEGMENT untuk mengidentifikasi ini sebagai segmen stack untuk perakit. Ak- hirnya, segmen kode, yang disebut CODE-SEG, mengandung pernyataan AS- SUME yang digunakan untuk mengidentifikasi nama yang sebenarnya dari seg- men dan beberapa instruksi yang menginisialisasi pointer stack, segmen data, dan register segmen tambahan. Perhatikan bahwa perakit mencatat address 0064 sebagai 0064. Ini bukan error namun cara perakit itu mencatat 16-bit data. Bila program dihubungkan untuk digunkana dalam komputer penghubung itu mem- balikannya dengan menghasilkan 6400, yang merupakan bentuk yang benar un- tuk bahasa mesin 8086/8088. Jika segmen harus ditempatkan pada lokasi memori tertentu, direktif AT mengawalinya. Contoh 3-1 menunjukkan bagaimana pernyataan AT menem- patkan segmen DATA pada 0100H dengan memasukkan 0100H ke dalam register segmen sehingga segmen sebenarnya dimulai pada lokasi memori 01000H. Instruksi Pemindahan Data 95 0000 DATA_SEG SEGMENT AT 0100H 0100 ORG 100H 0100 o00ar LIST_A Dw 10 DUP (?) 222 ] 010A DATA_SEG ENDS CONTOH 3-11 Tidak hanya data dalam contoh ini yang disimpan pada address segmen 0100H, namun LIST-A juga dimulai pada address ofsset 0100H di dalam segmen data dan disimpan di dalam memori yang dimulai pada lokasi memori 01100H. Pada sebagian besar program, pernyataan AT dan ORG tidak digunakan. Subrutin/Prosedur Subrutin atau prosedur ditunjukkan oleh direktif PROC dan ENDP. PROC me- nunjukkan nama dan awal dari suatu prosedur selain juga sebagai tipenya (NEAR atau FAR). ENDP menunjukkan akhir dari suatu prosedur. 0000 ADDEM PROC FAR 0000 8B C3 aos AK, BX 0002 03 CL ADD AK, CX 0004 03 c2 ADD AK,DX 0006 cB RET 0007 ADDEM ENDP CONTOH 3-12 96 Pengantar Mikroprosesor Misainya, anggaplah bahwa isi register BX, CX dan DX harus ditambahkan dan hasilnya disimpan dalam register AX. Pencatatan prosedur ADDEM yang diberikan dalam Contoh 3-12 menunjukkan bagaimana ini diperoleh. Prosedur ADDEM dijelaskan dengan direktif PROC sebagai prosedur atau label FAR, yang bisa muncul pada semua lokasi memori di dalam mesin karena dia tersusun dari address offset dan address segmen. Prosedur atau label NEAR, sebaliknya, harus muncul dalam segmen kode yang sekarang karena addressnya tersusun dari hanya address offset. Jika sebuah label diikuti dengan tanda titik dua (), maka ini adalah label NEAR (LABEL). Jika bukan, dia adalah label FAR (LABEL). Sebagian besar label harus diikuti oleh titik dua karena jarang sekali JMP atau CALL muncul di luar segmen kode sekarang. OFFSET dan PTR Direktif OFFSET menunjukkan suatu address offset pada perakit, dan direktif PTR atau direktif pointer menunjukkan tipe data (byte atau kata). Misalnya, address DATA bisa dimasukkan ke dalam register SI dengan in- struksi MOV SLOFFSET DATA. Instruksi MOV SLDATA memasukkan isi address DATA ke dalam SI. OFFSET memasukkan address DATA. PTR digunakan bila tipe data tidak jelas bagi perakit. Misalnya, anggaplah bahwa instruksi berikut muncul di dalam sebuah program: MOV [MOV],2. Apakah instruksi ini menggerakkan 8- atau 16-bit bilangan 2 ke dalam memori? Direktif PTR dengan kata BYTE atau WORD akan menjelaskan hal ini kepada perakit. Jadi, instruksi MOV BYTE PTR{BX],2 menggerakkan 2 ke dalam lokasi memori 8-bit yang ditangani oleh BX, dan instruksi MOV WORD PTR[BX],2 menggerakkan 2 ke dalam lokasi memori 16-bit. Program Sampel Contoh 3-13 memberikan suatu program sampel yang mentransfer isi dari BLOCK! ke BLOCK2. Perhatikan bahwa instruksi REP MOVSB melakukan transfer data itu. Contoh ini menggambarkan banyak direktif dibahas di bagian ini. Perhatikan bahwa COUNT disamakan dengan 100 sehingga instruksi MOV CX, COUNT memasukkan counter untuk instruksi MOVSB yang diulangi. Juga perhatikan bahwa instruksi terakhir adalah suatu INT 21H yang mengembalikan kontrol Instruksi Pemindahan Data 97 0000 0000 0064 0000 0000 0064 0000 0000 0000 0003 0005 coos 000A oooD 0010 oo11 0014 0016 oo18 oo1a oo1a yexample program that moves 100 bytes from BLOCK1 to BLOCK2 DATA_SEG 0064( BLOCK1 22 J DATA_SEG EXTRA_SEG 0064 BLOCK2 22 ] EXTRA_SEG CODE_SEG BEGIN B8 --- R 8E DS BB --- R 8E CO BE 0000 R BF 0000 R FC BS 0064 F3/ Ad B4 4c cp 21 BEGIN CODE_SEG CONTOH 3-13 SEGMENT DB = 100 DUP (?) ENDS SEGMENT DB 100 DUP (?) ENDS SEGMENT ASSUME CS:CODE_SEG,DS:DATA_SEG, ES: EXTRA_SEG PROC FAR MOV AX, DATA_SEG MoV DS, AX MOV AK, EXTRA_SEG MOV -ES,AX MOV SI, OFFSET BLOCK MOV -DI,OFFSET BLOCK2 cLD MoV CX,100 REP MOVSB MOV AH, 4CH INT (21H ENDP ENDS END BEGIN 98 Pengantar Mikroprosesor komputer kepada DOS (disk operating system) pada personal computer jika AH = 4CH. Kami memberikan data yang lebih rinci untuk perakit dalam bagian berikutnya juga dalam apendiks. 3-8 RINGKASAN Instruksi perindahan data mentransfer data antara register, register dan memori, register dan stack, memori dan stack, I/O dan akumulator, dan flags dan stack. Instruksi perpindahan data mencakup: MOV, PUSH, POP, XXCHG, XLAT, IN, OUT, LEA, LDS, LES, LAHF, SAHF, dan instruksi string: LODS, STOS, dan MOVS. .. Byte pertama dari instruksi 8086/8088 mengandung opcode, yang menjelas- kan operasi dilakukan oleh mikroprosesor untuk instruksi yang sekarang, . Bit D dalam suatu opcode menunjukkan arah dari arus data. Jika D = 0, data mengalir dari register yang dijetaskan di dalam REG, dan jika D= 1, arus data mengarah ke register yang dijelaskan di dalam field REG dari sebuah instruksi. . Bit W dari suatu instruksi menunjukkan apakah instruksi itu beroperasi pada kata atau byte. Jika W = 1, beroperasi pada kata, dan jika W = 1 dia beroperasi pada byte. . MOD memilih mode operasional dari instruksi bahasa mesin. MOD = 00 tidak memilih displacement; MOD = 01 memilih suatu displacement sign- extended 8-bit, MOD = 10 memilih displacement 16-bit; dan MOD = 11 menunjukkan bahwa R/M field mengandung register. . Kode biner 3-bit menjelaskan REG dan R/M field bila MOD = 11. Register 8-bit adalah AL, CL, DL, BL, AH, CH, DH dan BH, dan register 16-bit adalah AX, CX, DX, BX, SP, BP, SI dan DI. Bila R/M field mengandung mode addressing-memori, kode 3-bit di dalam R/M menunjukkan salah satu mode addressing berikut ini: [BX = SI], [BX + DI}, [BP = SI}, {BP + DI], [SI], DI], [BP}, atau [BX]. . Semua data ditangani di dalam segmen data kecuali register SP atau BP digunakan untuk menyimpan address offset. Dalam dua hal ini, data dita- ngani dalam segmen stack. |. Register segmen bisa ditangani hanya oleh instruksi MOV, PUSH, atau POP. MOV CS,XX dan POP CS tidak diperbolehkan, namun register segmen lain- nya bisa menggunakan dua bentuk instruksi ini. Instruksi Pemindahan Data 99 12. 13. 20. 4 e 22. LE . Instruksi POP dan PUSH selalu mentransfer 2 byte data antara stack dan register lainnya atau lokasi memori. Bila data dipaksakan masuk ke stack, byte yang paling penting disimpan pertama, diikuti oleh byte yang kurang penting. Pointer stack kemudian didekrementasi oleh 2 setelah 2 byte dipindahkan dari stack. PUSHF dan POPF mentransfer data antara memori stack dan register flag. LEA, LDS dan LES memasukkan register atau register dan segmen register dengan address data memori. LEA memasukkan address. offset ke dalam pointer 16-bit dan juga address segmen ke dalam DS maupun ES. |. Instruksi transfer data string menggunakan register DI maupun SI atau keduanya untuk menangani data di dalam memori. Address offset DI ditempatkan di segmen tambahan, address offset di dalam segmen data untuk operasi string. Bit flag arah (D) menjelaskan apakah DI dan/atau diinkrementasi atau dekre- mentasi setelah transfer string, Jika D = 0, auto-inkrementasi dipilih, dan jika D = |, auto-dektementasi dipilih. Register ini diinkerementasi oleh 1 untuk transfer byte dan 2 untuk transfer kata. . LODS memasukkan AL atau AX dari memori yang ditangani oleh register SI; STOS menyimpan AL atau AX ke dalam lokasi memori yang ditangani oleh DI; dan MOVS mentransfer byte atau kata dari lokasi memori yang ditangani oleh SI ke dalamnya yang ditangani oleh DI. . Prefiks REP (ulang) menyebabkan setiap instruksi transfer data string mengu- angi jumlah seberapa kali yang terkandung di dalam CX. Untuk tiap ulangan, CX didekrementasi oleh 1 sehingga, jika CX menjadi 0, maka instruksi urutan berikutnya dilaksanakan dan, jika tidak, instruksi string akan mengulang. Instruksi XLAT mengubah data dalam register AL menjadi bilangan yang disimpan di lokasi yang ditangani oleh jumlah BX dan AL. . IN dan OUT digunakan untuk mentransfer data antara register AL dan register 1/O atau register AX dan I/O, Dua tipe instruksi IN dan OUT tersedia adalah: port fixed dan port variabel. Prefiks override segmen memungkinkan data ditangani oleh hampir semua in- struksi dalam setiap segmen. Misalnya, MOV AX [BX] menangani data di dalam segmen data secara default. Dia bisa menangani data dalam segmen tambahan dengan prefiks override segmen, ES: dalam contoh ini — MOV AX.ES: [BX]. Direktif perakit DB (define byte), DW (define word), DD (define double word), dan DUP (duplikat) menyimpan data secara langsung dalam memori 8086/8088. EQU menyamakan nilai atau label ke label. SEGMENT menunjukkan awal dan nama segmen; ENDS menunjukkan akhir. 100 Pengantar Mikroprosesor 24. 25. ASSUME mengarahkan perakit pada label yang digunakan untuk segmen dalam program. PROC menunjukkan awal dan nama prosedur; ENDP menunjukkan akhir. Os 3-9 PERTANYAAN DAN SOAL 1. 2. 3. 4, an le 12. ie oe Byte pertama dari setiap instruksi 8086/8088 selalu adalah Jelaskan tujuan dari bits D dan W dalam instruksi bahasa mesin. Field MOD dalam instruksi bahasa mesin menjelaskan informasi apa? Jika register field (REG) dari suatu instruksi mengandung 010 dan W = 0, register apa yang dipilih oleh instruksi? . Mode addressing-memori apa yang dijelaskan bila R/M = 001 dan MOD bits = 00? . Sebutkan register segmen default untuk: a. SO BX DI |. BP SI gaes . Ubahlan instruksi 8807H dari mesin bahas ke dalam bahasa rakitan. . Ubahlah instruksi 8B1E004CH dari bahasa mesin menjadi bahasa rakitan. ._ Jika instruksi MOV SI,[BX + 2] muncul dalam program bahasa rakitan, apa ekuivalen untuk bahasa mesinnya? ). Apakah instruksi MOV CS,AX adalah instruksi 8086/8088 yang valid? Je- laskan jawaban anda. Instruksi tipe MOV apakah yang panjangnya mencapai 6 byte? PUSH dan POP selalu mentransfer_ __jumlah bit antara register atau memori dan stack. Register segmen apakah yang mungkin tidak bisa dipop dari stack? Jelaskan fungsi tiap instruksi berikut ini: a. PUSH AX . POP SI .. PUSH [BX] |. PUSHF . POP DS enogs Instruksi Pemindahan Data 101 16. 17. 20. 21. 22. 23. 24, 25. 26. 27. 28. 29. 30. 31 32. 33. 34. 35. . Jelaskan apa yang terjadi bila instruksi PUSH BX dilaksanakan, dengan menunjukkan lokasi mana yang menerima isi BH dan BL. (Anggaplah bah- wa SP = 0100H dan SS = 0200H.) Instruksi POP selalu meninkrementasi SP dengan Nilai apa yang dimasukkan ke dalam register SP dan SS sehingga segmen stack dimulai pada lokasi 02200H dan pointer stack menangani bagian atas segmen stack? . Bandingkan operasi instruksi MOV BX, DATA dengan instruksi LEA BX,DATA. . Apa perbedaan antara instruksi LEA BX,DATA dan instruksi MOV BX,OFFSET DATA. Secara umum, mana yang lebih efisien, MOV dengan OFFSET atau instruksi LEA? Jelaskan bagaimana instruksi LDS BX,DATA beroperasi. Apa perbedaan antara instruksi LDS dan LES? Buatlah suatu urutan instruksi yang memindahkan isi lokasi memori segmen data DATA dan DATA + 1 ke BX, DX dan SI. Apa tujuan dari bit flag arah? Instruksi mana yang digunakan untuk menset dan menjelaskan bit flag arah? Instruksi string menggunakan register SI dan DI untuk menangani data pada segmen memori yang mana? Jelaskan operasi instruksi LODSB Jelaskan operasi instruksi STOSW. Apa yang diperoleh oleh prefiks ulang (REP), dan tipe instruksi apa yang bisa digunakan dengannya? Buatlah suatu urutan instruksi yang mengkopi 12 byte data dari area memori yang ditangani oleh SOURCE ke dalam area memori yang ditangani oleh DEST. Baik SOURCE maupun DEST mengandung 32-bit addresses. Ulangi Pertanyaan 30 dengan menggunakan address offset untuk SOURCE dan DEST. Pilihlah suatu instruksi bahasa rakitan yang menukar isi register BX dengan isi register SI. Akankah LAHF dan SAHF digunakan selama operasi normal 8086/8088? Jelaskan jawaban anda. Jelaskan bagaimana XLAT mengubah isi akumulator (AL). Jelaskan apa yang diperoleh oleh instruksi IN AL,12H. 102 Pengantar Mikroprosesor 36. eye 38. 39. 40. 41. 42. 43. 44, 45 Apa itu prefiks override segmen? Pilih satu instruksi yang memindahkan byte data dari lokasi memori yang ditangani oleh register BX di dalam segmen tambahan ke dalam register AH. Apa yang diperoleh oleh direktif bahasa rakitan secara umum? Jelaskan tujuan dari direktif bahasa rakitan berikut ini: DB, DW dan DD. Pilih satu direktif bahasa rakitan yang menyimpan 30 byte memori untuk LIST1. Jelaskan tujuan dari direktif EQU. SEGMENT dan ENDS digunakan untuk menset batasan segmen program bahasa rakitan 8086/8088. Bagaimana suatu segmen ditugaskan ke lokasi memori sebenarnya? Prosedur harus didahului dan diikuti oleh dua direktif bahasa rakitan yang mana? Jelaskan mengapa PTR perlu dalam instruksi bahasa rakitan berikut ini: MOV WORD PTR [DI],3. Apa yang diperoleh oleh INT 21H yang didahului oleh MOV AH,4CH pada komputer personal?

Anda mungkin juga menyukai