Rabu, 10 September 2025

Chapter 4 Data Movement Instructions


CHAPTER 4 DATA MOVEMENT INSTRUCTIONS

Laporan Akhir 1 Modul 4
Percobaan 1


1. Introduction [Kembali]

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.


2. Tujuan [Kembali]

Setelah menyelesaikan bab ini, Anda akan dapat:

  1. Menjelaskan cara kerja setiap instruksi perpindahan data dengan mode pengalamatan yang sesuai.

  2. 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.

  3. Memilih instruksi bahasa assembly yang sesuai untuk menyelesaikan tugas perpindahan data tertentu.

  4. Menentukan opcode simbolik, sumber, tujuan, dan mode pengalamatan untuk instruksi bahasa mesin heksadesimal.

  5. Menggunakan assembler untuk menyusun data segmentstack segment, dan code segment.

  6. Menunjukkan cara membuat sebuah procedure menggunakan PROC dan ENDP.

  7. Menjelaskan perbedaan antara memory models dan definisi full-segment pada assembler MASM.

  8. Menggunakan Visual online assembler untuk melakukan tugas perpindahan data.


A. Sejarah Singkat Perkembangan Komputer [kembali]


3. MOV Ulangan [Kembali]
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 


4. Bahasa Mesin [Kembali]

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

5. OPcode [Kembali]

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


6. MOD Field` [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 displacement

  • MOV AL, [BX+08H] → menggunakan displacement 8-bit

  • MOV 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).

Bentuk umum:

MOV destination, source

Aturan:

  1. Operand sumber tidak berubah.

  2. Tidak bisa langsung memindahkan memori → memori.

  3. Ukuran operand harus sama (8-bit dengan 8-bit, 16-bit dengan 16-bit, dst.).

  4. Immediate value hanya boleh dipindahkan ke register atau memori, bukan sebaliknya.

Contoh:

MOV AX, BX ; AX ← BX MOV CL, 25H ; CL ← 25H MOV [1000H], AL ; memori[1000H] ← AL

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:

PUSH AX ; simpan AX ke stack POP BX ; ambil data stack ke BX

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:

      LEA BX, [SI+4] ; BX ← alamat SI+4
  • LDS, LES, LFS, LGS, LSS:

    • Mengisi register general-purpose sekaligus register segment tertentu.

    • Contoh:

      LDS BX, [mem] ; BX ← data, DS ← segmen dari memori

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:

    CLD ; Clear DF → maju STD ; Set DF → mundur

b. Instruksi Utama

  1. LODS (Load String)

    • Memindahkan byte/word/dword dari DS:SI → AL/AX/EAX.

  2. STOS (Store String)

    • Menyimpan AL/AX/EAX → ES:DI.

  3. MOVS (Move String)

    • Menyalin dari DS:SI → ES:DI.

  4. CMPS (Compare String)

    • Membandingkan data di DS:SI dengan ES:DI.

  5. SCAS (Scan String)

    • Membandingkan AL/AX/EAX dengan string di ES:DI.

  6. 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.

Contoh:

CLD MOV CX, 100 ; jumlah elemen REP MOVSB ; salin 100 byte dari DS:SI ke ES:DI

5. Instruksi Data Transfer Lainnya

InstruksiFungsi
XCHGMenukar isi dua operand. Contoh: XCHG AX, BX.
LAHF/SAHFTransfer sebagian register FLAG ke AH, dan sebaliknya.
XLATTranslasi byte: AL = [BX+AL] (lookup table).
IN / OUTBaca/tulis data dari/ke port I/O. Contoh: IN AL, 60H.
MOVSXSalin data dengan sign-extension (memperluas bit tanda).
MOVZXSalin data dengan zero-extension (bit tambahan = 0).
BSWAPMembalik urutan byte dalam register 32-bit. Contoh: 12345678H → 78563412H.
CMOVccConditional 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:

    MOV AX, FS:[BX] ; akses data lewat segment FS

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:

DATA SEGMENT MSG DB 'HELLO$',0 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX LEA DX, MSG MOV AH, 09H INT 21H MOV AH, 4CH INT 21H CODE ENDS END START

Program di atas menampilkan string "HELLO" menggunakan DOS interrupt.

8. Ringkasan Bab

  1. Instruksi MOV adalah dasar semua pemindahan data.

  2. PUSH/POP digunakan untuk stack (penyimpanan sementara & subroutine).

  3. LEA, LDS, LES, dst. untuk menangani alamat & segment register.

  4. Instruksi string (MOVS, LODS, STOS, CMPS, SCAS) sangat penting untuk operasi blok data.

  5. Instruksi tambahan (XCHG, XLAT, MOVSX, MOVZX, BSWAP, CMOV) memperluas kemampuan manipulasi data.

  6. Segment override memungkinkan fleksibilitas pengaksesan data lintas segmen.

  7. Assembler directives membantu menyusun program secara rapi dan terstruktur.



 Tabel Ringkasan Instruksi Data Movement

InstruksiFungsi UtamaCatatan
MOVMenyalin data antar register/memoriTidak bisa memori ↔ memori langsung
PUSHSimpan data ke stackSP/ESP/RSP turun
POPAmbil data dari stackSP/ESP/RSP naik
LEAAmbil alamat efektifUntuk pointer & array
LDS/LES/LFS/LGS/LSSLoad register + segmentDigunakan untuk pointer
LODSAmbil string → accumulatorDS:SI → AL/AX/EAX
STOSSimpan accumulator → stringAL/AX/EAX → ES:DI
MOVSPindahkan stringDS:SI → ES:DI
CMPSBandingkan stringDS:SI dengan ES:DI
SCASScan stringBandingkan dengan accumulator
INS / OUTSTransfer string ke/dari port I/OUntuk operasi hardware
XCHGTukar dataBisa register ↔ register/memori
LAHF/SAHFTransfer sebagian flagAH ↔ FLAG
XLATTranslasi byteLookup table
IN/OUTAkses port I/OAL/AX/EAX ↔ port
MOVSXSign-extensionPerluasan bit tanda
MOVZXZero-extensionPerluasan dengan nol
BSWAPBalik urutan byteHanya 32-bit register
CMOVccConditional moveAlternatif 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

Chapter 4 Data Movement Instructions

CHAPTER 4 DATA MOVEMENT INSTRUCTIONS [KEMBALI KE MENU SEBELUMNYA] DAFTAR ISI 1. Introduction 2. Tujuan 3. MOV Ulangan 4. Baha...