Introduction
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.
Tujuan
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]
MOV ULANGAN
Instruksi MOV, yang telah diperkenalkan pada Bab 3, menjelaskan beragam mode pengalamatan dari 8086 hingga Core2. Pada bab ini, instruksi MOV memperkenalkan instruksi bahasa mesin yang tersedia dengan berbagai mode pengalamatan dan instruksi. Bahasa mesin diperkenalkan karena terkadang perlu untuk menafsirkan program bahasa mesin yang dihasilkan oleh assembler atau inline assembler Visual. Menafsirkan bahasa asli mesin (machine language) memungkinkan proses debugging atau modifikasi pada level bahasa mesin. Sesekali, patch bahasa mesin dibuat dengan menggunakan program DEBUG yang tersedia di DOS dan juga di Visual untuk Windows, yang memerlukan sedikit pengetahuan tentang bahasa mesin. Konversi antara instruksi bahasa mesin dan bahasa assembly dijelaskan pada Lampiran B.
B. Istilah-Istilah pada Komputer [kembali]
Bahasa Mesin
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 [kembali]
Opcode
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 [kembali]
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 1
Format Keterangan MOV reg, regSalin isi register ke register lain MOV reg, memSalin isi memori ke register MOV mem, regSalin isi register ke memori MOV reg, immMasukkan nilai langsung ke register MOV mem, immMasukkan nilai langsung ke memori
| Format | Keterangan |
|---|---|
MOV reg, reg | Salin isi register ke register lain |
MOV reg, mem | Salin isi memori ke register |
MOV mem, reg | Salin isi register ke memori |
MOV reg, imm | Masukkan nilai langsung ke register |
MOV mem, imm | Masukkan nilai langsung ke memori |
📑 Tabel 2
Format Keterangan MOV Sreg, reg/memPindahkan data ke segment register MOV reg/mem, SregPindahkan data dari segment register
| Format | Keterangan |
|---|---|
MOV Sreg, reg/mem | Pindahkan data ke segment register |
MOV reg/mem, Sreg | Pindahkan data dari segment register |
📑 Tabel 3 – Instruksi PUSH
Format Keterangan PUSH regSimpan isi register ke stack PUSH memSimpan isi memori ke stack PUSH immSimpan immediate ke stack PUSH SregSimpan segment register ke stack
| Format | Keterangan |
|---|---|
PUSH reg | Simpan isi register ke stack |
PUSH mem | Simpan isi memori ke stack |
PUSH imm | Simpan immediate ke stack |
PUSH Sreg | Simpan segment register ke stack |
📑 Tabel 4 – Instruksi POP
Format Keterangan POP regAmbil data dari stack ke register POP memAmbil data dari stack ke memori POP SregAmbil data dari stack ke segment reg
| Format | Keterangan |
|---|---|
POP reg | Ambil data dari stack ke register |
POP mem | Ambil data dari stack ke memori |
POP Sreg | Ambil data dari stack ke segment reg |
📑 Tabel 5 – PUSHA/POPA, PUSHAD/POPAD
Format Keterangan PUSHASimpan semua register umum 16-bit ke stack POPAAmbil semua register umum 16-bit dari stack PUSHADSimpan semua register umum 32-bit ke stack POPADAmbil semua register umum 32-bit dari stack
| Format | Keterangan |
|---|---|
PUSHA | Simpan semua register umum 16-bit ke stack |
POPA | Ambil semua register umum 16-bit dari stack |
PUSHAD | Simpan semua register umum 32-bit ke stack |
POPAD | Ambil semua register umum 32-bit dari stack |
📑 Tabel 6 – Instruksi LEA
Format Keterangan LEA reg, memMemasukkan alamat efektif operand ke reg
| Format | Keterangan |
|---|---|
LEA reg, mem | Memasukkan alamat efektif operand ke reg |
📑 Tabel 7 – Load Far Pointer
Format Keterangan LDS reg, memIsi reg umum + DS dari memori LES reg, memIsi reg umum + ES dari memori LFS reg, memIsi reg umum + FS dari memori LGS reg, memIsi reg umum + GS dari memori LSS reg, memIsi reg umum + SS dari memori
| Format | Keterangan |
|---|---|
LDS reg, mem | Isi reg umum + DS dari memori |
LES reg, mem | Isi reg umum + ES dari memori |
LFS reg, mem | Isi reg umum + FS dari memori |
LGS reg, mem | Isi reg umum + GS dari memori |
LSS reg, mem | Isi reg umum + SS dari memori |
📑 Tabel 8 – LODS
Format Keterangan LODSBAmbil byte dari DS:SI ke AL LODSWAmbil word dari DS:SI ke AX LODSDAmbil dword dari DS:SI ke EAX
| Format | Keterangan |
|---|---|
LODSB | Ambil byte dari DS:SI ke AL |
LODSW | Ambil word dari DS:SI ke AX |
LODSD | Ambil dword dari DS:SI ke EAX |
📑 Tabel 9 – STOS
Format Keterangan STOSBSimpan AL ke ES:DI STOSWSimpan AX ke ES:DI STOSDSimpan EAX ke ES:DI
| Format | Keterangan |
|---|---|
STOSB | Simpan AL ke ES:DI |
STOSW | Simpan AX ke ES:DI |
STOSD | Simpan EAX ke ES:DI |
📑 Tabel 10 – MOVS
Format Keterangan MOVSBSalin byte dari DS:SI ke ES:DI MOVSWSalin word dari DS:SI ke ES:DI MOVSDSalin dword dari DS:SI ke ES:DI
| Format | Keterangan |
|---|---|
MOVSB | Salin byte dari DS:SI ke ES:DI |
MOVSW | Salin word dari DS:SI ke ES:DI |
MOVSD | Salin dword dari DS:SI ke ES:DI |
📑 Tabel 11 – CMPS
Format Keterangan CMPSBBandingkan byte DS:SI dengan ES:DI CMPSWBandingkan word DS:SI dengan ES:DI CMPSDBandingkan dword DS:SI dengan ES:DI
| Format | Keterangan |
|---|---|
CMPSB | Bandingkan byte DS:SI dengan ES:DI |
CMPSW | Bandingkan word DS:SI dengan ES:DI |
CMPSD | Bandingkan dword DS:SI dengan ES:DI |
📑 Tabel 12 – SCAS
Format Keterangan SCASBBandingkan AL dengan isi di ES:DI SCASWBandingkan AX dengan isi di ES:DI SCASDBandingkan EAX dengan isi di ES:DI
| Format | Keterangan |
|---|---|
SCASB | Bandingkan AL dengan isi di ES:DI |
SCASW | Bandingkan AX dengan isi di ES:DI |
SCASD | Bandingkan EAX dengan isi di ES:DI |
📑 Tabel 13 – INS
Format Keterangan INSBBaca byte dari port ke ES:DI INSWBaca word dari port ke ES:DI INSDBaca dword dari port ke ES:DI
| Format | Keterangan |
|---|---|
INSB | Baca byte dari port ke ES:DI |
INSW | Baca word dari port ke ES:DI |
INSD | Baca dword dari port ke ES:DI |
📑 Tabel 14 – OUTS
Format Keterangan OUTSBKirim byte dari DS:SI ke port OUTSWKirim word dari DS:SI ke port OUTSDKirim dword dari DS:SI ke port
| Format | Keterangan |
|---|---|
OUTSB | Kirim byte dari DS:SI ke port |
OUTSW | Kirim word dari DS:SI ke port |
OUTSD | Kirim dword dari DS:SI ke port |
📑 Tabel 15 – XCHG
Format Keterangan XCHG reg, regTukar isi dua register XCHG reg, memTukar isi register dengan memori
| Format | Keterangan |
|---|---|
XCHG reg, reg | Tukar isi dua register |
XCHG reg, mem | Tukar isi register dengan memori |
📑 Tabel 16 – XLAT
Format Keterangan XLATAL = [BX+AL] atau [EBX+AL] (lookup table)
| Format | Keterangan |
|---|---|
XLAT | AL = [BX+AL] atau [EBX+AL] (lookup table) |
📑 Tabel 17 – LAHF/SAHF
Format Keterangan LAHFCopy sebagian flags → AH SAHFCopy AH → sebagian flags
| Format | Keterangan |
|---|---|
LAHF | Copy sebagian flags → AH |
SAHF | Copy AH → sebagian flags |
📑 Tabel 18 – PUSHF/POPF dan Variannya
Format Keterangan PUSHFSimpan flags 16-bit ke stack POPFAmbil flags 16-bit dari stack PUSHFDSimpan flags 32-bit ke stack POPFDAmbil flags 32-bit dari stack PUSHFQSimpan flags 64-bit ke stack POPFQAmbil flags 64-bit dari stack
| Format | Keterangan |
|---|---|
PUSHF | Simpan flags 16-bit ke stack |
POPF | Ambil flags 16-bit dari stack |
PUSHFD | Simpan flags 32-bit ke stack |
POPFD | Ambil flags 32-bit dari stack |
PUSHFQ | Simpan flags 64-bit ke stack |
POPFQ | Ambil flags 64-bit dari stack |
📑 Tabel 19 – IN dan OUT
Format Keterangan IN AL, imm8Baca byte dari port ke AL IN AX/EAX, DXBaca word/dword dari port ke AX/EAX OUT imm8, ALKirim AL ke port OUT DX, AX/EAXKirim AX/EAX ke port
| Format | Keterangan |
|---|---|
IN AL, imm8 | Baca byte dari port ke AL |
IN AX/EAX, DX | Baca word/dword dari port ke AX/EAX |
OUT imm8, AL | Kirim AL ke port |
OUT DX, AX/EAX | Kirim AX/EAX ke port |
📑 Tabel 20 – MOVSX dan MOVZX
Format Keterangan MOVSX reg, reg/memCopy operand kecil ke besar dengan sign-extension MOVZX reg, reg/memCopy operand kecil ke besar dengan zero-extension
| Format | Keterangan |
|---|---|
MOVSX reg, reg/mem | Copy operand kecil ke besar dengan sign-extension |
MOVZX reg, reg/mem | Copy operand kecil ke besar dengan zero-extension |
📑 Tabel 21 – BSWAP
Format Keterangan BSWAP reg32Balik urutan byte dalam reg 32-bit BSWAP reg64Balik urutan byte dalam reg 64-bit
| Format | Keterangan |
|---|---|
BSWAP reg32 | Balik urutan byte dalam reg 32-bit |
BSWAP reg64 | Balik urutan byte dalam reg 64-bit |
📑 Tabel 22 – CMOVcc
| Format | Keterangan |
|---|---|
CMOVE reg, reg/mem | Salin jika ZF=1 (equal) |
CMOVNE reg, reg/mem | Salin jika ZF=0 (not equal) |
CMOVG/CMOVGE | Salin jika lebih besar/lebih besar sama (signed) |
CMOVL/CMOVLE | Salin jika lebih kecil/lebih kecil sama (signed) |
CMOVA/CMOVAE | Salin jika di atas/di atas sama (unsigned) |
CMOVB/CMOVBE | Salin jika di bawah/di bawah sama (unsigned) |
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 |
Penjelasan Gambar
| Penjelasan Gambar | ||
|---|---|---|
| Nomor Gambar | Judul Gambar | Isi Visual | Penjelasan |
|---|---|---|---|
| Figure 4–1 | Formats of 8086–Core2 Instructions | (a) Format instruksi 16-bit (Opcode, MOD-REG-R/M, Displacement, Immediate); (b) Format instruksi 32-bit (Address size, Register size, Opcode, MOD-REG-R/M, Scaled Index, Displacement, Immediate) | Instruksi 16-bit lebih sederhana (1–6 byte), instruksi 32-bit lebih fleksibel (1–15 byte) dengan dukungan displacement/immediate lebih panjang dan index scaling. |
| Figure 4–2 | Byte 1 of machine instructions | Byte pertama instruksi: Opcode + D + W | D-bit: arah transfer (0=REG→R/M, 1=R/M→REG). W-bit: ukuran data (0=byte, 1=word). Contoh: MOV AL,BL (D=1, W=0). |
| Figure 4–3 | Byte 2 of machine instructions | Byte kedua: MOD (2 bit), REG (3 bit), R/M (3 bit) | MOD: mode addressing (register, displacement, memori). REG: register tujuan/sumber. R/M: operand register atau memori. |
| Figure 4–4 | Instruksi MOV BP,SP (Register ke Register) | Opcode=100010, D=1, W=1, MOD=11, REG=101 (BP), R/M=100 (SP) | Instruksi MOV BP,SP → memindahkan isi register SP ke BP. |
| Figure 4–5 | MOV DL,[DI] | Byte 1 (Opcode, D=1, W=0), Byte 2 (MOD=00, REG=010, R/M=101) | Instruksi memindahkan data dari memori[DI] ke DL. |
| Figure 4–6 | MOV [1000H],DL | Byte 1 (Opcode, D=0, W=0), Byte 2 (MOD=00, R/M=110), Byte 3–4 (displacement=1000H) | Instruksi menyimpan isi DL ke alamat memori 1000H. |
| Figure 4–7 | MOV [BP],DL | Byte 1 (Opcode, D=0, W=0), Byte 2 (MOD=01, REG=010, R/M=110), Byte 3 (displacement=00H) | Instruksi menyimpan DL ke alamat [BP+00H]. Kasus khusus karena BP. |
| Figure 4–8 | Scaled-index byte | Byte terdiri dari s (scale), Index, Base | Digunakan di mode 32-bit untuk addressing dengan faktor pengali index. Contoh: [EAX + EBX*4]. |
| Figure 4–9 | MOV WORD PTR [BX+1000H],1234H | 6 byte: Opcode, MOD-REG-R/M, Displacement (low+high), Immediate data (low+high) | Instruksi menyimpan 1234H ke memori dengan alamat BX+1000H. |
| Figure 4–10 | MOV BX,CS | Byte 1 (Opcode), Byte 2 (MOD=11, REG=CS, R/M=BX) | Instruksi memindahkan nilai CS ke BX. |
| Figure 4–11 | REX prefix (tanpa scaled index) | Prefix REX (0100WRXB) + Opcode + MOD-REG-R/M | Digunakan di mode 64-bit untuk memperluas register (R8–R15) dan addressing 64-bit. W=64-bit operand size, R=extend reg, X=extend index, B=extend base. |
| Gambar | Instruksi/Topik | Penjelasan |
|---|---|---|
| 4–12 | REX prefix & scaled-index byte (64-bit mode) | Menunjukkan struktur REX prefix dan hubungannya dengan opcode, MOD/REG/RM, serta scaled-index. REX digunakan untuk mengakses register tambahan (R8–R15) dan memungkinkan pengalamatan kompleks dengan skala (Scale, Index, Base). |
| 4–13 | PUSH AX |
Menunjukkan efek instruksi PUSH AX pada ESP dan memori stack. Nilai AX (6AB3H) disalin ke stack pada alamat 37FFH dan 37FEH, sementara ESP berkurang 2. |
| 4–14 | PUSHA |
Menunjukkan urutan penyimpanan semua register 16-bit (AX, CX, DX, BX, SP, BP, SI, DI) ke dalam stack. Setelah PUSHA, SP disesuaikan kembali. |
| 4–15 | POP BX |
Menunjukkan instruksi POP BX, di mana nilai dari stack (392FH) dipindahkan ke BX, lalu ESP bertambah 2 untuk menunjukkan stack pointer naik. |
| 4–16 | PUSH CX |
Menunjukkan sifat siklik stack. Nilai register CX (A037H) dipush ke alamat paling atas stack (1FFFFH), membuktikan bahwa bagian bawah stack terhubung ke atasnya. |
| 4–17 | LDS BX,[DI] |
Instruksi ini memuat BX dari alamat 11002H dan 11003H, serta memuat DS dari 11004H dan 11005H. Hasilnya BX berubah ke 1274H dan DS ke 3000H. |
| 4–18 | LODSW |
Instruksi LODSW memuat word dari DS:SI ke AX. Pada contoh, isi memori 11000H (32H) dan 11001H (A0H) masuk ke AX. Setelahnya SI otomatis bertambah 2. |
| 4–19 | XLAT |
Instruksi XLAT mengganti isi AL dengan byte dari tabel pencarian yang beralamat [BX+AL]. Contoh: sebelum eksekusi AL=05H, setelah eksekusi AL berisi 6DH dari memori [BX+AL]. |
| 4–20 | OUT 19H, AX |
Menunjukkan transfer data dari AX ke port I/O dengan alamat 0019H. Data bergerak lewat bus data (D0–D15), alamat port lewat bus alamat (A0–A15), dan sinyal kontrol IOWC digunakan untuk menulis ke port. |
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.





















0 comments:
Posting Komentar