Chapter 4 DATA MOVEMENT INSTRUCTIONS




 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:

  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]

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 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 1 



FormatKeterangan
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

📑 Tabel 2 



FormatKeterangan
MOV Sreg, reg/memPindahkan data ke segment register
MOV reg/mem, SregPindahkan data dari segment register

📑 Tabel 3 – Instruksi PUSH



FormatKeterangan
PUSH regSimpan isi register ke stack
PUSH memSimpan isi memori ke stack
PUSH immSimpan immediate ke stack
PUSH SregSimpan segment register ke stack

📑 Tabel 4 – Instruksi POP



FormatKeterangan
POP regAmbil data dari stack ke register
POP memAmbil data dari stack ke memori
POP SregAmbil data dari stack ke segment reg

📑 Tabel 5 – PUSHA/POPA, PUSHAD/POPAD



FormatKeterangan
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

📑 Tabel 6 – Instruksi LEA



FormatKeterangan
LEA reg, memMemasukkan alamat efektif operand ke reg

📑 Tabel 7 – Load Far Pointer



FormatKeterangan
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

📑 Tabel 8 – LODS



FormatKeterangan
LODSBAmbil byte dari DS:SI ke AL
LODSWAmbil word dari DS:SI ke AX
LODSDAmbil dword dari DS:SI ke EAX

📑 Tabel 9 – STOS



FormatKeterangan
STOSBSimpan AL ke ES:DI
STOSWSimpan AX ke ES:DI
STOSDSimpan EAX ke ES:DI

📑 Tabel 10 – MOVS



FormatKeterangan
MOVSBSalin byte dari DS:SI ke ES:DI
MOVSWSalin word dari DS:SI ke ES:DI
MOVSDSalin dword dari DS:SI ke ES:DI

📑 Tabel 11 – CMPS



FormatKeterangan
CMPSBBandingkan byte DS:SI dengan ES:DI
CMPSWBandingkan word DS:SI dengan ES:DI
CMPSDBandingkan dword DS:SI dengan ES:DI

📑 Tabel 12 – SCAS



FormatKeterangan
SCASBBandingkan AL dengan isi di ES:DI
SCASWBandingkan AX dengan isi di ES:DI
SCASDBandingkan EAX dengan isi di ES:DI

📑 Tabel 13 – INS



FormatKeterangan
INSBBaca byte dari port ke ES:DI
INSWBaca word dari port ke ES:DI
INSDBaca dword dari port ke ES:DI

📑 Tabel 14 – OUTS



FormatKeterangan
OUTSBKirim byte dari DS:SI ke port
OUTSWKirim word dari DS:SI ke port
OUTSDKirim dword dari DS:SI ke port

📑 Tabel 15 – XCHG



FormatKeterangan
XCHG reg, regTukar isi dua register
XCHG reg, memTukar isi register dengan memori

📑 Tabel 16 – XLAT



FormatKeterangan
XLATAL = [BX+AL] atau [EBX+AL] (lookup table)

📑 Tabel 17 – LAHF/SAHF




FormatKeterangan
LAHFCopy sebagian flags → AH
SAHFCopy AH → sebagian flags

📑 Tabel 18 – PUSHF/POPF dan Variannya



FormatKeterangan
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

📑 Tabel 19 – IN dan OUT



FormatKeterangan
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

📑 Tabel 20 – MOVSX dan MOVZX



FormatKeterangan
MOVSX reg, reg/memCopy operand kecil ke besar dengan sign-extension
MOVZX reg, reg/memCopy operand kecil ke besar dengan zero-extension

📑 Tabel 21 – BSWAP



FormatKeterangan
BSWAP reg32Balik urutan byte dalam reg 32-bit
BSWAP reg64Balik urutan byte dalam reg 64-bit

📑 Tabel 22 – CMOVcc



FormatKeterangan
CMOVE reg, reg/memSalin jika ZF=1 (equal)
CMOVNE reg, reg/memSalin jika ZF=0 (not equal)
CMOVG/CMOVGESalin jika lebih besar/lebih besar sama (signed)
CMOVL/CMOVLESalin jika lebih kecil/lebih kecil sama (signed)
CMOVA/CMOVAESalin jika di atas/di atas sama (unsigned)
CMOVB/CMOVBESalin jika di bawah/di bawah sama (unsigned)


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

























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.

[kembali]



0 comments:

Posting Komentar