Chapter 4: Data Movement Instructions (Instruksi Pemindahan Data)

 Chapter 4

Data Movement Instructions

Chapter 4 dari buku The Intel Microprocessors membahas secara rinci mengenai instruksi pemindahan data (Data Movement Instructions) pada mikroprosesor Intel. Instruksi pemindahan data adalah kelompok instruksi paling dasar dan paling sering digunakan dalam pemrograman assembly. Tujuannya:
  • Memindahkan data antar register, memori, dan port I/O.

  • Mengelola stack.

  • Mengakses alamat efektif.

  • Menangani string data (urutan byte/word).

  • Menyediakan instruksi khusus untuk kebutuhan tertentu seperti pertukaran data atau ekspansi tanda (sign extension).

4.1 MOV Revisited

Instruksi MOV adalah instruksi paling dasar yang digunakan untuk memindahkan data dari satu lokasi ke lokasi lain. Instruksi ini bekerja dengan menyalin isi operand sumber ke operand tujuan, tanpa mengubah isi operand sumber. Operand sumber bisa berupa register, memori, atau immediate (konstanta), sedangkan operand tujuan bisa berupa register atau memori. Namun, aturan pentingnya adalah tidak boleh langsung memindahkan data dari memori ke memori; salah satu operand harus berupa register. Instruksi MOV adalah instruksi yang berfungsi untuk menyalin data dari operand sumber (source) ke operand tujuan (destination). Penting dicatat bahwa MOV tidak menghapus atau memindahkan data dari sumber, melainkan menyalinnya.

memperlihatkan format instruksi pada prosesor keluarga Intel dari 8086 hingga Core2. Pada mode 16-bit (8086), instruksi terdiri dari beberapa bagian yaitu opcode (1–2 byte) untuk menentukan operasi, MOD-REG-R/M (0–1 byte) untuk mengatur operand register atau memori, displacement (0–1 byte) sebagai offset alamat, serta immediate (0–2 byte) sebagai data langsung. Sedangkan pada mode 32-bit (80386 hingga Pentium 4), format instruksi lebih kompleks karena mendukung data dan alamat yang lebih besar, dengan tambahan address size prefix dan register size prefix (masing-masing 0–1 byte), scaled-index (0–1 byte) untuk addressing dengan indeks berskala, serta ukuran displacement dan immediate yang lebih panjang (hingga 4 byte). Dengan demikian, instruksi 32-bit lebih fleksibel dan mampu menangani operasi yang lebih rumit dibandingkan instruksi 16-bit.


memperlihatkan format byte pertama dari instruksi data movement dalam bahasa mesin, di mana bagian awal berisi opcode sebagai penentu jenis operasi yang dilakukan prosesor, sedangkan dua bit terakhir yaitu D-bit dan W-bit memiliki fungsi khusus. D-bit berfungsi untuk menentukan arah perpindahan data, apakah dari register ke memori atau sebaliknya, sementara W-bit menunjukkan ukuran data yang dipindahkan, dengan nilai 0 berarti operasi 8-bit (byte) dan nilai 1 berarti operasi 16-bit (word). Dengan kombinasi ketiga bagian ini, prosesor dapat mengenali jenis instruksi, arah perpindahan data, serta ukuran data yang terlibat dalam operasi.

Figure 4-3 menunjukkan byte kedua dari instruksi bahasa mesin yang terdiri atas tiga bagian penting, yaitu MOD, REG, dan R/M. Field MOD berfungsi untuk menentukan mode addressing, apakah operand berada di register atau memori serta apakah ada displacement yang menyertainya, sedangkan REG digunakan untuk memilih register yang terlibat dalam instruksi, baik sebagai sumber maupun tujuan data, dan R/M dipakai untuk menunjuk operand lain yang bisa berupa register atau alamat memori tergantung nilai MOD.

Tabel di atas menjelaskan fungsi dari field MOD pada mode instruksi 16-bit dalam arsitektur x86. Field MOD ini merupakan bagian dari byte opcode yang menentukan cara alamat memori dihitung atau apakah operand adalah register. Berikut penjelasan untuk setiap nilai MOD:

  • 00: Tidak ada displacement (offset) tambahan, alamat langsung menggunakan register/memori tanpa penambahan nilai offset.

  • 01: Displacement 8-bit yang diperluas tanda (sign-extended), artinya ada offset kecil yang bisa positif atau negatif ditambahkan ke alamat dasar.

  • 10: Displacement 16-bit yang diperluas tanda, offset yang lebih besar ditambahkan ke alamat dasar.

  • 11: Operand adalah register, bukan alamat memori, sehingga tidak ada penghitungan alamat atau displacement.


Tabel ini menunjukkan kode 3-bit yang digunakan untuk memilih register dalam instruksi x86 saat MOD = 11 (operand adalah register). Berdasarkan nilai W, register yang dipilih bisa berukuran 8-bit (byte), 16-bit (word), atau 32-bit (doubleword). Misalnya, kode 000 merepresentasikan register AL (8-bit), AX (16-bit), atau EAX (32-bit), sedangkan kode 001 merepresentasikan CL, CX, atau ECX, dan seterusnya. Tabel ini membantu CPU menentukan register mana yang digunakan sesuai ukuran data dalam instruksi.

MOD menentukan apakah operand register atau memori.
REG menunjuk register tujuan atau sumber sesuai arah transfer data.
R/M menunjuk operand lain, bisa berupa register atau alamat memori.

pada gambar diatas memperlihatkan contoh pengkodean instruksi assembly x86 yaitu MOV BP, SP dalam bentuk biner. Pada byte pertama, bagian opcode (100010) menunjukkan operasi MOV, bit D = 1 berarti data dipindahkan ke register yang ditentukan oleh field REG, dan bit W = 1 menandakan operasi word (16-bit). Byte kedua berisi field MOD-REG-R/M, di mana MOD = 11 berarti operand berada pada register, bukan memori, REG = 101 menunjukkan register tujuan BP, dan R/M = 100 menunjukkan register sumber SP. Dengan demikian, instruksi biner 10001011 1100100 (atau 8BEC dalam heksadesimal) diterjemahkan menjadi perintah assembly MOV BP, SP.

        Aturan dasar instruksi MOV:

  1. Operand tujuan bisa berupa register atau memori.

  2. Operand sumber bisa berupa register, memori, atau immediate (konstanta).

  3. Tidak boleh memori ke memori langsung (harus lewat register).

  4. Ukuran operand harus sama (byte ↔ byte, word ↔ word, dll).

  5. Dalam mode 64-bit, instruksi ini bisa memindahkan data hingga ukuran quadword (64 bit).

Instruksi MOV adalah instruksi yang paling sering digunakan dalam assembly, karena hampir semua program membutuhkan pemindahan data dari satu lokasi ke lokasi lain sebelum dilakukan perhitungan atau pengolahan. Instruksi MOV mendukung pemindahan data dalam berbagai ukuran, mulai dari byte, word, doubleword, hingga quadword pada prosesor modern. Pada mode 64-bit, MOV diperluas untuk menangani register 64-bit penuh sehingga memungkinkan pengolahan data dalam kapasitas yang lebih besar. Dalam implementasinya, MOV memiliki berbagai kode mesin (opcode) tergantung kombinasi operand yang digunakan. Karena itu, instruksi ini sangat penting dan hampir selalu muncul dalam setiap program assembly.

Figure 4-5 menunjukkan instruksi MOV DL, [DI] yang diubah ke kode mesin, di mana data dipindahkan dari alamat memori DS:[DI] ke register DL tanpa displacement (offset). Sementara itu, Figure 4-6 memperlihatkan instruksi MOV AX, [1000H] dengan displacement 16-bit, yang memindahkan data dari alamat memori absolut 1000H ke register AX. Kedua gambar ini menjelaskan bagaimana instruksi MOV dikodekan dengan kombinasi opcode, MOD, REG, R/M, dan displacement dalam bahasa mesin.


4.2 PUSH / POP

Instruksi PUSH dan POP digunakan untuk bekerja dengan stack, yaitu struktur data yang bersifat Last In First Out (LIFO). Instruksi PUSH berfungsi untuk menyimpan data sementara ke dalam stack. Ketika PUSH dijalankan, pointer stack (SP/ESP/RSP) berkurang, lalu operand yang dipilih disimpan ke alamat stack. Sebaliknya, instruksi POP mengambil data dari stack dan menaruhnya ke operand tujuan, lalu pointer stack bertambah. Kedua instruksi ini penting dalam pemrograman, terutama untuk menyimpan sementara isi register sebelum digunakan, mengembalikan isi register setelah prosedur, serta mengelola alamat kembali saat pemanggilan subrutin. Selain itu, terdapat varian seperti PUSHF dan POPF yang digunakan untuk menyimpan serta mengembalikan isi register flag. Namun, agar dapat digunakan, stack harus diinisialisasi terlebih dahulu dengan mengatur register SS (stack segment) dan SP (stack pointer). Oleh karena itu, instruksi ini menjadi tulang punggung manajemen fungsi, prosedur, dan interupsi dalam pemrograman assembly. Instruksi PUSH dan POP digunakan untuk bekerja dengan stack (tumpukan), yaitu area memori khusus yang bersifat LIFO (Last In, First Out). Artinya, data yang terakhir dimasukkan ke stack akan menjadi data pertama yang diambil kembali.

memperlihatkan efek instruksi PUSH AX pada register ESP dan memori stack. Nilai yang ada pada register AX (dalam hal ini 6AB3h) disalin ke stack, dengan byte rendah B3h disimpan pada alamat lebih rendah (037FEh) dan byte tinggi 6Ah pada alamat berikutnya (037FFh), sesuai mekanisme little-endian. Setelah penyimpanan, pointer stack (ESP) otomatis berkurang sebesar 2 untuk menunjukkan posisi teratas stack yang baru, yaitu 037FEh. Register SS (Stack Segment) bernilai 3000h kemudian digabungkan dengan offset ESP (07FEh) menghasilkan alamat fisik 037FEh, yang sesuai dengan lokasi penyimpanan data. Dengan demikian, gambar ini menggambarkan bagaimana instruksi PUSH menyimpan data dari register ke stack dan mengupdate ESP.

menunjukkan urutan penyimpanan register 16-bit pada stack setelah instruksi PUSHA (Push All) dijalankan dalam arsitektur x86 (mode 16-bit). Instruksi PUSHA digunakan untuk menyimpan isi dari delapan register general-purpose (AX, CX, DX, BX, SP, BP, SI, dan DI) ke dalam stack. Urutan penyimpanan dimulai dari register AX di bagian atas hingga DI di bagian bawah stack.

Tabel 4–8 yang menjelaskan berbagai bentuk instruksi PUSH pada arsitektur prosesor Intel. Instruksi PUSH digunakan untuk menyimpan (mendorong) data ke dalam stack, dan dapat digunakan pada berbagai jenis operand.

  • PUSH reg16 atau PUSH reg32 → mendorong isi register 16-bit (contoh BX) atau 32-bit (contoh EDX) ke stack.

  • PUSH mem16, mem32, mem64 → mendorong isi memori ke stack, bisa berupa pointer 16-bit, 32-bit, atau 64-bit (contoh PUSH WORD PTR [BX]).

  • PUSH seg → mendorong isi register segmen, misalnya DS.

  • PUSH imm8, imm16, imm32 → mendorong nilai immediate (konstanta) ke stack, baik 8-bit (contoh 'R'), 16-bit (1000H), maupun 32-bit (20).

  • PUSHA / PUSHAD → menyimpan seluruh register umum sekaligus, PUSHA untuk 16-bit register, PUSHAD untuk 32-bit register.

  • PUSHF / PUSHFD → menyimpan isi flag register, PUSHF untuk 16-bit flags, PUSHFD untuk 32-bit EFLAGS.

PUSH (menyimpan ke stack)
  • Menyimpan data dari register, memori, immediate, atau segment register ke stack.

  • Pada prosesor 8086–80286, selalu menyimpan 2 byte (word).

  • Pada 80386 dan di atasnya, bisa menyimpan 2 byte (word) atau 4 byte (doubleword).

  • Pada mode 64-bit, PUSH menggunakan 8 byte (quadword).

  • Setelah data disimpan, Stack Pointer (SP/ESP/RSP) berkurang sesuai ukuran data.

POP (Mengambil dari Stack)
  • Mengambil data dari stack ke register, memori, atau segment register (kecuali CS).

  • Ukuran data yang diambil sama seperti saat PUSH.

  • Setelah data diambil, SP/ESP/RSP bertambah sesuai ukuran data.

cara kerja PUSH:

  1. SP dikurangi (misalnya SP = SP - 2 pada mode 16-bit).

  2. Data disalin ke alamat [SS:SP].

cara kerja POP:
  1. Data dibaca dari [SS:SP].

  2. SP ditambah (misalnya SP = SP + 2 pada mode 16-bit).


Gambar tersebut menunjukkan proses push nilai dari register EBX (392Fh) ke stack dalam arsitektur x86. Stack tumbuh ke bawah, sehingga ESP berkurang dari 01008h ke 01006h. Nilai 392Fh disimpan dalam format little-endian, yaitu 2F di alamat 01006h dan 39 di 01007h. Alamat fisik stack dihitung dari SS:ESP, di mana SS = 0000h, sehingga alamat fisiknya tetap 01006h. Gambar ini menunjukkan cara kerja stack dan segmentasi memori secara ringkas.

4.3 Load Effective Address (LEA)

Instruksi LEA (Load Effective Address) digunakan untuk menghitung alamat efektif suatu operand memori, kemudian menyimpannya ke dalam sebuah register. Berbeda dengan MOV yang mengambil isi dari alamat memori, LEA hanya mengambil alamat itu sendiri. Instruksi ini sangat berguna ketika programmer ingin menggunakan alamat sebagai data, misalnya dalam operasi pointer, penghitungan offset, atau manipulasi array. “Load-effective address” adalah keluarga instruksi yang memuat alamat efektif (offset) ke register tanpa membaca/menulis isi memori tersebut. Anggotanya:

  • LEA: memuat offset yang dihitung dari suatu operand bertipe memori ke register tujuan (16-/32-bit).

  • LDS/LES (8086+): memuat offset ke sebuah register dan memuat DS/ES dari memori (mengambil far pointer).

  • LFS/LGS/LSS (80386+): mirip LDS/LES, tetapi untuk FS/GS/SS dan mendukung register 32-bit.
    Pada mode 64-bit Pentium 4, LDS/LES tidak valid karena model memori datar tidak memakai segmentasi klasik.

LEA memuat offset dari operand memori ke register tanpa mengakses memori tersebut. Misal, LEA AX, NUMB akan menaruh alamat (offset) label NUMB ke AX, bukan isi memori di NUMB

Perbandingan LEA vs MOV (memori):

  • LEA BX, [DI] → menyalin offset yang ada di DI ke BX.

  • MOV BX, [DI]membaca isi memori pada alamat DS:DI ke BX.




LEA vs direktif OFFSET

Untuk operand sederhana (hanya label), MOV reg, OFFSET label menghasilkan hal yang sama dengan LEA reg, label, namun lebih efisien karena nilai offset dihitung oleh assembler, bukan CPU. Contoh: MOV BX, OFFSET LISTLEA BX, LIST, dan di 80486, LEA BX, LIST butuh ±2 siklus, sementara MOV BX, OFFSET LIST hanya ±1 siklus (karena assemble-time immediate). Keduanya berukuran 3 byte untuk kasus ini. 

Selain LEA, terdapat instruksi lain seperti LDS, LES, LFS, LGS, dan LSS, yang memungkinkan pemuatan data pointer dari memori ke dalam register general-purpose sekaligus mengisi register segmen yang sesuai. Dengan demikian, instruksi-instruksi ini sangat membantu dalam penanganan struktur data kompleks atau ketika data tersebar di berbagai segmen memori. Kelima instruksi ini mengambil pasangan (offset, segment) dari memori lalu:

  • Memuat offset ke register tujuan (16-/32-bit),

  • Memuat segment ke salah satu DS/ES/FS/GS/SS sesuai mnemonik.
    Data di memori tersimpan sebagai offset dahulu, lalu segment (urutan offset→segment). Versi 32-bit memuat offset 32-bit + segment 16-bit (total 48 bit).


4.4 String Data Transfers

Instruksi pemindahan string digunakan untuk memindahkan data dalam bentuk urutan byte atau word di memori. Instruksi string adalah instruksi khusus untuk memproses blok data (string/array) secara otomatis. Ada lima instruksi utama: LODS, STOS, MOVS, INS, OUTS. Masing-masing bisa bekerja pada ukuran byte/word/doubleword (dan di mode 64-bit juga quadword). Instruksi string biasa dipakai untuk: menyalin blok memori, mengisi blok memori, membaca/menulis blok dari/ke I/O device, dan memproses buffer secara cepat. Instruksi ini memanfaatkan register SI (Source Index) untuk menunjuk data sumber dan DI (Destination Index) untuk menunjuk tujuan. Arah perpindahan data ditentukan oleh Direction Flag (DF): jika DF=0 maka indeks bertambah (transfer maju, kiri ke kanan), sedangkan jika DF=1 maka indeks berkurang (transfer mundur, kanan ke kiri). Instruksi yang termasuk kategori ini adalah: LODS (memuat data dari [SI] ke AL/AX), STOS (menyimpan isi AL/AX ke [DI]), MOVS (menyalin data dari [SI] ke [DI]), INS (membaca data dari port ke memori di [DI]), dan OUTS (mengirim data dari memori di [SI] ke port). Instruksi string biasanya digunakan bersama dengan prefix REP, REPE, atau REPNE untuk melakukan operasi berulang secara otomatis dalam jumlah tertentu atau sampai kondisi tertentu terpenuhi. Dengan instruksi ini, pemrosesan array dan string menjadi jauh lebih efisien.

Direction Flag (DF) — arah auto-update indeks

  • Bit D (direction flag) di EFLAGS menentukan apakah register indeks akan bertambah (DF=0) atau berkurang (DF=1) selama eksekusi instruksi string.

  • Untuk mengatur: CLD → DF = 0 (auto-increment), STD → DF = 1 (auto-decrement).

  • Perubahan indeks bergantung pada ukuran transfer: +1/−1 untuk byte, +2/−2 untuk word, +4/−4 untuk doubleword, +8/−8 untuk quadword di mode 64-bit.

DI / SI (dan EDI / ESI / RDI / RSI) & segmen

  • SI (source index) menunjuk sumber di DS (data segment) secara default. Segment override dapat mengubah segment sumber.

  • DI (destination index) menunjuk tujuan di ES (extra segment) — DI selalu menggunakan ES untuk instruksi string; destination segment tidak bisa diubah kecuali dengan trik tertentu (pop/push DS→ES). Tujuan ini memungkinkan MOVS memindahkan sampai 64K dari satu segmen ke segmen lain.

  • Di 32-bit: gunakan ESI / EDI. Di 64-bit: RSI / RDI dan RCX digunakan untuk count ketika memakai REP.

LODS — load from memory into accumulator

    Fungsi: memuat data dari memori (DS:SI) ke accumulator:

  • LODSB → AL ← byte [DS:SI]

  • LODSW → AX ← word [DS:SI]

  • LODSD → EAX ← dword [DS:SI] (80386+)

  • LODSQ → RAX ← qword [RSI] (64-bit)

Setelah load, SI ditambah atau dikurangkan sesuai ukuran (1/2/4/8) sesuai DF. LODS jarang dipakai dengan REP (tidak logis untuk ulang memuat ke AL/EAX).

STOS (store accumulator to memory)

    Fungsi: menyimpan accumulator ke ES:DI:

  • STOSB → ES:[DI] ← AL

  • STOSW → ES:[DI] ← AX

  • STOSD → ES:[DI] ← EAX
    Setelah store, DI berubah ±1/2/4 sesuai ukuran dan DF. STOS sering dipakai untuk mengisi buffer (mis. clear memory).

MOVS — memory → memory (satu-satunya mem→mem)

    Fungsi: satu-satunya instruksi yang secara langsung memindahkan memori → memori:

  • MOVSB → ES:[DI] ← DS:[SI]; SI ±=1; DI ±=1

  • MOVSW → ES:[DI] ← DS:[SI]; SI ±=2; DI ±=2

  • MOVSD → ES:[DI] ← DS:[SI]; SI ±=4; DI ±=4 (80386+)

  • MOVSQ → ES:[RDI] ← [RSI] (64-bit)

INS / OUTS — I/O string transfer

  • INS: membaca dari I/O port (alamat di DX) ke memori ES:[DI]. Tersedia INSB/INSW/INSD. Setelah transfer DI ±1/2/4. (Tidak ada di 8086/8088).

  • OUTS: mengirim dari memori DS:[SI] ke I/O port DX. OUTSB/OUTSW/OUTSD tersedia, DI/ SI bertambah sesuai ukuran. (OUTS tidak ada di 8086/8088).

REP prefix & register counter

  • REP melingkupi string instruction (kecuali LODS tidak logis dipakai). REP membuat instruksi string diulang sebanyak nilai CX/ECX/RCX (16/32/64-bit mode). Setelah tiap iterasi CX decrement sampai nol; ketika CX=0, eksekusi lanjut. Di 64-bit RCX dipakai.


4.5 Miscellaneous Data Transfer Instructions

Selain MOV dan instruksi string, terdapat pula instruksi lain dengan fungsi khusus. Instruksi XCHG digunakan untuk menukar isi dua operand, misalnya XCHG AX, BX akan menukar isi kedua register. Instruksi LAHF dan SAHF digunakan untuk memindahkan sebagian bit flag ke dalam register AH atau sebaliknya, sehingga bermanfaat dalam operasi kondisi. Instruksi XLAT digunakan untuk translasi data berdasarkan tabel lookup; AL berisi indeks, dan data dari tabel diambil berdasarkan indeks itu. Instruksi IN dan OUT digunakan untuk komunikasi langsung dengan perangkat I/O, misalnya membaca data dari port atau mengirimkan data ke port. Instruksi MOVSX dan MOVZX digunakan untuk memindahkan data dengan menyesuaikan ukurannya: MOVSX memperluas data dengan memperhitungkan tanda (sign extension), sedangkan MOVZX memperluas dengan menambahkan nol (zero extension). Instruksi BSWAP membalik urutan byte dalam register 32-bit atau 64-bit, sedangkan CMOVcc (conditional move) memungkinkan pemindahan data hanya jika kondisi tertentu terpenuhi (misalnya lebih besar, sama, atau nol). Instruksi-instruksi ini menyediakan fleksibilitas tambahan untuk berbagai kebutuhan pemrograman.

1) XCHG — Exchange (pertukaran isi)

Fungsi: bertukar (exchange) isi dua operand (register ↔ register atau register ↔ memori).
Bentuk umum: XCHG r, r / XCHG r, mem / XCHG mem, r. (Tidak memperbolehkan segment↔segment atau mem↔mem langsung.)

Ciri penting & batasan

  • Ukuran: byte / word / doubleword (dan 64-bit pada mode 64-bit).

  • Kasus istimewa: XCHG AX, reg16 (atau XCHG EAX, reg32) mempunyai encoding paling pendek — untuk 16-bit XCHG AX,reg hanya 1 byte (opcode 90h + reg), sehingga sering dipakai karena efisien. 

  • XCHG dengan memori memerlukan opcode tambahan (lebih panjang).

  • Efek pada flag: XCHG tidak mengubah flag (umumnya dipakai untuk swap tanpa mempengaruhi status aritmetika). (prinsip umum arsitektur; buku menekankan efisiensi XCHG AX).

2) LAHF dan SAHF — Load/Store AH ⇄ Flags

Fungsi singkat: memindahkan byte bagian kanan (low 8 bit) dari flag register ke AH (LAHF) atau sebaliknya AH → flags (SAHF). Instruksi ini berasal dari kompatibilitas dengan CPU lama (8085) sehingga jarang dipakai hari ini. 

Ciri & catatan

  • Keduanya legacy; jarang digunakan di kode modern.

  • LAHF menaruh bit-bit flag (SF/ZF/AF/CF/… tergantung arsitektur) ke AH sehingga program dapat memeriksa flag lewat register. SAHF menulis AH kembali ke flag.

  • Berguna pada interaksi dengan coprocessor: mis. FSTSW AXSAHF untuk memindahkan status coprocessor ke flag CPU. 

  • Tidak valid di 64-bit mode (legacy saja).

3) XLAT — Table translate (lookup tabel)

Deskripsi: XLAT melakukan lookup tabel: ia menjumlahkan BX + (uint8)AL untuk membentuk alamat di DS, lalu menaruh byte dari alamat itu ke AL. Dengan kata lain AL ← DS[(BX) + AL]. Ini memudahkan konversi cepat (contoh: BCD→seven-segment, BCD→ASCII, dll.). 

Ciri & batasan

  • Hanya bekerja dengan AL (8-bit) sebagai indeks, dan BX sebagai base.

  • Hanya mengakses DS:BX+AL sebagai sumber. (hanya sumber yang memakai DS; BX harus diatur sebagai base).

  • Sederhana, efisien untuk tabel kecil yang terletak di DS. 


4) IN / OUT — I/O port transfers

Fungsi: IN membaca data dari port I/O ke AL/AX/EAX; OUT menulis AL/AX/EAX ke port I/O. Ada dua bentuk pengalamatan port: immediate (8-bit port fixed) atau variable via DX (port number ada di DX). Instruksi ini adalah jembatan ke perangkat eksternal (keyboard controller, sound card, dll.).

Ciri & batasan

  • Ukuran transfer: byte (AL), word (AX), dword (EAX pada 32-bit).

  • IN/OUT tidak menyentuh memori — cuma CPU ↔ I/O device.

  • INS/OUTS adalah varian string (bisa REP untuk banyak transfer), namun INS/OUTS tak tersedia pada 8086/8088 lama; tersedia pada 80386+.

  • Perangkat harus siap; penggunaan REP INSB atau REP OUTSB mengasumsikan device bisa menerima/menyediakan data—jika tidak, software harus cek status device sebelum REP


5) BSWAP — Byte swap (endianness utility)

Fungsi: menukar urutan byte dalam register 32-bit (EAX etc.). Pada register 32-bit: byte0↔byte3, byte1↔byte2. (Dalam 64-bit mode, BSWAP dapat membalik 8 byte pada register 64-bit jika encoding mendukung REX; buku menyebut implementasi 64-bit membalik 8 byte).


6) MOVSX / MOVZX — Move with sign / zero extend

Fungsi: memindahkan sumber yang lebih kecil (byte/word) ke register lebih besar sambil memperluas nilainya:

  • MOVSX = sign-extend (isi tanda dipropagasi ke bit tinggi), cocok untuk bilangan bertanda.

  • MOVZX = zero-extend (isi bits tinggi diisi nol), cocok untuk bilangan tak bertanda.

Ciri & batasan

  • Tersedia sejak 80386 ke atas (instruksi 32-bit).

  • Bentuk: MOVSX reg32, r/m8 atau MOVSX reg32, r/m16 dsb.; MOVZX serupa.

  • Tidak mengubah flags.


7) CMOVcc — Conditional Move (branchless conditional transfer)

Fungsi: memindahkan sumber → register tujuan hanya jika kondisi tertentu terpenuhi (didasarkan pada flags). cc adalah kondisi (Z, NZ, C, NC, G, L, GE, LE, S, NS, O, NO, P, NP, dsb.). Tersedia pada Pentium Pro (fam .686) dan Core2 dan seterusnya. 

Ciri & batasan

  • Hanya memindahkan ke register tujuan (16/32-bit pada arsitektur yang dijelaskan) — destination harus register, source dapat register atau memori. Buku menyatakan destination dibatasi ke register 16/32 bit. 

  • CMOV tidak mengubah flags.

  • Kegunaan utama: menghindari cabang (branchless code) untuk mengurangi branch misprediction dan biaya cabang di CPU modern.

4.6 Segment Override Prefix

Secara default, CPU menggunakan register segmen tertentu untuk mengakses memori, seperti DS untuk data, SS untuk stack, dan CS untuk kode. Namun, ada kalanya programmer perlu mengakses data dari segmen lain. Dalam kasus ini, digunakan segment override prefix untuk memaksa CPU menggunakan register segmen yang berbeda dari default. Misalnya, sebuah instruksi dapat dipaksa untuk menggunakan ES, FS, atau GS meskipun secara default ia menggunakan DS. Hal ini sangat berguna dalam pemrograman yang melibatkan banyak segmen memori, seperti sistem operasi atau aplikasi yang mengatur data dalam berbagai blok memori terpisah. Dengan demikian, segment override prefix memberikan fleksibilitas tambahan dalam pengelolaan memori.

4.7 Assembler Detail

Bagian ini membahas detail implementasi pemrograman assembler terkait instruksi pemindahan data. Salah satunya adalah penggunaan directives, yaitu perintah untuk assembler (bukan untuk CPU), seperti .DATA, .CODE, DB, dan DW yang digunakan untuk mendefinisikan data dan mengatur struktur program. Bagian ini juga menjelaskan tentang memory organization, yaitu bagaimana data disusun dalam segmen memori, baik berupa variabel, array, maupun string. Selain itu, disajikan pula contoh program sederhana yang menunjukkan bagaimana instruksi pemindahan data digunakan dalam praktik, mulai dari pemindahan nilai, pengolahan string, hingga pemanggilan prosedur dengan stack. Dengan memahami bagian ini, programmer dapat menulis program assembly yang lebih terstruktur dan efisien.

Komentar

Postingan populer dari blog ini

Tugas Besar

Tugas Pendahuluan Modul 4 (Percobaan 1 Kondisi 13)

Modul 4: Shift Register dan Seven Segment