Bab ini berfokus pada instruksi perpindahan data. Instruksi perpindahan data mencakup MOV, MOVSX, MOVZX, PUSH, POP, BSWAP, XCHG, XLAT, IN, OUT, LEA, LDS, LES, LFS, LGS, LSS, LAHF, SAHF, serta instruksi string MOVS, LODS, STOS, INS, dan OUTS. Instruksi transfer data terbaru yang diimplementasikan pada Pentium Pro dan seterusnya adalah instruksi CMOV (conditional move). Instruksi perpindahan data disajikan lebih dulu karena instruksi ini lebih sering digunakan dalam program dan mudah dipahami.
Mikroprosesor memerlukan program assembler yang menghasilkan bahasa mesin, karena instruksi bahasa mesin terlalu rumit untuk dibuat secara manual dengan efisien. Bab ini menjelaskan sintaks bahasa assembly dan beberapa direktifnya. [Teks ini mengasumsikan bahwa pengguna sedang mengembangkan perangkat lunak pada komputer pribadi IBM atau klonnya. Disarankan menggunakan Microsoft MACRO Assembler (MASM) sebagai alat pengembangan, tetapi Intel Assembler (ASM), Borland Turbo Assembler (TASM), atau perangkat lunak serupa juga dapat digunakan dengan baik. Versi terbaru TASM sepenuhnya meniru program MASM. Teks ini menyajikan informasi yang berfungsi dengan assembler Microsoft MASM, namun sebagian besar program dapat di-assemble tanpa modifikasi menggunakan assembler lain. Lampiran A menjelaskan assembler Microsoft dan memberikan detail tentang program linker.]
Sebagai alternatif yang lebih modern, Visual Express compiler dan assembler inline-nya juga dapat digunakan sebagai sistem pengembangan. Keduanya dijelaskan secara rinci dalam teks ini.
Setelah menyelesaikan bab ini, Anda akan dapat:
Menjelaskan cara kerja setiap instruksi perpindahan data dengan mode pengalamatan yang sesuai.
Menjelaskan tujuan dari pseudo-operations bahasa assembly dan kata kunci seperti ALIGN, ASSUME, DB, DD, DW, END, ENDS, ENDP, EQU, .MODEL, OFFSET, ORG, PROC, PTR, SEGMENT, USE16, USE32, dan USES.
Memilih instruksi bahasa assembly yang sesuai untuk menyelesaikan tugas perpindahan data tertentu.
Menentukan opcode simbolik, sumber, tujuan, dan mode pengalamatan untuk instruksi bahasa mesin heksadesimal.
Menggunakan assembler untuk menyusun data segment, stack segment, dan code segment.
Menunjukkan cara membuat sebuah procedure menggunakan PROC dan ENDP.
Menjelaskan perbedaan antara memory models dan definisi full-segment pada assembler MASM.
Menggunakan Visual online assembler untuk melakukan tugas perpindahan data.
A. Sejarah Singkat Perkembangan Komputer [kembali]
B. Istilah-Istilah pada Komputer
Bahasa mesin adalah kode biner asli yang dipahami oleh mikroprosesor dan digunakan sebagai instruksinya untuk mengendalikan operasi. Instruksi bahasa mesin untuk 8086 hingga Core2 bervariasi dalam panjangnya, mulai dari 1 hingga 13 byte. Walaupun bahasa mesin tampak rumit, sebenarnya ada keteraturan dalam bahasa mesin mikroprosesor ini. Ada lebih dari 100.000 variasi instruksi bahasa mesin, sehingga tidak ada daftar lengkap dari semua variasi tersebut. Oleh karena itu, beberapa bit biner dalam instruksi bahasa mesin sudah tetap, sementara bit sisanya ditentukan untuk setiap variasi instruksi.
Instruksi untuk 8086 hingga 80286 adalah instruksi dalam mode 16-bit yang berbentuk seperti pada Gambar 4–1(a). Instruksi mode 16-bit kompatibel dengan 80386 dan seterusnya jika diprogram untuk berjalan dalam mode instruksi 16-bit, tetapi bisa juga diberi awalan (prefix), seperti ditunjukkan pada Gambar 4–1(b). Pada 80386 dan yang lebih baru, semua instruksi dianggap sebagai instruksi mode 16-bit saat mesin dijalankan dalam real mode (DOS). Dalam protected mode (Windows), byte atas dari descriptor berisi D-bit yang memilih antara mode instruksi 16-bit atau 32-bit. Saat ini, hanya Windows 95 hingga Windows XP serta Linux yang berjalan dalam mode instruksi 32-bit. Bentuk instruksi mode 32-bit ditunjukkan pada Gambar 4–1(b).
Dua byte pertama dari format instruksi mode 32-bit disebut override prefixes karena tidak selalu ada. Prefix pertama mengubah ukuran alamat operand yang digunakan oleh instruksi, dan prefix kedua mengubah ukuran register.
Jika 80386 hingga Pentium 4 dijalankan sebagai mesin dalam mode instruksi 16-bit (real mode atau protected mode) dan register 32-bit digunakan, maka register-size prefix (66H) ditambahkan di depan instruksi. Jika dijalankan dalam mode instruksi 32-bit (protected mode saja) dan register 32-bit digunakan, prefix ukuran register tidak ada. Namun, jika register 16-bit muncul dalam instruksi pada mode instruksi 32-bit, maka prefix ukuran register hadir untuk memilih register 16-bit. Prefix ukuran alamat (67H) digunakan dengan cara yang serupa, seperti yang dijelaskan lebih lanjut pada bab ini. Prefix ini berfungsi untuk menukar ukuran register dan alamat operand dari 16-bit ke 32-bit atau dari 32-bit ke 16-bit pada instruksi yang diberi prefix.
Perlu dicatat bahwa mode instruksi 16-bit menggunakan register dan mode pengalamatan 8- dan 16-bit, sedangkan mode instruksi 32-bit secara default menggunakan register dan mode pengalamatan 8- dan 32-bit. Prefix digunakan untuk menimpa (override) pengaturan default ini, sehingga register 32-bit dapat digunakan dalam mode 16-bit atau register 16-bit dapat digunakan dalam mode 32-bit. Mode operasi (16 atau 32 bit) harus dipilih sesuai dengan aplikasi yang sedang dijalankan. Jika aplikasi banyak menggunakan data 8- dan 32-bit, maka mode 32-bit sebaiknya dipilih; sebaliknya, jika data 8- dan 16-bit lebih dominan, maka mode 16-bit lebih tepat. Biasanya, pemilihan mode ini ditentukan oleh sistem operasi. (Ingat bahwa DOS hanya dapat berjalan dalam mode 16-bit, sementara Windows dapat berjalan dalam kedua mode.)
C. Perkembangan Mikroprosessor Intel
Opcode memilih operasi (penjumlahan, pengurangan, perpindahan, dan sebagainya) yang dilakukan oleh mikroprosesor. Untuk sebagian besar instruksi bahasa mesin, opcode terdiri dari 1 atau 2 byte. Gambar 4–2 menunjukkan bentuk umum dari byte opcode pertama untuk banyak (tapi tidak semua) instruksi bahasa mesin. Di sini, 6 bit pertama dari byte pertama adalah binary opcode. Dua bit sisanya menunjukkan arah (D)—jangan disamakan dengan bit mode instruksi (16/32) atau bit arah (direction flag) yang digunakan dengan instruksi string—dari aliran data, dan juga menunjukkan apakah data berupa byte atau word (W). Pada 80386 dan seterusnya, baik word maupun doubleword dapat ditentukan. Mode instruksi dan register-size prefix (66H) menentukan apakah W merepresentasikan word atau doubleword.
Jika D-bit diatur, maka aliran data menuju ke register (REG field) dari R/M field yang terletak pada byte kedua instruksi. Jika D-bit direset, maka aliran data menuju ke R/M field dari REG field. Jika W-bit diatur, ukuran data adalah word atau doubleword; jika W-bit direset, ukuran data selalu berupa byte. Bit W muncul pada sebagian besar instruksi, sedangkan bit D muncul terutama pada instruksi MOV dan beberapa instruksi lain.
Lihat Gambar 4–3 untuk pola bit biner dari byte opcode kedua (reg-mod-r/m) pada banyak instruksi. Gambar tersebut menunjukkan lokasi bidang MOD (mode), REG (register), dan R/M (register/memory).
D. Diagram Blok Sistem Komputer
MOD Field
MOD field menentukan mode pengalamatan (addressing mode) untuk instruksi yang dipilih. MOD field memilih jenis pengalamatan dan apakah ada displacement (pergeseran alamat) pada jenis pengalamatan tersebut. Tabel 4–1 mencantumkan bentuk operand yang tersedia untuk MOD field pada mode instruksi 16-bit, kecuali jika operand address-size override prefix (67H) digunakan.
Jika MOD field berisi 11, maka memilih mode pengalamatan register. Pengalamatan register menggunakan R/M field untuk menentukan register, bukan lokasi memori.
Jika MOD field berisi 00, 01, atau 10, maka R/M field memilih salah satu mode pengalamatan memori.
00 → mode pengalamatan memori tanpa displacement.
01 → mode pengalamatan memori dengan displacement 8-bit (ditandai sign-extended).
10 → mode pengalamatan memori dengan displacement 16-bit.
Contoh:
MOV AL, [DI]
→ tanpa displacementMOV AL, [BX+08H]
→ menggunakan displacement 8-bitMOV AL, [BP+1234H]
→ menggunakan displacement 16-bit
Semua displacement 8-bit diubah menjadi 16-bit oleh mikroprosesor saat instruksi dijalankan.
Jika displacement 8-bit adalah 00H–7FH (positif), akan diubah menjadi 0000H–007FH sebelum dijumlahkan ke alamat offset.
Jika displacement 8-bit adalah 80H–FFH (negatif), akan diubah menjadi FF80H–FFFFH.
Proses ini disebut sign-extension, yaitu menyalin bit tanda (sign-bit) ke byte orde lebih tinggi, sehingga menghasilkan 00H atau FFH pada byte berikutnya. Beberapa program assembler tidak menggunakan displacement 8-bit dan secara default menggunakan displacement 16-bit.
Pada mikroprosesor 80386 hingga Core2, MOD field dapat sama seperti pada Tabel 4–1 untuk mode instruksi 16-bit. Jika mode instruksi 32-bit, MOD field mengikuti Tabel 4–2. Interpretasi MOD field ditentukan oleh address-size override prefix atau mode operasi mikroprosesor.
Perubahan interpretasi MOD field ini mendukung banyak mode pengalamatan tambahan yang tersedia pada 80386 hingga Core2. Perbedaan utama:
Jika MOD = 10, displacement 16-bit menjadi displacement 32-bit, sehingga memungkinkan akses ke lokasi memori protected mode sebesar 4 GB.
Pada mode instruksi 32-bit, hanya displacement 8-bit atau 32-bit yang diizinkan, kecuali ada address-size override prefix.
Jika displacement 8-bit digunakan, mikroprosesor akan sign-extend menjadi displacement 32-bit.
E. Fungsi dan Operasi Dasar Mikroprosesor [kembali]
1. Instruksi MOV (Revisited)
MOV adalah instruksi paling sering dipakai.
Fungsi: menyalin data dari operand sumber (source) ke tujuan (destination).
MOV adalah instruksi paling sering dipakai.
Fungsi: menyalin data dari operand sumber (source) ke tujuan (destination).
Bentuk umum:
Aturan:
Operand sumber tidak berubah.
Tidak bisa langsung memindahkan memori → memori.
Ukuran operand harus sama (8-bit dengan 8-bit, 16-bit dengan 16-bit, dst.).
Immediate value hanya boleh dipindahkan ke register atau memori, bukan sebaliknya.
Contoh:
64-bit mode (Pentium 4 & Core2):
Register tambahan: R8–R15 (64-bit).
Instruksi MOV dapat menggunakan operand 64-bit penuh.
Contoh:
MOV RAX, RBX
.
2. Instruksi Stack: PUSH & POP
Stack adalah area memori khusus (LIFO: Last In, First Out).
Dipakai untuk penyimpanan sementara, passing parameter, atau menyimpan alamat saat CALL/RET.
PUSH operand
Menyimpan data ke stack.
SP/ESP/RSP berkurang → data masuk ke alamat baru.
POP operand
Mengambil data dari stack.
SP/ESP/RSP bertambah → data dipindahkan ke operand tujuan.
Contoh:
Catatan penting:
Stack harus diinisialisasi dengan benar menggunakan SS (Stack Segment) + SP/ESP.
PUSH/POP bisa bekerja untuk register 8-bit, 16-bit, 32-bit, hingga 64-bit (tergantung prosesor).
3. Load Effective Address (LEA dan Variannya)
LEA (Load Effective Address):
Memasukkan alamat efektif dari operand ke register, bukan nilai operand.
Contoh:
LDS, LES, LFS, LGS, LSS:
Mengisi register general-purpose sekaligus register segment tertentu.
Contoh:
LEA (Load Effective Address):
Memasukkan alamat efektif dari operand ke register, bukan nilai operand.
Contoh:
LDS, LES, LFS, LGS, LSS:
Mengisi register general-purpose sekaligus register segment tertentu.
Contoh:
Instruksi ini berguna untuk pemrosesan pointer, array, dan struktur data.
4. Instruksi String Data Transfers
Instruksi string digunakan untuk menyalin atau memproses blok data besar.
Instruksi ini bekerja dengan register SI (Source Index) dan DI (Destination Index), serta DS:SI (sumber) dan ES:DI (tujuan).
a. Direction Flag (DF)
DF=0 → pemrosesan maju (alamat bertambah).
DF=1 → pemrosesan mundur (alamat berkurang).
Diatur dengan instruksi:
DF=0 → pemrosesan maju (alamat bertambah).
DF=1 → pemrosesan mundur (alamat berkurang).
Diatur dengan instruksi:
b. Instruksi Utama
LODS (Load String)
Memindahkan byte/word/dword dari DS:SI → AL/AX/EAX.
STOS (Store String)
Menyimpan AL/AX/EAX → ES:DI.
MOVS (Move String)
Menyalin dari DS:SI → ES:DI.
CMPS (Compare String)
Membandingkan data di DS:SI dengan ES:DI.
SCAS (Scan String)
Membandingkan AL/AX/EAX dengan string di ES:DI.
INS / OUTS
Transfer string dari/ke port I/O.
LODS (Load String)
Memindahkan byte/word/dword dari DS:SI → AL/AX/EAX.
STOS (Store String)
Menyimpan AL/AX/EAX → ES:DI.
MOVS (Move String)
Menyalin dari DS:SI → ES:DI.
CMPS (Compare String)
Membandingkan data di DS:SI dengan ES:DI.
SCAS (Scan String)
Membandingkan AL/AX/EAX dengan string di ES:DI.
INS / OUTS
Transfer string dari/ke port I/O.
c. Prefix REP
Digunakan untuk mengulang instruksi string otomatis.
REP → ulangi sampai CX/ECX/RCX = 0.
REPE/REPZ → ulangi jika ZF=1.
REPNE/REPNZ → ulangi jika ZF=0.
Digunakan untuk mengulang instruksi string otomatis.
REP → ulangi sampai CX/ECX/RCX = 0.
REPE/REPZ → ulangi jika ZF=1.
REPNE/REPNZ → ulangi jika ZF=0.
Contoh:
5. Instruksi Data Transfer Lainnya
Instruksi Fungsi XCHG Menukar isi dua operand. Contoh: XCHG AX, BX
. LAHF/SAHF Transfer sebagian register FLAG ke AH, dan sebaliknya. XLAT Translasi byte: AL = [BX+AL] (lookup table). IN / OUT Baca/tulis data dari/ke port I/O. Contoh: IN AL, 60H
. MOVSX Salin data dengan sign-extension (memperluas bit tanda). MOVZX Salin data dengan zero-extension (bit tambahan = 0). BSWAP Membalik urutan byte dalam register 32-bit. Contoh: 12345678H → 78563412H. CMOVcc Conditional move (memindahkan data hanya jika kondisi terpenuhi, misalnya ZF=1).
Instruksi | Fungsi |
---|---|
XCHG | Menukar isi dua operand. Contoh: XCHG AX, BX . |
LAHF/SAHF | Transfer sebagian register FLAG ke AH, dan sebaliknya. |
XLAT | Translasi byte: AL = [BX+AL] (lookup table). |
IN / OUT | Baca/tulis data dari/ke port I/O. Contoh: IN AL, 60H . |
MOVSX | Salin data dengan sign-extension (memperluas bit tanda). |
MOVZX | Salin data dengan zero-extension (bit tambahan = 0). |
BSWAP | Membalik urutan byte dalam register 32-bit. Contoh: 12345678H → 78563412H. |
CMOVcc | Conditional move (memindahkan data hanya jika kondisi terpenuhi, misalnya ZF=1). |
6. Segment Override Prefix
Normalnya, instruksi memakai segment register default (misalnya DS untuk data, ES untuk tujuan string).
Dengan prefix ini, programmer bisa memaksa penggunaan segment lain.
Contoh:
Normalnya, instruksi memakai segment register default (misalnya DS untuk data, ES untuk tujuan string).
Dengan prefix ini, programmer bisa memaksa penggunaan segment lain.
Contoh:
7. Detail Assembler
Bab ini juga membahas directives assembler yang digunakan untuk mengatur kode program:
DB, DW, DD → mendefinisikan data (byte, word, doubleword).
ORG → menentukan alamat awal.
SEGMENT / ENDS → mendefinisikan segmen kode, data, atau stack.
ASSUME → memberitahu assembler register segment mana yang dipakai.
Contoh program sederhana:
Program di atas menampilkan string "HELLO" menggunakan DOS interrupt.
8. Ringkasan Bab
Instruksi MOV adalah dasar semua pemindahan data.
PUSH/POP digunakan untuk stack (penyimpanan sementara & subroutine).
LEA, LDS, LES, dst. untuk menangani alamat & segment register.
Instruksi string (MOVS, LODS, STOS, CMPS, SCAS) sangat penting untuk operasi blok data.
Instruksi tambahan (XCHG, XLAT, MOVSX, MOVZX, BSWAP, CMOV) memperluas kemampuan manipulasi data.
Segment override memungkinkan fleksibilitas pengaksesan data lintas segmen.
Assembler directives membantu menyusun program secara rapi dan terstruktur.
Instruksi MOV adalah dasar semua pemindahan data.
PUSH/POP digunakan untuk stack (penyimpanan sementara & subroutine).
LEA, LDS, LES, dst. untuk menangani alamat & segment register.
Instruksi string (MOVS, LODS, STOS, CMPS, SCAS) sangat penting untuk operasi blok data.
Instruksi tambahan (XCHG, XLAT, MOVSX, MOVZX, BSWAP, CMOV) memperluas kemampuan manipulasi data.
Segment override memungkinkan fleksibilitas pengaksesan data lintas segmen.
Assembler directives membantu menyusun program secara rapi dan terstruktur.
Tabel Ringkasan Instruksi Data Movement
Instruksi Fungsi Utama Catatan MOV Menyalin data antar register/memori Tidak bisa memori ↔ memori langsung PUSH Simpan data ke stack SP/ESP/RSP turun POP Ambil data dari stack SP/ESP/RSP naik LEA Ambil alamat efektif Untuk pointer & array LDS/LES/LFS/LGS/LSS Load register + segment Digunakan untuk pointer LODS Ambil string → accumulator DS:SI → AL/AX/EAX STOS Simpan accumulator → string AL/AX/EAX → ES:DI MOVS Pindahkan string DS:SI → ES:DI CMPS Bandingkan string DS:SI dengan ES:DI SCAS Scan string Bandingkan dengan accumulator INS / OUTS Transfer string ke/dari port I/O Untuk operasi hardware XCHG Tukar data Bisa register ↔ register/memori LAHF/SAHF Transfer sebagian flag AH ↔ FLAG XLAT Translasi byte Lookup table IN/OUT Akses port I/O AL/AX/EAX ↔ port MOVSX Sign-extension Perluasan bit tanda MOVZX Zero-extension Perluasan dengan nol BSWAP Balik urutan byte Hanya 32-bit register CMOVcc Conditional move Alternatif untuk conditional jump
Instruksi | Fungsi Utama | Catatan |
---|---|---|
MOV | Menyalin data antar register/memori | Tidak bisa memori ↔ memori langsung |
PUSH | Simpan data ke stack | SP/ESP/RSP turun |
POP | Ambil data dari stack | SP/ESP/RSP naik |
LEA | Ambil alamat efektif | Untuk pointer & array |
LDS/LES/LFS/LGS/LSS | Load register + segment | Digunakan untuk pointer |
LODS | Ambil string → accumulator | DS:SI → AL/AX/EAX |
STOS | Simpan accumulator → string | AL/AX/EAX → ES:DI |
MOVS | Pindahkan string | DS:SI → ES:DI |
CMPS | Bandingkan string | DS:SI dengan ES:DI |
SCAS | Scan string | Bandingkan dengan accumulator |
INS / OUTS | Transfer string ke/dari port I/O | Untuk operasi hardware |
XCHG | Tukar data | Bisa register ↔ register/memori |
LAHF/SAHF | Transfer sebagian flag | AH ↔ FLAG |
XLAT | Translasi byte | Lookup table |
IN/OUT | Akses port I/O | AL/AX/EAX ↔ port |
MOVSX | Sign-extension | Perluasan bit tanda |
MOVZX | Zero-extension | Perluasan dengan nol |
BSWAP | Balik urutan byte | Hanya 32-bit register |
CMOVcc | Conditional move | Alternatif untuk conditional jump |
Kesimpulan:
Instruksi data movement adalah pondasi utama pemrograman assembly. Tanpa instruksi ini, prosesor tidak dapat mengambil data untuk diproses atau menyimpan hasil perhitungan. Mulai dari instruksi sederhana seperti MOV, hingga instruksi string kompleks dengan REP, semuanya dirancang untuk memberikan fleksibilitas maksimum dalam pemindahan data antar register, memori, dan I/O.
Tidak ada komentar:
Posting Komentar