Bahasa assembly dan mode pengalamatan
| English | Bahasa Indonesia |
|---|---|
| assembler/əˈsemblə/ | assembler |
| mnemonic/nɪˈmɒnɪk/ | mnemonik |
| instruction set/ɪnˈstrʌkʃn set/ | set instruksi |
| machine code/məˈʃiːn kəʊd/ | kode mesin |
| assembly language/əˈsemblɪ ˈlæŋɡwɪdʒ/ | bahasa assembly |
| operand/ˈɒpərænd/ | operand |
| opcode/ˈɒpkəʊd/ | opcode |
| symbol table/ˈsɪmbl ˈteɪbl/ | tabel simbol |
| label/ˈleɪbl/ | label |
| forward references/ˈfɔːwəd ˈrefrənsɪz/ | referensi maju |
| addressing mode/əˈdresɪŋ məʊd/ | mode pengalamatan |
| immediate addressing/ɪˈmiːdɪət əˈdresɪŋ/ | pengalamatan segera |
| direct addressing/daɪˈrekt əˈdresɪŋ/ | pengalamatan langsung |
| indirect addressing/ɪndaɪˈrekt əˈdresɪŋ/ | pengalamatan tidak langsung |
| indexed addressing/ˈɪndekst əˈdresɪŋ/ | pengalamatan terindeks |
| relative addressing/ˈrelətɪv əˈdresɪŋ/ | pengalamatan relatif |
Tiga puluh satu instruksi dalam satu baris sakelar
- Pada tahun 1949, komputer EDSAC di Cambridge mulai berjalan dari 31 instruksi yang diatur pada sakelar, ditulis oleh David Wheeler dan disebut "instruksi awal".
- Tugas mereka seluruhnya adalah membaca huruf seperti A dan S dari pita kertas dan mengubahnya menjadi angka yang dipahami mesin: assembler pertama.
- Para programmer telah menulis mnemonik alih-alih pola bit sejak saat itu, dan himpunan instruksi ujian sendiri merupakan keturunan langsungnya.
- Pelajaran ini tentang terjemahan tersebut, melacak program secara manual, dan lima cara agar sebuah instruksi dapat menunjukkan di mana datanya berada.
Kode mesin dan bahasa assembly
- Prosesor menjalankan kode mesin: pola bit, spesifik untuk satu arsitektur, masing-masing merupakan kode operasi dan operand.
- Bahasa assembly adalah bentuk yang mudah dibaca. Setiap instruksi ditulis dengan mnemonik seperti
LDD,ADDatauJMP, dan setiap instruksi assembly berubah menjadi tepat satu instruksi kode mesin. - Assembler menerjemahkannya. Hubungannya satu ke satu, itulah yang membedakan assembly dari bahasa tingkat tinggi, di mana satu pernyataan menjadi banyak instruksi.

Setiap mnemonik menjadi satu opcode; setiap alamat simbolik menjadi angka
Bahasa assembly adalah:
Assembly menggunakan mnemonic dan memetakan satu-satu ke kode mesin; sebuah assembler menerjemahkannya.
Assembler dua tahap
- Tahap 1 membaca sumber dan membangun tabel simbol: setiap kali label seperti
LOOP:muncul, alamatnya dicatat. Tidak ada kode yang dihasilkan. - Tahap 2 membaca sumber lagi dan menghasilkan kode, mengganti setiap mnemonik dengan opcode-nya dan setiap alamat simbolik dengan angka dari tabel simbol.
- Dua tahap diperlukan karena referensi maju:
JMP LOOPmungkin muncul sebelum barisLOOP:terlihat, sehingga alamatnya belum diketahui pada tahap pertama.
Apa fungsi pass 1 pada assembler dua-passage?
Pass 1 mencatat di mana setiap label berada (tabel simbol); pass 2 kemudian menghasilkan kode, menggunakan tabel untuk memecahkan referensi label.
Susun pekerjaan assembler dua-passage secara berurutan.
Pass 1 menemukan semua label terlebih dahulu, sehingga pass 2 dapat memecahkan bahkan lompatan ke label yang didefinisikan nanti.
Mengapa assembler memerlukan dua passage?
Lompatan mungkin menargetkan label yang muncul nanti dalam sumber; pass 1 menemukan semua label terlebih dahulu sehingga pass 2 dapat memecahkannya.
Contoh kerja: menerapkan dua tahap
- Program dimulai dari alamat 100.
100 LDD COUNT
101 LOOP: DEC ACC
102 CMP #0
103 JPN LOOP
104 END
105 COUNT: 5
- Tahap 1 menghitung alamat setiap baris dan mencatat label:
LOOP= 101,COUNT= 105. Tidak ada yang lain yang ditulis. - Tahap 2 menerjemahkan baris demi baris.
LDD COUNTmenjadi opcode untukLDDdengan operand 105;JPN LOOPmenjadi opcode untukJPNdengan operand 101. Tanpa tahap 1, baris pertama tidak dapat diterjemahkan.
Bagaimana assembler dua-passage bekerja
Ikuti langkah demi langkah. Assembler membaca kode Anda dua kali: pass 1 hanya mencari tempat setiap label berada, sehingga pass 2 dapat mengisi alamat — itulah cara lompatan ke label yang didefinisikan nanti tetap berfungsi.
Dalam contoh worked, pass 1 mencatat label LOOP dengan alamat ____ dalam tabel simbol.
Program dimulai dari 100, jadi baris kedua, LOOP: DEC ACC, menempati 101. COUNT, pada baris keenam, adalah 105.
Himpunan instruksi
- Set instruksi Cambridge memiliki satu register tujuan umum, yaitu akumulator ACC, dan register indeks IX. Operand
#nadalah desimal,Bnbiner,&nheksadesimal, dan<address>nomor lokasi atau label. - Perpindahan data:
LDM #n,LDD <address>,LDI <address>,LDX <address>,LDR #n,MOV IX,STO <address>. Input dan output:IN,OUT. - Aritmatika:
ADD,SUB,INC,DEC. Bandingkan:CMP,CMI. Lompat:JMPtak bersyarat,JPEdanJPNbersyarat. Manipulasi bit:AND,OR,XOR,LSL,LSR. KemudianEND. - "Instruksi dikelompokkan": sebutkan kelompok-kelompoknya dan berikan satu instruksi dari setiap kelompok.
Manakah dari berikut ini merupakan kelompok dalam set instruksi? Pilih semua yang berlaku.
Pergerakan data, input/output, aritmatika, perbandingan, lompatan kondisional dan tak bersyarat, serta manipulasi bit. Spreadsheet adalah perangkat lunak aplikasi, jauh di atas level ini.
Contoh kerja: melacak program
- Buat tabel dengan kolom untuk ACC dan untuk setiap lokasi memori yang digunakan program, lalu perbarui baris demi baris hingga
END.
100 LDM #0
101 STO TOTAL
102 LDD TOTAL
103 ADD #5
104 STO TOTAL
105 LDD COUNT
106 DEC ACC
107 STO COUNT
108 CMP #0
109 JPN 102
110 END
111 TOTAL: 0
112 COUNT: 3
- Tahap 1 loop: ACC 0 → 5 (TOTAL = 5), COUNT 3 → 2, bandingkan tidak sama, lompat. Tahap 2: TOTAL = 10, COUNT = 1, lompat. Tahap 3: TOTAL = 15, COUNT = 0, bandingkan sama, tidak ada lompat,
END. - Nilai akhir: TOTAL = 15, COUNT = 0, ACC = 0. Tulis baris baru hanya ketika nilai berubah, dan jangan pernah melewatkan langkah bandingkan.
Dalam program yang dilacak, berapa nilai TOTAL ketika END dicapai?
Loop menambahkan 5 ke TOTAL sekali untuk masing-masing dari tiga kali melewati: 5, 10, 15.
Mode pengalamatan
- Mode pengalamatan menjelaskan bagaimana prosesor menemukan operand.
| Mode | Di mana operand berada | Contoh |
|---|---|---|
| pengalamatan segera | nilainya ada dalam instruksi itu sendiri | LDM #10 memuat 10 |
| pengalamatan langsung | instruksi memegang alamat; gunakan nilai yang disimpan di sana | LDD 200 memuat isi dari 200 |
| pengalamatan tidak langsung | alamat memegang alamat lain, yang memegang data | LDI 200 |
| pengalamatan terindeks | alamat efektif = alamat yang diberikan + register indeks | LDX 200 dengan IX |
| pengalamatan relatif | alamat adalah offset dari instruksi saat ini | lompat |

Bidang operand yang sama, empat makna berbeda
Dalam pengalamatan langsung (misalnya LDM #10), operand adalah:
Pengalamatan langsung menggunakan nilai literal dalam instruksi (di sini, 10).
Cocokkan setiap mode pengalamatan dengan maknanya.
Segera = nilai; langsung = alamat nilai; tidak langsung = alamat dari sebuah alamat; terindeks = basis + indeks.
Contoh kerja: satu operand, empat jawaban
- Memori: lokasi 200 menyimpan 300, lokasi 300 menyimpan 7, lokasi 202 menyimpan 9. Register indeks IX menyimpan 2.
LDM #200memasukkan 200 ke dalam ACC: segera, angkanya sendiri.LDD 200memasukkan 300 ke dalam ACC: langsung, isi dari 200.LDI 200memasukkan 7 ke dalam ACC: tidak langsung, isi dari alamat yang ditemukan di 200.LDX 200menambahkan IX ke 200 dan memuat isi dari 202: 9. Operand yang sama ditulis dengan empat cara, empat nilai berbeda.
Mengapa pengalamatan terindeks ada
- Array adalah deretan lokasi berurutan.
LDX 200dengan IX = 0, 1, 2, … membaca elemen 0, 1, 2, … tanpa mengubah instruksi. - Pola perulangan:
LDR #0untuk mengreset indeks menjadi nol,LDX ARRAYuntuk mengambil elemen, lakukan sesuatu,INC IX, bandingkan dengan panjang,JPNkembali. - Pengalamatan langsung memerlukan instruksi terpisah untuk setiap elemen; pengalamatan terindeks hanya membutuhkan satu.
Pengalamatan terindeks paling berguna untuk:
Alamat efektif adalah alamat basis + register indeks, sehingga meningkatkan indeks akan menelusuri array.
Bandingkan dan lompat
CMP #natauCMP <address>membandingkan ACC dengan suatu nilai dan menetapkan flag. Instruksi ini tidak mengubah ACC.JPE <address>melompat jika perbandingan terakhir menemukan nilai sama;JPN <address>melompat jika tidak sama;JMP <address>selalu melompat.- Sebuah
IFdalam bahasa tingkat tinggi berubah menjadiCMPdiikuti oleh lompatan kondisional; sebuah perulangan berubah menjadi perbandingan dan lompatan kembali ke label.
CMP #0 mengubah nilai yang disimpan di akumulator.
Perbandingan hanya menetapkan flag yang akan dibaca oleh lompatan kondisional berikutnya. ACC tidak berubah, itulah sebabnya jejak menunjukkan tidak ada nilai ACC baru pada baris CMP.
⟦⟧ Nilai yang sering terlewat
LDM #10memuat angka 10;LDD 10memuat isi dari lokasi 10. Nilai#adalah selisih seluruhnya.#adalah desimal,Badalah biner,&adalah heksadesimal.AND &0FdanAND B00001111adalah mask yang sama;AND #15juga.CMPmembiarkan ACC tetap; ia hanya menetapkan flag.JPNmelompat ketika nilai tidak sama.- Lintasan 1 assembler menulis tidak ada kode. Keluarannya adalah tabel simbol, dan referensi maju adalah alasan keberadaannya.
Anda telah memahaminya
- kode mesin adalah pola bit; assembli adalah mnemonik, satu lawan satu, diterjemahkan oleh assembler
- dua lintasan: lintasan 1 membangun tabel simbol alamat label, lintasan 2 menghasilkan kode; diperlukan untuk referensi maju
- trace dengan tabel ACC dan setiap lokasi, satu baris per perubahan; CMP menetapkan flag, JPE/JPN membacanya
- pengalamatan: immediate
#nnilainya · direct isi dari alamat · indirect alamat dari alamat · indexed alamat + IX (array) · relative offset