Bab 6: Dasar-dasar Arsitektur Komputer Modern dengan Bahasa Majelis

Bab 6 Dasar Dasar Arsitektur Komputer Modern Dengan Bahasa Majelis



6.1 Pendahuluan

Komputer serba guna modern terdiri dari dua jenis: CISC dan RISC. CISC adalah singkatan dari Kompleks Instruksi Set Komputer. RISK adalah singkatan dari Reduced Intruction Set Computer. Mikroprosesor 6502 atau 6510, sebagaimana berlaku pada komputer Commodore-64, lebih mirip dengan arsitektur RISC daripada arsitektur CISC.

Komputer RISC umumnya memiliki instruksi bahasa rakitan yang lebih pendek (berdasarkan jumlah byte) dibandingkan komputer CISC.







Catatan : Baik berhubungan dengan CISC, RISC, atau komputer lama, periferal dimulai dari port internal dan keluar melalui port eksternal pada permukaan vertikal unit sistem komputer (unit dasar) dan ke perangkat eksternal.



Instruksi khas komputer CISC dapat dilihat seperti menggabungkan beberapa instruksi bahasa rakitan pendek menjadi satu instruksi bahasa rakitan yang lebih panjang yang membuat instruksi yang dihasilkan menjadi rumit. Secara khusus, komputer CISC memuat operan dari memori ke dalam register mikroprosesor, melakukan operasi, dan kemudian menyimpan hasilnya kembali ke dalam memori, semuanya dalam satu instruksi. Di sisi lain, ini setidaknya adalah tiga instruksi (pendek) untuk komputer RISC.



Ada dua seri komputer CISC yang populer: komputer mikroprosesor Intel dan komputer mikroprosesor AMD. AMD adalah singkatan dari Advanced Micro Devices; ini adalah perusahaan manufaktur semikonduktor. Seri mikroprosesor intel menurut urutan pengembangannya adalah 8086, 8088, 80186, 80286, 80386, 80486, Pentium, Core, i Series, Celeron, dan Xeon. Instruksi bahasa assembly untuk mikroprosesor intel awal seperti 8086 dan 8088 tidak terlalu rumit. Namun, mereka rumit untuk mikroprosesor baru. Mikroprosesor AMD terbaru untuk seri CISC adalah Ryzen, Opteron, Athlon, Turion, Phenom, dan Sempron. Mikroprosesor Intel dan AMD dikenal sebagai mikroprosesor x86.





ARM adalah singkatan Mesin RISC Tingkat Lanjut. Arsitektur ARM menentukan rangkaian prosesor RISC yang cocok untuk digunakan dalam berbagai macam aplikasi. Meskipun banyak mikroprosesor Intel dan AMD digunakan di Komputer Pribadi desktop, banyak prosesor ARM berfungsi sebagai prosesor tertanam dalam sistem yang sangat penting bagi keselamatan seperti rem anti-lock otomotif dan sebagai prosesor keperluan umum di jam tangan pintar, ponsel portabel, tablet, dan komputer laptop. . Meskipun kedua jenis mikroprosesor dapat dilihat pada perangkat kecil dan besar, mikroprosesor RISC lebih banyak ditemukan pada perangkat kecil dibandingkan perangkat besar.

Kata Komputer
Jika sebuah komputer dikatakan sebagai komputer dengan kata 32 bit, artinya informasi tersebut disimpan, ditransfer, dan dimanipulasi dalam bentuk kode biner tiga puluh dua bit di bagian dalam motherboard. Ini juga berarti bahwa register tujuan umum dalam mikroprosesor komputer memiliki lebar 32-bit. Register A, X, dan Y pada mikroprosesor 6502 adalah register tujuan umum. Lebarnya delapan bit, sehingga komputer Commodore-64 adalah komputer kata delapan bit.



Beberapa Kosakata
Komputer X86

Arti dari byte, word, doubleword, quadword, dan double-quadword adalah sebagai berikut untuk komputer x86:

  • byte : 8 bit
  • Kata : 16 bit
  • Kata ganda : 32 bit
  • Kata Segi Empat : 64 bit
  • Kata segi empat ganda : 128 bit

Komputer ARM
Arti dari byte, halfword, word, dan doubleword adalah sebagai berikut untuk komputer ARM:

  • byte : 8 bit
  • Menjadi setengah : 16 bit
  • Kata : 32 bit
  • Kata ganda : 64 bit

Perbedaan dan persamaan nama (dan nilai) x86 dan ARM harus diperhatikan.

Catatan : Tanda bilangan bulat pada kedua tipe komputer merupakan komplemen dua.

Lokasi Memori
Dengan komputer Commodore-64, lokasi memori biasanya satu byte tetapi kadang-kadang bisa dua byte berturut-turut ketika mempertimbangkan pointer (pengalamatan tidak langsung). Dengan komputer x86 modern, lokasi memori adalah 16 byte berturut-turut ketika berhadapan dengan double quadword sebesar 16 byte (128 bit), 8 byte berturut-turut ketika berhadapan dengan quadword sebesar 8 byte (64 bit), 4 byte berturut-turut ketika berhadapan dengan doubleword sebesar 4 byte (32 bit), 2 byte berturut-turut ketika berhadapan dengan kata 2 byte (16 bit), dan 1 byte ketika berhadapan dengan satu byte (8 bit). Dengan komputer ARM modern, lokasi memori adalah 8 byte berturut-turut ketika berhadapan dengan doubleword 8 byte (64 bit), 4 byte berturut-turut ketika berhadapan dengan kata 4 byte (32 bit), 2 byte berturut-turut ketika berhadapan dengan setengah kata dari 2 byte (16 bit), dan 1 byte ketika berhadapan dengan byte (8 bit).

Bab ini menjelaskan kesamaan arsitektur CISC dan RISC serta perbedaannya. Hal ini dilakukan dibandingkan dengan komputer 6502 µP dan commodore-64 yang dapat diterapkan.

6.2 Diagram Blok Motherboard PC Modern

PC adalah singkatan dari Personal Komputer. Berikut ini adalah diagram blok dasar umum untuk motherboard modern dengan mikroprosesor tunggal untuk komputer pribadi. Ini mewakili motherboard CISC atau RISC.


Gambar 6.21 Diagram Blok Motherboard Dasar PC Modern

Tiga port internal ditunjukkan dalam diagram, tetapi dalam praktiknya ada lebih banyak lagi. Setiap port mempunyai register yang dapat dilihat sebagai port itu sendiri. Setiap rangkaian port memiliki setidaknya register lain yang dapat disebut “register status”. Register status menunjukkan port ke program yang mengirimkan sinyal interupsi ke mikroprosesor. Terdapat rangkaian pengontrol interupsi (tidak diperlihatkan) yang membedakan antara jalur interupsi yang berbeda dari port yang berbeda dan hanya memiliki beberapa jalur ke µP.

HD.C pada diagram adalah singkatan dari Hard Drive Card. NIC adalah singkatan dari Kartu Antarmuka Jaringan. Kartu hard drive (rangkaian) terhubung ke hard drive yang ada di dalam unit dasar (unit sistem) komputer modern. Kartu antarmuka jaringan (sirkuit) dihubungkan melalui kabel eksternal ke komputer lain. Dalam diagram, terdapat satu port dan DMA (lihat ilustrasi berikut) yang terhubung ke kartu hard disk dan/atau ke kartu antarmuka jaringan. DMA adalah singkatan dari Akses Memori Langsung.

Ingat dari bab komputer Commodore-64 bahwa untuk mengirim byte dari memori ke disk drive atau komputer lain, setiap byte harus disalin ke register di mikroprosesor sebelum disalin ke port internal yang sesuai, dan kemudian secara otomatis ke perangkat. Untuk menerima byte dari disk drive atau komputer lain ke memori, setiap byte harus disalin dari register port internal yang sesuai ke register mikroprosesor sebelum disalin ke memori. Ini biasanya memakan waktu lama jika jumlah byte dalam aliran besar. Solusi transfer cepat adalah penggunaan Direct Memory Access (rangkaian) tanpa melalui mikroprosesor.

Sirkuit DMA berada di antara port dan HD. C atau NIC. Dengan akses memori langsung dari rangkaian DMA, transfer aliran byte yang besar terjadi secara langsung antara rangkaian DMA dan memori (RAM) tanpa partisipasi lanjutan dari mikroprosesor. DMA menggunakan bus alamat dan bus data sebagai pengganti µP. Total durasi transfer lebih pendek dibandingkan jika hard µP akan digunakan. Baik HD C. atau NIC menggunakan DMA ketika mereka memiliki aliran data (byte) yang besar untuk ditransfer dengan RAM (memori).

GPU adalah singkatan dari Graphics Processing Unit. Blok pada motherboard ini bertanggung jawab untuk mengirimkan teks dan gambar bergerak atau diam ke layar.

Dengan komputer modern (PC), tidak ada Read Only Memory (ROM). Namun ada BIOS atau UEFI yang merupakan sejenis RAM non-volatile. Informasi di BIOS sebenarnya dikelola oleh baterai. Baterailah yang sebenarnya menjaga pengatur waktu jam, pada waktu dan tanggal yang tepat untuk komputer. UEFI ditemukan setelah BIOS, dan telah menggantikan BIOS meskipun BIOS masih cukup relevan di PC modern. Kita akan membahasnya lebih lanjut nanti!

Pada PC modern, bus alamat dan data antara µP dan sirkuit port internal (dan memori) bukanlah bus paralel. Mereka adalah bus serial yang memerlukan dua konduktor untuk transmisi dalam satu arah dan dua konduktor lainnya untuk transmisi dalam arah yang berlawanan. Artinya, misalnya, 32-bit dapat dikirim secara seri (satu bit demi satu) ke arah mana pun.

Jika transmisi serial hanya satu arah dengan dua konduktor (dua jalur), maka dikatakan half-duplex. Jika transmisi serial dua arah dengan empat konduktor, satu pasang di salah satu arah, maka dikatakan full-duplex.

Seluruh memori komputer modern masih terdiri dari serangkaian lokasi byte: delapan bit per byte. Komputer modern memiliki ruang memori minimal 4 giga byte = 4 x 210 x 2 10 x 2 10 = 4 x 1.073.741.824 10 byte = 4 x 1024 10/sub> x 1024 10 x 1024 10 = 4 x 1.073.741.824 10 .

Catatan : Meskipun tidak ada rangkaian pengatur waktu yang ditampilkan pada motherboard sebelumnya, semua motherboard modern memiliki rangkaian pengatur waktu.

6.3 Dasar-dasar Arsitektur Komputer x64

6.31 Kumpulan Daftar x64
Mikroprosesor 64-bit dari mikroprosesor seri x86 adalah mikroprosesor 64-bit. Cukup modern untuk menggantikan prosesor 32-bit dari seri yang sama. Register tujuan umum mikroprosesor 64-bit dan namanya adalah sebagai berikut:


Gambar 6.31 Register Tujuan Umum untuk x64

Enam belas (16) register tujuan umum ditunjukkan dalam ilustrasi yang diberikan. Masing-masing register ini memiliki lebar 64-bit. Melihat register di pojok kiri atas, 64 bit diidentifikasi sebagai RAX. 32 bit pertama dari register yang sama (dari kanan) diidentifikasi sebagai EAX. 16 bit pertama dari register yang sama (dari kanan) diidentifikasi sebagai AX. Byte kedua (dari kanan) register yang sama diidentifikasi sebagai AH (H di sini berarti tinggi). Dan byte pertama (dari register yang sama) diidentifikasi sebagai AL (L di sini berarti rendah). Melihat register di pojok kanan bawah, 64 bit diidentifikasi sebagai R15. 32 bit pertama dari register yang sama diidentifikasi sebagai R15D. 16 bit pertama dari register yang sama diidentifikasi sebagai R15W. Dan byte pertama diidentifikasi sebagai R15B. Nama register lainnya (dan sub register) dijelaskan dengan cara yang sama.

Ada beberapa perbedaan antara Intel dan AMD µPs. Informasi di bagian ini ditujukan untuk Intel.

Dengan 6502 µP, register Program Counter (tidak dapat diakses secara langsung) yang menampung instruksi selanjutnya yang akan dieksekusi memiliki lebar 16-bit. Di sini (x64), penghitung program disebut Penunjuk Instruksi, dan lebarnya 64-bit. Itu diberi label sebagai RIP. Artinya x64 µP dapat mengalamati hingga 264 = 1,844674407 x 1019 (sebenarnya 18,446,744,073,709,551,616) lokasi byte memori. RIP bukanlah register tujuan umum.

Stack Pointer Register atau RSP adalah salah satu dari 16 register tujuan umum. Ini menunjuk ke entri tumpukan terakhir di memori. Seperti pada 6502 µP, tumpukan untuk x64 bertambah ke bawah. Dengan x64, tumpukan di RAM digunakan untuk menyimpan alamat pengirim untuk subrutin. Ini juga digunakan untuk menyimpan “ruang bayangan” (lihat pembahasan berikut).

6502 µP memiliki register status prosesor 8-bit. Setara di x64 disebut register RFLAGS. Register ini menyimpan flag yang digunakan untuk hasil operasi dan untuk mengendalikan prosesor (µP). Lebarnya 64-bit. 32 bit yang lebih tinggi dicadangkan dan saat ini tidak digunakan. Tabel berikut memberikan nama, indeks, dan arti untuk bit yang umum digunakan dalam register RFLAGS:

Tabel 6.31.1
Bendera RFLAGS (Bit) yang paling banyak digunakan
Simbol Sedikit Nama Tujuan
CF 0 Membawa Ditetapkan jika operasi aritmatika menghasilkan carry atau peminjaman bagian hasil yang paling signifikan; dibersihkan sebaliknya. Bendera ini menunjukkan kondisi overflow untuk aritmatika bilangan bulat tak bertanda. Ini juga digunakan dalam aritmatika presisi ganda.
hal 2 Keseimbangan Ditetapkan jika byte terkecil dari hasil berisi bilangan genap 1 bit; dibersihkan sebaliknya.
DARI 4 Menyesuaikan Ditetapkan jika operasi aritmatika menghasilkan carry atau peminjaman bit 3 dari hasilnya; dibersihkan sebaliknya. Bendera ini digunakan dalam aritmatika desimal berkode biner (BCD).
ZF 6 Nol Ditetapkan jika hasilnya nol; dibersihkan sebaliknya.
SF 7 Tanda Ditetapkan jika sama dengan bit paling signifikan dari hasil yang merupakan bit tanda dari bilangan bulat bertanda (0 menunjukkan nilai positif dan 1 menunjukkan nilai negatif).
DARI sebelas Meluap Disetel jika hasil bilangan bulat merupakan bilangan positif yang terlalu besar atau bilangan negatif yang terlalu kecil (tidak termasuk bit tanda) untuk dimasukkan ke dalam operan tujuan; dibersihkan sebaliknya. Bendera ini menunjukkan kondisi luapan untuk aritmatika bilangan bulat bertanda (komplemen dua).
DF 10 Arah Ini diatur jika instruksi string arah beroperasi (kenaikan atau penurunan).
PENGENAL dua puluh satu Identifikasi Ditetapkan jika kemampuan perubahannya menunjukkan adanya instruksi CPUID.

Selain delapan belas register 64-bit yang disebutkan sebelumnya, arsitektur x64 µP memiliki delapan register lebar 80-bit untuk aritmatika floating point. Kedelapan register ini juga dapat digunakan sebagai register MMX (lihat pembahasan berikut). Ada juga enam belas register 128-bit untuk XMM (lihat pembahasan berikut).

Itu tidak semua tentang register. Ada lebih banyak register x64 yang merupakan register segmen (kebanyakan tidak digunakan di x64), register kontrol, register manajemen memori, register debug, register virtualisasi, register kinerja yang melacak segala macam parameter internal (cache hits/misses, operasi mikro dijalankan, pengaturan waktu , dan banyak lagi).

SIMD

SIMD adalah singkatan dari Single Intruction Multiple Data. Artinya satu instruksi bahasa assembly dapat bekerja pada banyak data sekaligus dalam satu mikroprosesor. Perhatikan tabel berikut:

1 2 3 4 5 6 7 8
+ 9 10 sebelas 12 13 14 limabelas 16
= 10 12 14 16 18 dua puluh 22 24

Pada tabel ini, delapan pasang angka dijumlahkan secara paralel (dalam durasi yang sama) sehingga menghasilkan delapan jawaban. Satu instruksi bahasa assembly dapat melakukan delapan penambahan bilangan bulat paralel dalam register MMX. Hal serupa dapat dilakukan dengan register XMM. Jadi, ada instruksi MMX untuk bilangan bulat dan instruksi XMM untuk float.

6.32 Peta Memori dan x64

Dengan Penunjuk Instruksi (Program Counter) yang mempunyai 64 bit, ini berarti 264 = 1.844674407 x 1019 lokasi byte memori dapat dialamatkan. Dalam heksadesimal, lokasi byte tertinggi adalah FFFF,FFFF,FFFF,FFFF16. Tidak ada komputer biasa saat ini yang mampu menyediakan ruang memori (lengkap) sebesar itu. Jadi, peta memori yang cocok untuk komputer x64 adalah sebagai berikut:

Perhatikan bahwa kesenjangan dari 0000,8000,0000,000016 ke FFFF,7FFF,FFFF,FFFF16 tidak memiliki lokasi memori (tidak ada bank RAM memori). Ini merupakan selisih FFFF,0000,0000,000116 yang cukup besar. Bagian atas kanonik memiliki sistem operasi, sedangkan bagian bawah kanonik memiliki program pengguna (aplikasi) dan data. Sistem operasi terdiri dari dua bagian: UEFI kecil (BIOS) dan sebagian besar yang dimuat dari hard drive. Bab berikutnya membahas lebih banyak tentang sistem operasi modern. Perhatikan kesamaannya dengan peta memori ini dan untuk Commodore-64 ketika 64KB mungkin terlihat seperti banyak memori.

Dalam konteks ini, sistem operasi secara kasar disebut “kernel”. Kernel ini mirip dengan Kernal pada komputer Commodore-64, tetapi memiliki lebih banyak subrutin.

Endianness untuk x64 adalah little endian, yang berarti bahwa untuk suatu lokasi, alamat yang lebih rendah menunjuk ke byte konten yang lebih rendah dalam memori.

6.33 Mode Pengalamatan Bahasa Majelis untuk x64

Mode pengalamatan adalah cara suatu instruksi dapat mengakses register µP dan memori (termasuk register port internal). X64 memiliki banyak mode pengalamatan, namun hanya mode pengalamatan yang umum digunakan yang dibahas di sini. Sintaks umum untuk instruksi di sini adalah:

tujuan opcode, sumber

Angka desimal ditulis tanpa awalan atau akhiran apa pun. Dengan 6502, sumbernya tersirat. X64 memiliki lebih banyak kode op daripada 6502, tetapi beberapa opcode memiliki mnemonik yang sama. Instruksi x64 individual memiliki panjang yang bervariasi dan ukurannya dapat berkisar dari 1 hingga 15 byte. Mode pengalamatan yang umum digunakan adalah sebagai berikut:

Mode Pengalamatan Segera
Di sini, operan sumber adalah nilai sebenarnya dan bukan alamat atau label. Contoh (baca komentar):

TAMBAHKAN EAX, 14 ; tambahkan desimal 14 ke EAX 32-bit dari RAX 64-bit, jawabannya tetap di EAX (tujuan)

Daftar untuk Mendaftarkan Mode Pengalamatan
Contoh:

TAMBAHKAN R8B, AL; tambahkan 8-bit AL RAX ke R8B dari 64-bit R8 – jawaban tetap di R8B (tujuan)

Mode Pengalamatan Tidak Langsung dan Terindeks
Pengalamatan tidak langsung dengan 6502 µP berarti lokasi alamat yang diberikan dalam instruksi mempunyai alamat efektif (penunjuk) dari lokasi akhir. Hal serupa terjadi dengan x64. Pengalamatan indeks dengan 6502 µP berarti bahwa isi register µP ditambahkan ke alamat yang diberikan dalam instruksi untuk mendapatkan alamat efektif. Hal serupa terjadi dengan x64. Selain itu, dengan x64, isi register juga dapat dikalikan dengan 1 atau 2 atau 4 atau 8 sebelum ditambahkan ke alamat yang diberikan. Instruksi mov (salin) pada x64 dapat menggabungkan pengalamatan tidak langsung dan terindeks. Contoh:

MOV R8W, 1234[8*RAX+RCX] ; pindahkan kata di alamat (8 x RAX + RCX) + 1234

Di sini, R8W memiliki 16-bit pertama dari R8. Alamat yang diberikan adalah 1234. Register RAX memiliki bilangan 64-bit yang dikalikan 8. Hasilnya ditambahkan ke isi register RCX 64-bit. Hasil kedua ini ditambahkan ke alamat yang diberikan yaitu 1234 untuk mendapatkan alamat efektif. Nomor di lokasi alamat efektif dipindahkan (disalin) ke tempat 16-bit pertama (R8W) dari register R8, menggantikan apa pun yang ada di sana. Perhatikan penggunaan tanda kurung siku. Ingatlah bahwa sebuah kata di x64 memiliki lebar 16-bit.

Pengalamatan Relatif RIP
Untuk 6502 µP, pengalamatan relatif hanya digunakan dengan instruksi cabang. Di sana, operan tunggal dari opcode adalah offset yang ditambahkan atau dikurangi ke konten Penghitung Program untuk alamat instruksi efektif (bukan alamat data). Hal serupa terjadi dengan x64 dimana Program Counter disebut sebagai Instruksi Pointer. Instruksi dengan x64 tidak hanya harus berupa instruksi cabang. Contoh pengalamatan relatif RIP adalah:

MOV AL, [RIP]

AL RAX memiliki nomor bertanda 8-bit yang ditambahkan atau dikurangi dari konten di RIP (penunjuk instruksi 64-bit) untuk menunjuk ke instruksi berikutnya. Perhatikan bahwa sumber dan tujuan ditukar secara khusus dalam instruksi ini. Perhatikan juga penggunaan tanda kurung siku yang mengacu pada isi RIP.

6.34 Instruksi yang Umum Digunakan x64

Dalam tabel berikut * berarti kemungkinan sufiks berbeda dari subset opcode:

Tabel 6.34.1
Petunjuk yang Biasa Digunakan di x64
Kode op Arti
MOV Pindahkan (salin) ke/dari/antara memori dan register
CMOV* Berbagai gerakan bersyarat
XCHG Menukarkan
BSWAP Pertukaran byte
DORONG/POP Penggunaan tumpukan
TAMBAHKAN/ADC Tambahkan/dengan membawa
SUB/SBC Kurangi/dengan membawa
MUL/IMUL Kalikan/tidak ditandatangani
DIV/IDIV Bagi/tidak ditandatangani
INC/DES Kenaikan/Penurunan
NEGATIF Meniadakan
CMP Membandingkan
DAN/ATAU/XOR/TIDAK Operasi bitwise
SHR/SAR Geser logika/aritmatika ke kanan
SHL/SAL Geser ke kiri logika/aritmatika
ROR/PERAN Putar ke kanan/kiri
RCR/RCL Putar ke kanan/kiri melalui bit carry
BT/BTS/BTR Uji bit/dan setel/dan setel ulang
JMP Lompatan tanpa syarat
JE/JNE/JC/JNC/J* Lompat jika sama/tidak sama/carry/tidak carry/banyak lainnya
BERJALAN / BERJALAN / BERJALAN Ulangi dengan ECX
PANGGILAN/PULIH Panggil subrutin/kembali
TIDAK Tidak ada operasi
ID CPU informasi prosesor

X64 memiliki instruksi perkalian dan pembagian. Ia memiliki sirkuit perangkat keras perkalian dan pembagian dalam µP-nya. 6502 µP tidak memiliki rangkaian perangkat keras perkalian dan pembagian. Lebih cepat melakukan perkalian dan pembagian dengan perangkat keras dibandingkan dengan perangkat lunak (termasuk perpindahan bit).

Instruksi Tali
Ada beberapa instruksi string, namun yang akan dibahas disini hanyalah instruksi MOVS (untuk memindahkan string) untuk menyalin string yang dimulai dari alamat C000 H . Untuk memulai di alamat C100 H , gunakan instruksi berikut:

BERGERAK [C100H], [C000H]

Perhatikan akhiran H untuk heksadesimal.

6.35 Perulangan di x64

6502 µP memiliki instruksi cabang untuk perulangan. Instruksi cabang melompat ke lokasi alamat yang memiliki instruksi baru. Lokasi alamat dapat disebut “loop”. X64 memiliki instruksi LOOP/LOOPE/LOOPNE untuk perulangan. Kata-kata bahasa assembly yang dicadangkan ini berbeda dengan label “loop” (tanpa tanda kutip). Perilakunya adalah sebagai berikut:

LOOP mengurangi ECX dan memeriksa apakah ECX bukan nol. Jika kondisi tersebut (nol) terpenuhi, ia akan melompat ke label tertentu. Jika tidak, maka akan gagal (lanjutkan dengan instruksi selanjutnya dalam diskusi berikut).

LOOPE mengurangi ECX dan memeriksa apakah ECX bukan nol (misalnya 1) dan ZF disetel (ke 1). Jika kondisi ini terpenuhi, ia akan melompat ke label. Kalau tidak, ia akan gagal.

LOOPNE mengurangi ECX dan memeriksa apakah ECX bukan nol dan ZF TIDAK disetel (yaitu, menjadi nol). Jika kondisi ini terpenuhi, ia akan melompat ke label. Kalau tidak, ia akan gagal.

Dengan x64, register RCX atau sub bagiannya seperti ECX atau CX, menampung bilangan bulat penghitung. Dengan instruksi LOOP, penghitung biasanya menghitung mundur, berkurang 1 untuk setiap lompatan (loop). Pada segmen kode perulangan berikut, angka dalam register EAX bertambah dari 0 menjadi 10 dalam sepuluh iterasi sedangkan angka dalam ECX dihitung (dikurangi) turun 10 kali (baca komentar):

MOV EAX, 0 ;
MOV ECX, 10 ; hitung mundur 10 kali secara default, satu kali untuk setiap iterasi
label:
INC EAX; menambah EAX sebagai badan loop
label lingkaran; kurangi EAX, dan jika EAX bukan nol, jalankan kembali badan perulangan dari “label:”

Pengkodean loop dimulai dari “label:”. Perhatikan penggunaan titik dua. Pengkodean loop diakhiri dengan “label LOOP” yang bertuliskan pengurangan EAX. Jika isinya bukan nol, kembali ke instruksi setelah “label:” dan jalankan kembali instruksi apa pun (semua instruksi isi) yang turun hingga “label LOOP”. Perhatikan bahwa “label” masih dapat memiliki nama lain.

6.36 Masukan/Keluaran x64

Bagian bab ini membahas pengiriman data ke port keluaran (internal) atau menerima data dari port masukan (internal). Chipset ini memiliki port delapan bit. Dua port 8-bit yang berurutan dapat dianggap sebagai port 16-bit, dan empat port yang berurutan dapat dianggap sebagai port 32-bit. Dengan cara ini, prosesor dapat mentransfer 8, 16, atau 32 bit ke atau dari perangkat eksternal.

Informasi dapat ditransfer antara prosesor dan port internal dengan dua cara: menggunakan apa yang dikenal sebagai input/output yang dipetakan memori atau menggunakan ruang alamat input/output terpisah. I/O yang dipetakan memori seperti yang terjadi pada prosesor 6502 di mana alamat port sebenarnya merupakan bagian dari keseluruhan ruang memori. Dalam hal ini, saat mengirim data ke lokasi alamat tertentu, data tersebut masuk ke port dan bukan ke bank memori. Port mungkin memiliki ruang alamat I/O terpisah. Dalam kasus terakhir ini, semua bank memori memiliki alamatnya dari nol. Ada rentang alamat terpisah dari 0000H hingga FFFF16. Ini digunakan oleh port di chipset. Motherboard diprogram agar tidak membingungkan antara I/O yang dipetakan memori dan ruang alamat I/O yang terpisah.

I/O yang Dipetakan Memori
Dengan ini, port dianggap sebagai lokasi memori, dan opcode normal yang digunakan antara memori dan µP digunakan untuk transfer data antara µP dan port. Jadi, untuk memindahkan byte dari port di alamat F000H ke register µP RAX:EAX:AX:AL, lakukan hal berikut:

MOV AL, [F000H]

Sebuah string dapat dipindahkan dari memori ke port dan sebaliknya. Contoh:

MOVS [F000H], [C000H] ; sumbernya adalah C000H, dan tujuannya adalah port di F000H.

Ruang Alamat I/O yang terpisah

Dengan ini, instruksi khusus untuk input dan output harus digunakan.

Mentransfer Item Tunggal
Register prosesor untuk transfer adalah RAX. Sebenarnya RAX:EAX untuk doubleword, RAX:EAX:AX ​​untuk word, dan RAX:EAX:AX:AL untuk byte. Jadi, untuk mentransfer byte dari port di FFF0h, ke RAX:EAX:AX:AL, ketikkan perintah berikut:

DALAM AL, [FFF0H]

Untuk transfer terbalik, ketikkan yang berikut ini:

KELUAR [FFF0H], AL

Jadi, untuk item tunggal, instruksinya adalah IN dan OUT. Alamat port juga dapat diberikan dalam register RDX:EDX:DX.

Mentransfer String
Sebuah string dapat ditransfer dari memori ke port chipset dan sebaliknya. Untuk mentransfer string dari port di alamat FFF0H ke memori, mulai dari C100H, ketik:

DALAM [ESI], [DX]

yang mempunyai efek yang sama dengan:

DALAM [EDI], [DX]

Pemrogram harus memasukkan alamat port dua byte FFF0H ke dalam register RDX:EDX:Dx, dan harus memasukkan alamat dua byte C100H ke dalam register RSI:ESI atau RDI:EDI. Untuk transfer sebaliknya, lakukan hal berikut:

DALAM [DX], [ESI]

yang mempunyai efek yang sama dengan:

DALAM [DX], [EDI]

6.37 Tumpukan di x64

Seperti prosesor 6502, prosesor x64 juga memiliki tumpukan RAM. Stack untuk x64 bisa 2 16 = Panjang 65.536 byte atau bisa juga 2 32 = 4.294.967.296 byte panjangnya. Itu juga tumbuh ke bawah. Ketika isi register dimasukkan ke dalam tumpukan, angka dalam penunjuk tumpukan RSP berkurang sebesar 8. Ingatlah bahwa alamat memori untuk x64 memiliki lebar 64 bit. Nilai dalam penunjuk tumpukan dalam µP menunjuk ke lokasi berikutnya dalam tumpukan di RAM. Ketika isi register (atau nilai dalam satu operan) dikeluarkan dari tumpukan ke dalam register, angka di penunjuk tumpukan RSP bertambah sebesar 8. Sistem operasi menentukan ukuran tumpukan dan di mana ia dimulai di RAM dan tumbuh ke bawah. Ingatlah bahwa tumpukan adalah struktur Last-In-First-Out (LIFO) yang dalam hal ini tumbuh ke bawah dan menyusut ke atas.

Untuk mendorong konten register µP RBX ke tumpukan, lakukan hal berikut:

DORONG RBX

Untuk mengembalikan entri terakhir di tumpukan ke RBX, lakukan hal berikut:

POP RBX

6.38 Prosedur di x64

Subrutin di x64 disebut “prosedur”. Tumpukan digunakan di sini lebih banyak daripada yang digunakan untuk 6502 µP. Sintaks untuk prosedur x64 adalah:

nama_proc:
badan prosedur

Kanan

Sebelum melanjutkan, perhatikan bahwa opcode dan label untuk subrutin x64 (instruksi bahasa perakitan secara umum) tidak peka huruf besar-kecil. Artinya proc_name sama dengan PROC_NAME. Seperti 6502, nama nama prosedur (label) dimulai pada awal baris baru di editor teks untuk bahasa assembly. Ini diikuti oleh titik dua dan bukan spasi dan opcode seperti pada 6502. Badan subrutin mengikuti, diakhiri dengan RET dan bukan RTS seperti pada 6502 µP. Seperti halnya 6502, setiap instruksi dalam badan, termasuk RET, tidak dimulai pada awal barisnya. Perhatikan bahwa panjang label di sini bisa lebih dari 8 karakter. Untuk memanggil prosedur ini, dari atas atau bawah prosedur yang diketik, lakukan hal berikut:

PANGGILAN nama_proc

Dengan 6502, nama label hanya diketik untuk pemanggilan. Namun, di sini, kata khusus “CALL” atau “call” diketik, diikuti dengan nama prosedur (subrutin) setelah spasi.

Ketika berhadapan dengan prosedur, biasanya ada dua prosedur. Prosedur yang satu memanggil prosedur yang lain. Prosedur yang memanggil (memiliki instruksi panggilan) disebut “pemanggil”, dan prosedur yang dipanggil disebut “callee”. Ada konvensi (aturan) yang harus diikuti.

Aturan Penelepon

Penelepon harus mematuhi aturan berikut saat menjalankan subrutin:

1. Sebelum memanggil subrutin, pemanggil harus menyimpan isi register tertentu yang ditunjuk sebagai pemanggil-disimpan ke tumpukan. Register yang disimpan oleh pemanggil adalah R10, R11, dan semua register tempat parameter dimasukkan (RDI, RSI, RDX, RCX, R8, R9). Jika isi register ini ingin dipertahankan selama panggilan subrutin, dorong register tersebut ke dalam tumpukan alih-alih menyimpannya di RAM. Hal ini harus dilakukan karena register harus digunakan oleh callee untuk menghapus konten sebelumnya.

2. Jika prosedurnya adalah menjumlahkan dua angka misalnya, kedua angka tersebut adalah parameter yang akan diteruskan ke tumpukan. Untuk meneruskan parameter ke subrutin, masukkan enam parameter ke dalam register berikut secara berurutan: RDI, RSI, RDX, RCX, R8, R9. Jika ada lebih dari enam parameter pada subrutin, dorong sisanya ke tumpukan dalam urutan terbalik (yaitu, parameter terakhir terlebih dahulu). Karena tumpukan bertambah, parameter tambahan pertama (sebenarnya parameter ketujuh) disimpan di alamat terendah (inversi parameter ini secara historis digunakan untuk memungkinkan fungsi (subrutin) diteruskan dengan sejumlah parameter yang bervariasi).

3. Untuk memanggil subrutin (prosedur), gunakan instruksi panggilan. Instruksi ini menempatkan alamat pengirim di atas parameter pada tumpukan (posisi terendah) dan cabang ke kode subrutin.

4. Setelah subrutin kembali (yaitu segera setelah instruksi panggilan), pemanggil harus menghapus parameter tambahan apa pun (di luar enam parameter yang disimpan dalam register) dari tumpukan. Ini mengembalikan tumpukan ke keadaannya sebelum panggilan dilakukan.

5. Penelepon dapat menemukan nilai kembalian (alamat) subrutin dalam register RAX.

6. Penelepon mengembalikan isi register yang disimpan oleh pemanggil (R10, R11, dan semua register yang meneruskan parameter) dengan mengeluarkannya dari tumpukan. Penelepon dapat berasumsi bahwa tidak ada register lain yang diubah oleh subrutin.

Karena struktur konvensi pemanggilan, biasanya beberapa (atau sebagian besar) langkah ini tidak akan membuat perubahan apa pun pada tumpukan. Misalnya, jika ada enam parameter atau kurang, tidak ada yang dimasukkan ke tumpukan pada langkah tersebut. Demikian pula, pemrogram (dan kompiler) biasanya menyimpan hasil yang mereka pedulikan dari register yang disimpan pemanggil pada langkah 1 dan 6 untuk mencegah kelebihan push dan pop.

Ada dua cara lain untuk meneruskan parameter ke subrutin, namun cara tersebut tidak akan dibahas dalam kursus karir online ini. Salah satunya menggunakan tumpukan itu sendiri, bukan register tujuan umum.

Aturan Callee

Definisi subrutin yang dipanggil harus mematuhi aturan berikut:

1. Alokasikan variabel lokal (variabel yang dikembangkan dalam prosedur) menggunakan register atau memberi ruang pada stack. Ingat tumpukannya tumbuh ke bawah. Jadi, untuk memberi ruang di bagian atas tumpukan, penunjuk tumpukan harus dikurangi. Jumlah pengurangan penunjuk tumpukan bergantung pada jumlah variabel lokal yang diperlukan. Misalnya, jika float lokal dan long lokal (total 12 byte) diperlukan, penunjuk tumpukan perlu dikurangi 12 untuk memberi ruang bagi variabel lokal ini. Dalam bahasa tingkat tinggi seperti C, ini berarti mendeklarasikan variabel tanpa menetapkan (menginisialisasi) nilainya.

2. Selanjutnya, nilai register apa pun yang merupakan simpanan panggilan yang ditunjuk (register tujuan umum yang tidak disimpan oleh pemanggil) yang digunakan oleh fungsi tersebut harus disimpan. Untuk menyimpan register, dorong register ke tumpukan. Register yang disimpan oleh callee adalah RBX, RBP, dan R12 hingga R15 (RSP juga dipertahankan oleh konvensi panggilan, tetapi tidak perlu dimasukkan ke dalam tumpukan selama langkah ini).

Setelah ketiga tindakan ini dilakukan, operasi subrutin yang sebenarnya dapat dilanjutkan. Ketika subrutin siap untuk kembali, aturan konvensi panggilan dilanjutkan.

3. Ketika subrutin selesai, nilai kembalian untuk subrutin tersebut harus ditempatkan di RAX jika belum ada.

4. Subrutin harus mengembalikan nilai lama dari setiap register yang disimpan callee (RBX, RBP, dan R12 hingga R15) yang telah dimodifikasi. Isi register dipulihkan dengan mengeluarkannya dari tumpukan. Perhatikan bahwa register harus dimunculkan dalam urutan terbalik saat didorong.

5. Selanjutnya, kita membatalkan alokasi variabel lokal. Cara termudah untuk melakukannya adalah dengan menambahkan ke RSP jumlah yang sama dengan yang telah dikurangi pada langkah 1.

6. Terakhir, kita kembali ke pemanggil dengan menjalankan instruksi ret. Instruksi ini akan menemukan dan menghapus alamat pengirim yang sesuai dari tumpukan.

Contoh isi subrutin pemanggil untuk memanggil subrutin lain yaitu “myFunc” adalah sebagai berikut (baca komentar):

; Ingin memanggil fungsi 'myFunc' yang memerlukan tiga
; parameter bilangan bulat. Parameter pertama ada di RAX.
; Parameter kedua adalah konstanta 456. Ketiga
; parameter ada di lokasi memori 'variabl'

dorong rdi; rdi akan menjadi param, jadi simpanlah
; retVal panjang = myFunc ( x , 456 , z ) ;

pindahkan rdi, rax; letakkan parameter pertama di RDI
pindah rsi, 456 ; letakkan parameter kedua di RSI
mov rdx , [variabel] ; letakkan parameter ketiga di RDX

hubungi myFunc; panggil fungsinya

pop rdi; memulihkan nilai RDI yang disimpan
; nilai pengembalian myFunc sekarang tersedia di RAX

Contoh fungsi callee (myFunc) adalah (baca komentar):

fungsi saya :
; ∗∗∗ Prolog subrutin standar ∗∗∗
subrsp, 8 ; ruang untuk variabel lokal 64−bit (hasil) menggunakan opcode “sub”.

tekan rbx; simpan callee−simpan register
tekan rbp; keduanya akan digunakan oleh myFunc

; ∗∗∗ Sub rutin Badan ∗∗∗
pindahkan rax, rdi; parameter 1 ke RAX
pindahkan rbp, rsi; parameter 2 ke RBP
pindahkan rbx, rdx; parameter 3 hingga rb x
bergerak [ rsp + 1 6 ] , rbx ; masukkan rbx ke dalam variabel lokal
tambahkan [ rsp + 1 6 ] , rbp ; tambahkan rbp ke dalam variabel lokal
mov rax , [ rsp +16 ] ; pindahkan konten variabel lokal ke RAX
; (nilai pengembalian/hasil akhir)

; ∗∗∗ Epilog subrutin standar ∗∗∗
pop rbp ; pulihkan callee simpan register
pop rbx; kebalikan dari saat didorong
tambahkan rsp, 8 ; membatalkan alokasi variabel lokal. 8 berarti 8 byte
mundur; pop nilai teratas dari tumpukan, lompat ke sana

6.39 Interupsi dan Pengecualian untuk x64

Prosesor menyediakan dua mekanisme untuk menghentikan eksekusi program, interupsi, dan pengecualian:

  • Interupsi adalah peristiwa asinkron (dapat terjadi kapan saja) yang biasanya dipicu oleh perangkat I/O.
  • Pengecualian adalah peristiwa sinkron (terjadi saat kode dieksekusi, diprogram sebelumnya, berdasarkan beberapa kejadian) yang dihasilkan ketika prosesor mendeteksi satu atau lebih kondisi yang telah ditentukan saat menjalankan instruksi. Tiga kelas pengecualian ditentukan: kesalahan, jebakan, dan pembatalan.

Prosesor merespons interupsi dan pengecualian pada dasarnya dengan cara yang sama. Ketika interupsi atau pengecualian diberi sinyal, prosesor menghentikan eksekusi program atau tugas saat ini dan beralih ke prosedur pengendali yang ditulis khusus untuk menangani kondisi interupsi atau pengecualian. Prosesor mengakses prosedur handler melalui entri di Interrupt Descriptor Table (IDT). Ketika handler telah selesai menangani interupsi atau pengecualian, kontrol program dikembalikan ke program atau tugas yang diinterupsi.

Sistem operasi, eksekutif, dan/atau driver perangkat biasanya menangani interupsi dan pengecualian secara independen dari program aplikasi atau tugas. Namun, program aplikasi dapat mengakses penangan interupsi dan pengecualian yang tergabung dalam sistem operasi atau menjalankannya melalui panggilan bahasa rakitan.

Delapan belas (18) interupsi dan pengecualian yang telah ditentukan sebelumnya, yang terkait dengan entri dalam IDT, telah ditentukan. Dua ratus dua puluh empat (224) interupsi yang ditentukan pengguna juga dapat dibuat dan dikaitkan dengan tabel. Setiap interupsi dan pengecualian dalam IDT diidentifikasi dengan nomor yang disebut “vektor”. Tabel 6.39.1 berisi daftar interupsi dan pengecualian dengan entri dalam IDT dan vektornya masing-masing. Vektor 0 hingga 8, 10 hingga 14, dan 16 hingga 19 adalah interupsi dan pengecualian yang telah ditentukan sebelumnya. Vektor 32 hingga 255 adalah untuk interupsi yang ditentukan perangkat lunak (pengguna) yang merupakan interupsi perangkat lunak atau interupsi perangkat keras yang dapat disembunyikan.

Ketika prosesor mendeteksi interupsi atau pengecualian, prosesor melakukan salah satu hal berikut:

  • Jalankan panggilan implisit ke prosedur pengendali
  • Jalankan panggilan implisit ke tugas pengendali

6.4 Dasar-dasar Arsitektur Komputer ARM 64-Bit

Arsitektur ARM menentukan rangkaian prosesor RISC yang cocok untuk digunakan dalam berbagai macam aplikasi. ARM adalah arsitektur pemuatan/penyimpanan yang mengharuskan data dimuat dari memori ke register sebelum pemrosesan apa pun seperti operasi ALU (Unit Logika Aritmatika) dapat dilakukan dengannya. Instruksi selanjutnya menyimpan hasilnya kembali ke memori. Meskipun ini mungkin tampak seperti langkah mundur dari arsitektur x86 dan x64, yang beroperasi secara langsung pada operan di memori dalam satu instruksi (tentu saja menggunakan register prosesor), pendekatan muat/penyimpanan, dalam praktiknya, memungkinkan beberapa operasi berurutan untuk dilakukan dengan kecepatan tinggi pada operan setelah dimuat ke salah satu dari banyak register prosesor. Prosesor ARM memiliki pilihan little endianness atau big-endianness. Setting default ARM 64 adalah little-endian yang merupakan konfigurasi yang umum digunakan oleh sistem operasi. Arsitektur ARM 64-bit bersifat modern dan dirancang untuk menggantikan arsitektur ARM 32-bit.

Catatan : Setiap instruksi untuk ARM µP 64-bit panjangnya 4 byte (32 bit).

6.41 Kumpulan Daftar ARM 64-Bit
Ada 31 register 64-bit tujuan umum untuk ARM µP 64-bit. Diagram berikut menunjukkan register tujuan umum dan beberapa register penting:


Gambar.4.11.1 Tujuan Umum 64-Bit dan Beberapa Register Penting

Register tujuan umum disebut sebagai X0 hingga X30. Bagian 32-bit pertama untuk setiap register disebut sebagai W0 hingga W30. Jika perbedaan antara 32 bit dan 64 bit tidak ditekankan, awalan “R” digunakan. Misalnya, R14 mengacu pada W14 atau X14.

6502 µP mempunyai Program Counter 16-bit dan dapat mengalamatkan 2 16 lokasi byte memori. ARM µP 64-bit memiliki Penghitung Program 64-bit dan dapat mengalamatkan hingga 2 64 = 1,844674407 x 1019 (sebenarnya 18,446,744,073,709,551,616) lokasi byte memori. Penghitung program menyimpan alamat instruksi selanjutnya yang akan dieksekusi. Panjang instruksi ARM64 atau AArch64 biasanya empat byte. Prosesor secara otomatis menambah register ini sebanyak empat setelah setiap instruksi diambil dari memori.

Register Stack Pointer atau SP tidak termasuk di antara 31 register tujuan umum. Penunjuk tumpukan arsitektur apa pun menunjuk ke entri tumpukan terakhir di memori. Untuk ARM-64, tumpukannya bertambah ke bawah.

6502 µP memiliki Daftar Status Prosesor 8-bit. Setara di ARM64 disebut register PSTATE. Register ini menyimpan flag yang digunakan untuk hasil operasi dan untuk mengendalikan prosesor (µP). Lebarnya 32-bit. Tabel berikut memberikan nama, indeks, dan arti untuk bit yang umum digunakan dalam register PSTATE:

Tabel 6.41.1
Bendera PSTATE (Bit) yang Paling Banyak Digunakan
Simbol Sedikit Tujuan
M 0-3 Mode: Tingkat hak istimewa eksekusi saat ini (USR, SVC, dan seterusnya).
T 4 Thumb: Diset jika set instruksi T32 (Thumb) aktif. Jika jelas, set instruksi ARM aktif. Kode pengguna dapat mengatur dan menghapus bit ini.
DAN 9 Endianness: Mengatur bit ini mengaktifkan mode big-endian. Jika jelas, mode little-endian aktif. Standarnya adalah mode little-endian.
Q 27 Bendera saturasi kumulatif: Ditetapkan jika, pada titik tertentu dalam serangkaian operasi, terjadi luapan atau saturasi
DI DALAM 28 Bendera luapan: Disetel jika operasi menghasilkan luapan yang ditandatangani.
C 29 Bendera carry: Ini menunjukkan apakah penambahan menghasilkan carry atau pengurangan menghasilkan pinjaman.
DENGAN 30 Bendera Nol: Ditetapkan jika hasil suatu operasi adalah nol.
N 31 Bendera negatif: Disetel jika hasil suatu operasi negatif.

ARM-64 µP memiliki banyak register lainnya.

SIMD
SIMD adalah singkatan dari Instruksi Tunggal, Banyak Data. Artinya satu instruksi bahasa assembly dapat bekerja pada banyak data sekaligus dalam satu mikroprosesor. Ada tiga puluh dua register lebar 128 bit untuk digunakan dengan SIMD dan operasi floating-point.

6.42 Pemetaan Memori
RAM dan DRAM keduanya merupakan Memori Akses Acak. DRAM lebih lambat dalam pengoperasiannya dibandingkan RAM. DRAM lebih murah dibandingkan RAM. Jika terdapat lebih dari 32 gigabyte (GB) DRAM berkelanjutan di memori, akan ada lebih banyak masalah manajemen memori: 32 GB = 32 x 1024 x 1024 x 1024 byte. Untuk keseluruhan ruang memori yang jauh lebih besar dari 32 GB, sebaiknya DRAM di atas 32 GB diselingi dengan RAM untuk pengelolaan memori yang lebih baik. Untuk memahami peta memori ARM-64, Anda harus terlebih dahulu memahami peta memori 4GB untuk Unit Pemrosesan Pusat (CPU) ARM 32-bit. CPU berarti μP. Untuk komputer 32-bit, ruang memori maksimum yang dapat dialamatkan adalah 2 32 = 4x2 10 x 2 10 x 2 10 = 4 x 1024 x 1024 x 1024 = 4.294.967.296 = 4 GB.

Peta Memori ARM 32-Bit
Peta memori untuk ARM 32-bit adalah:

Untuk komputer 32-bit, ukuran maksimum seluruh memori adalah 4GB. Dari alamat 0GB hingga alamat 1GB adalah Sistem Operasi ROM, RAM, dan lokasi I/O. Seluruh gagasan tentang ROM OS, RAM, dan alamat I/O mirip dengan situasi Commodore-64 dengan kemungkinan CPU 6502. ROM OS untuk Commodore-64 berada di bagian atas ruang memori. ROM OS di sini jauh lebih besar daripada Commodore-64, dan berada di awal seluruh ruang alamat memori. Jika dibandingkan dengan komputer modern lainnya, ROM OS di sini tergolong lengkap, dalam artian sebanding dengan jumlah OS yang ada di harddisknya. Ada dua alasan utama untuk memiliki OS di sirkuit terintegrasi ROM: 1) CPU ARM sebagian besar digunakan di perangkat kecil seperti ponsel pintar. Banyak hard drive yang lebih besar dari ponsel pintar dan perangkat kecil lainnya, 2) untuk keamanan. Ketika OS berada dalam memori Read Only, maka tidak dapat dirusak (ditimpa sebagian) oleh hacker. Bagian RAM dan bagian input/output juga sangat besar dibandingkan dengan Commodore-64.

Saat daya dinyalakan dengan OS ROM 32-bit, OS harus dimulai pada (boot dari) alamat 0x00000000 atau alamat 0xFFFF0000 jika HiVECs diaktifkan. Jadi, ketika daya dihidupkan setelah fase reset, perangkat keras CPU memuat 0x00000000 atau 0xFFFF0000 ke Penghitung Program. Awalan “0x” berarti Heksadesimal. Alamat boot CPU ARMv8 64bit adalah implementasi yang ditentukan. Namun, penulis menyarankan teknisi komputer untuk memulai dari 0x00000000 atau 0xFFFF0000 demi kompatibilitas ke belakang.

Dari 1GB hingga 2GB adalah input/output yang dipetakan. Terdapat perbedaan antara I/O yang dipetakan dan hanya I/O yang ditemukan antara 0GB dan 1GB. Dengan I/O, alamat untuk setiap port ditetapkan seperti pada Commodore-64. Dengan I/O yang dipetakan, alamat setiap port belum tentu sama untuk setiap pengoperasian komputer (dinamis).

Dari 2GB hingga 4GB adalah DRAM. Ini adalah RAM yang diharapkan (atau biasa). DRAM adalah singkatan dari Dynamic RAM, bukan berarti perubahan alamat selama pengoperasian komputer tetapi dalam arti bahwa nilai setiap sel dalam RAM fisik harus disegarkan pada setiap pulsa clock.

Catatan :

  • Dari 0x0000,0000 hingga 0x0000,FFFF adalah ROM OS.
  • Dari 0x0001,0000 hingga 0x3FFF,FFFF, bisa ada lebih banyak ROM, lalu RAM, dan kemudian beberapa I/O.
  • Dari 0x4000,0000 hingga 0x7FFF,FFFF, I/O tambahan dan/atau I/O yang dipetakan diperbolehkan.
  • Dari 0x8000,0000 hingga 0xFFFF,FFFF adalah DRAM yang diharapkan.

Ini berarti bahwa DRAM yang diharapkan tidak harus dimulai pada batas memori 2GB, dalam praktiknya. Mengapa programmer harus menghormati batasan ideal ketika tidak ada cukup bank RAM fisik yang ditempatkan pada motherboard? Hal ini karena pelanggan tidak memiliki cukup uang untuk semua bank RAM.

Peta Memori ARM 36-Bit
Untuk komputer ARM 64-bit, semua 32 bit digunakan untuk mengalamatkan seluruh memori. Untuk komputer ARM 64-bit, 36 bit pertama dapat digunakan untuk mengalamatkan seluruh memori yang dalam hal ini adalah 2 36 = 68.719.476.736 = 64 GB. Ini sudah menjadi kenangan yang banyak. Komputer biasa saat ini tidak memerlukan memori sebanyak itu. Ini belum mencapai batas maksimum memori yang dapat diakses oleh 64 bit. Peta memori untuk 36-bit untuk CPU ARM adalah:

Dari alamat 0GB ke alamat 4GB adalah peta memori 32-bit. “Dicadangkan” berarti tidak digunakan dan disimpan untuk digunakan di masa mendatang. Tidak harus bank memori fisik yang ditempatkan pada motherboard untuk mendapatkan ruang tersebut. Di sini, DRAM dan I/O yang dipetakan memiliki arti yang sama dengan peta memori 32-bit.

Situasi berikut mungkin ditemukan dalam praktik:

  • 0x1 0000 0000 – 0x3 FFFF FFFF; disimpan. Ruang alamat 12GB dicadangkan untuk penggunaan di masa mendatang.
  • 0x4 0000 0000 – 0x7 FFFF FFFF; I/O yang dipetakan. Ruang alamat sebesar 16 GB tersedia untuk I/O yang dipetakan secara dinamis.
  • 0x8 0000 0000 – 0x8 7FFF FFFF FFFF; Lubang atau DRAM. Ruang alamat 2 GB dapat berisi salah satu hal berikut:
    • Lubang untuk mengaktifkan partisi perangkat DRAM (seperti yang dijelaskan pada pembahasan berikut).
    • DRAM.
  • 0x8 8000 0000 – 0xF FFFF FFFF; DRAM. Ruang alamat 30GB untuk DRAM.

Peta memori ini adalah superset dari peta alamat 32-bit, dengan ruang tambahan dibagi menjadi 50% DRAM (1/2) dengan lubang opsional di dalamnya dan 25% ruang I/O yang dipetakan dan ruang cadangan (1/4 ). Sisanya 25% (1/4) untuk peta memori 32-bit ½ + ¼ + ¼ = 1.

Catatan : Dari 32 bit menjadi 360 bit merupakan penambahan 4 bit ke sisi paling signifikan dari 36 bit.

Peta Memori 40-Bit
Peta alamat 40-bit adalah superset dari peta alamat 36-bit dan mengikuti pola yang sama yaitu 50% DRAM dari lubang opsional di dalamnya, 25% ruang I/O yang dipetakan dan ruang yang dicadangkan, dan sisanya 25% ruang untuk peta memori sebelumnya (36-bit). Diagram untuk peta memori adalah:

Ukuran lubangnya adalah 544 – 512 = 32GB. Situasi berikut mungkin ditemukan dalam praktik:

  • 0x10 0000 0000 – 0x3F FFFF FFFF; disimpan. Ruang alamat 192GB dicadangkan untuk penggunaan di masa mendatang.
  • 0x40 0000 0000 – 0x7F FFFF FFFF; dipetakan. I/O Ruang alamat 256 GB tersedia untuk I/O yang dipetakan secara dinamis.
  • 0x80 0000 0000 – 0x87 FFFF FFFF; lubang atau DRAM. Ruang alamat 32 GB dapat berisi salah satu hal berikut:
    • Lubang untuk mengaktifkan partisi perangkat DRAM (seperti yang dijelaskan pada pembahasan berikut)
    • DRAM
  • 0x88 0000 0000 – 0xFF FFFF FFFF; DRAM. Ruang alamat 480GB untuk DRAM.

Catatan : Dari 36 bit menjadi 40 bit merupakan penambahan 4 bit ke sisi paling signifikan dari 36 bit.

Lubang DRAM
Dalam peta memori di luar 32-bit, itu bisa berupa Lubang DRAM atau kelanjutan DRAM dari atas. Jika berupa lubang, hal ini dapat dipahami sebagai berikut: Lubang DRAM menyediakan cara untuk mempartisi perangkat DRAM besar ke dalam beberapa rentang alamat. Lubang DRAM opsional diusulkan pada awal batas alamat DRAM yang lebih tinggi. Hal ini memungkinkan skema decoding yang disederhanakan ketika mempartisi perangkat DRAM berkapasitas besar di wilayah alamat fisik yang lebih rendah.

Misalnya, bagian DRAM 64GB dibagi lagi menjadi tiga wilayah dengan offset alamat dilakukan dengan pengurangan sederhana dalam bit alamat tingkat tinggi sebagai berikut:

Tabel 6.42.1
Contoh Partisi DRAM 64GB Berlubang
Alamat Fisik di SoC Mengimbangi Alamat DRAM internal
2 GByte (peta 32-bit) 0x00 8000 0000 – 0x00 FFFF FFFF -0x00 8000 0000 0x00 0000 0000 – 0x00 7FFF FFFF
30 GByte (peta 36-bit) 0x08 8000 0000 – 0x0F FFFF FFFF -0x08 0000 0000 0x00 8000 0000 – 0x07 FFFF FFFF
32 GByte (peta 40-bit) 0x88 0000 0000 – 0x8F FFFF FFFF -0x80 0000 0000 0x08 0000 0000 – 0x0F FFFF FFFF

Usulan Peta Memori Beralamat 44-Bit dan 48-Bit untuk CPU ARM
Asumsikan Komputer Pribadi memiliki memori 1024GB (= 1TB); itu terlalu banyak memori. Jadi, peta memori beralamat 44-bit dan 48-bit untuk CPU ARM masing-masing sebesar 16 TB dan 256 TB, hanyalah proposal untuk kebutuhan komputer di masa depan. Faktanya, proposal untuk CPU ARM ini mengikuti pembagian memori yang sama berdasarkan rasio seperti peta memori sebelumnya. Yaitu: 50% DRAM dengan lubang opsional di dalamnya, 25% ruang I/O yang dipetakan dan ruang cadangan, dan sisa 25% ruang untuk peta memori sebelumnya.

Peta memori beralamat 52-bit, 56-bit, 60-bit dan 64-bit masih diusulkan untuk ARM 64 bit di masa depan. Jika para ilmuwan pada saat itu masih menganggap pembagian 50 : 25 : 25 dari seluruh ruang memori berguna, mereka akan mempertahankan rasio tersebut.

Catatan : SoC adalah singkatan dari System-on-Chip yang mengacu pada sirkuit dalam chip µP yang seharusnya tidak ada di sana.

SRAM atau Static Random Access Memory lebih cepat dibandingkan DRAM tradisional, namun membutuhkan lebih banyak area silikon. SRAM tidak memerlukan penyegaran. Pembaca dapat membayangkan RAM sebagai SRAM.

6.43 Mode Pengalamatan Bahasa Majelis untuk ARM 64
ARM adalah arsitektur pemuatan/penyimpanan yang mengharuskan data dimuat dari memori ke register prosesor sebelum pemrosesan apa pun seperti Operasi Logika Aritmatika dapat dilakukan dengannya. Instruksi selanjutnya menyimpan hasilnya kembali ke memori. Meskipun ini mungkin tampak seperti langkah mundur dari arsitektur x86 dan x64 berikutnya, yang beroperasi secara langsung pada operan di memori dalam satu instruksi, dalam praktiknya, pendekatan muat/penyimpanan memungkinkan beberapa operasi berurutan dilakukan dengan kecepatan tinggi pada sebuah operan setelah dimuat ke salah satu dari banyak register prosesor.

Format bahasa assembly ARM mempunyai persamaan dan perbedaan dengan seri x64 (x86).

  • Mengimbangi : Konstanta bertanda dapat ditambahkan ke register dasar. Offset diketik sebagai bagian dari instruksi. Misalnya: ldr x0, [rx, #10] memuat r0 dengan kata di alamat r1+10.
  • Daftar : Kenaikan tak bertanda tangan yang disimpan dalam register dapat ditambahkan atau dikurangi dari nilai dalam register dasar. Misalnya: ldr r0, [x1, x2] memuat r0 dengan kata di alamat x1+x2. Salah satu register dapat dianggap sebagai register dasar.
  • Daftar berskala : Kenaikan suatu register digeser ke kiri atau ke kanan sebanyak jumlah posisi bit tertentu sebelum ditambahkan atau dikurangi dari nilai register dasar. Misalnya: ldr x0, [x1, x2, lsl #3] memuat r0 dengan kata di alamat r1+(r2×8). Pergeseran tersebut dapat berupa pergeseran logis ke kiri atau ke kanan (lsl atau lsr) yang menyisipkan bit nol pada posisi bit yang dikosongkan, atau pergeseran ke kanan aritmatika (asr) yang mereplikasi bit tanda pada posisi bit yang dikosongkan.

Ketika dua operan terlibat, tujuan muncul sebelum (di sebelah kiri) sumber (ada beberapa pengecualian untuk ini). Opcode untuk bahasa rakitan ARM tidak peka huruf besar-kecil.

Mode Pengalamatan ARM64 Segera
Contoh:

pindah r0, #0xFF000000 ; Muat nilai 32-bit FF000000h ke r0

Nilai desimal tanpa 0x namun tetap diawali dengan #.

Daftar Langsung
Contoh:

bergerak x0, x1; Salin x1 ke x0

Daftar Tidak Langsung
Contoh:

str x0, [x3] ; Simpan x0 ke alamat di x3

Daftarkan Tidak Langsung dengan Offset
Contoh:

ldr x0, [x1, #32] ; Load r0 dengan nilai pada alamat [r1+32]; r1 adalah register dasar
str x0, [x1, #4] ; Simpan r0 ke alamat [r1+4]; r1 adalah register dasar; bilangan adalah basis 10

Daftarkan Tidak Langsung dengan Offset (Pra-bertambah)
Contoh:

ldr x0, [x1, #32]! ; Muat r0 dengan [r1+32] dan perbarui r1 ke (r1+32)
str x0, [x1, #4]! ; Simpan r0 ke [r1+4] dan perbarui r1 ke (r1+4)

Perhatikan penggunaan tanda “!” simbol.

Daftarkan Tidak Langsung dengan Offset (Pasca-peningkatan)
Contoh:

ldr x0, [x1], #32 ; Muat [x1] ke x0, lalu perbarui x1 ke (x1+32)
str x0, [x1], #4 ; Simpan x0 ke [x1], lalu perbarui x1 ke (x1+4)

Daftar Ganda Tidak Langsung
Alamat operan adalah jumlah dari register dasar dan register kenaikan. Nama register dikelilingi oleh tanda kurung siku.
Contoh:

ldr x0, [x1, x2] ; Muat x0 dengan [x1+x2]
str x0, [rx, x2] ; Simpan x0 ke [x1+x2]

Mode Pengalamatan Relatif
Dalam mode pengalamatan relatif, instruksi yang efektif adalah instruksi berikutnya dalam Program Counter, ditambah indeks. Indeksnya bisa positif atau negatif.
Contoh:

ldr x0, [pc, #24]

Artinya memuat register X0 dengan kata yang ditunjuk oleh konten PC ditambah 24.

6.44 Beberapa Petunjuk Umum Digunakan untuk ARM 64
Berikut adalah instruksi yang umum digunakan:

6.45 Perulangan

Ilustrasi
Kode berikut terus menambahkan nilai di register X10 ke nilai di X9 hingga nilai di X8 adalah nol. Asumsikan bahwa semua nilai adalah bilangan bulat. Nilai di X8 dikurangi 1 di setiap iterasi:

lingkaran:
CBZ X8, lewati
TAMBAHKAN X9, X9, X10; X9 pertama adalah tujuan dan X9 kedua adalah sumber
SUB X8, X8, #1 ; X8 pertama adalah tujuan dan X8 kedua adalah sumber
lingkaran B
melewati:

Seperti pada 6502 µP dan X64 µP, label pada ARM 64 µP dimulai di awal baris. Instruksi selanjutnya dimulai pada beberapa spasi setelah awal baris. Dengan x64 dan ARM 64, label diikuti dengan titik dua dan baris baru. Sedangkan pada 6502, labelnya diikuti instruksi setelah spasi. Pada kode sebelumnya, instruksi pertama yaitu “CBZ X8, lewati” artinya jika nilai di X8 nol, lanjutkan pada label “lewati:”, lewati instruksi di antaranya dan lanjutkan dengan instruksi selanjutnya di bawah 'melewati:'. “B loop” adalah lompatan tanpa syarat ke label “loop”. Nama label lainnya dapat digunakan sebagai pengganti “loop”.

Jadi, seperti pada 6502 µP, gunakan instruksi cabang untuk membuat loop dengan ARM 64.

6.46 masukan/keluaran lengan 64
Semua periferal ARM (port internal) dipetakan memori. Ini berarti bahwa antarmuka pemrograman adalah sekumpulan register yang dialamatkan memori (port internal). Alamat register tersebut merupakan offset dari alamat basis memori tertentu. Ini mirip dengan bagaimana 6502 melakukan input/output. ARM tidak memiliki opsi untuk ruang alamat I/O terpisah.

6.47 Tumpukan ARM 64
ARM 64 memiliki tumpukan memori (RAM) dengan cara yang sama seperti yang dimiliki 6502 dan x64. Namun, dengan ARM64, tidak ada opcode push atau pop. Tumpukan di ARM 64 juga bertambah ke bawah. Alamat dalam penunjuk tumpukan menunjuk tepat setelah byte terakhir dari nilai terakhir yang ditempatkan dalam tumpukan.

Alasan mengapa tidak ada opcode pop atau push umum untuk ARM64 adalah karena ARM 64 mengelola tumpukannya dalam kelompok 16 byte berturut-turut. Namun, nilai-nilai tersebut ada dalam kelompok byte satu byte, dua byte, empat byte, dan 8 byte. Jadi, satu nilai dapat ditempatkan ke dalam tumpukan, dan tempat lainnya (lokasi byte) yang berjumlah 16 byte diisi dengan byte tiruan. Kerugiannya adalah membuang-buang memori. Solusi yang lebih baik adalah mengisi lokasi 16-byte dengan nilai yang lebih kecil dan meminta beberapa programmer menulis kode yang melacak dari mana nilai-nilai di lokasi 16-byte berasal (register). Kode tambahan ini juga diperlukan untuk menarik kembali nilainya. Alternatif untuk ini adalah dengan mengisi dua register tujuan umum 8-byte dengan nilai yang berbeda, dan kemudian mengirimkan isi dari dua register 8-byte ke tumpukan. Kode tambahan masih diperlukan di sini untuk melacak nilai kecil tertentu yang masuk ke tumpukan dan keluar dari tumpukan.

Kode berikut menyimpan empat data 4-byte ke dalam tumpukan:

str w0, [sp, #-4]!
str w1, [sp, #-8]!
str w2, [sp, #-12]!
str w3, [sp, #-16]!

Empat byte pertama (w) register – x0, x1, x2, dan x3 – dikirim ke lokasi byte 16 berturut-turut di tumpukan. Perhatikan penggunaan “str” dan bukan “push”. Perhatikan simbol seru di akhir setiap instruksi. Karena tumpukan memori bertambah ke bawah, nilai empat byte pertama dimulai pada posisi minus empat byte di bawah posisi penunjuk tumpukan sebelumnya. Nilai empat byte lainnya mengikuti, turun. Segmen kode berikut akan melakukan hal yang benar (dan berurutan) yang setara dengan memunculkan empat byte:

ldr w3, [sp], #0
ldr w2, [sp], #4
ldr w1, [sp], #8
ldr w0, [sp], #12

Perhatikan penggunaan opcode ldr alih-alih pop. Perhatikan juga bahwa simbol seru tidak digunakan di sini.

Semua byte dalam X0 (8 byte) dan X1 (8 byte) dapat dikirim ke lokasi 16 byte di tumpukan sebagai berikut:

stp x0, x1, [sp, #-16]! ; 8 + 8 = 16

Dalam hal ini, register x2 (w2) dan x3 (w3) tidak diperlukan. Semua byte yang diinginkan ada di register X0 dan X2. Catat opcode stp untuk menyimpan pasangan isi register ke dalam RAM. Perhatikan juga simbol serunya. Setara popnya adalah:

ldp x0, x1, [sp], #0

Tidak ada tanda seru untuk instruksi ini. Perhatikan opcode LDP dan bukan LDR untuk memuat dua lokasi data berturut-turut dari memori ke dua register µP. Ingat juga bahwa menyalin dari memori ke register µP adalah memuat, jangan bingung dengan memuat file dari disk ke RAM, dan menyalin dari register µP ke RAM adalah menyimpan.

6.48 Subrutin
Subrutin adalah blok kode yang melakukan tugas, secara opsional didasarkan pada beberapa argumen dan secara opsional mengembalikan hasil. Berdasarkan konvensi, register R0 hingga R3 (empat register) digunakan untuk meneruskan argumen (parameter) ke subrutin, dan R0 digunakan untuk meneruskan hasil kembali ke pemanggil. Subrutin yang membutuhkan lebih dari 4 masukan menggunakan tumpukan untuk masukan tambahan. Untuk memanggil subrutin, gunakan tautan atau instruksi cabang bersyarat. Sintaks untuk instruksi tautan adalah:

label BL

Dimana BL adalah opcode dan label mewakili awal (alamat) dari subrutin. Cabang ini tanpa syarat, maju atau mundur dalam 128MB. Sintaks untuk instruksi cabang bersyarat adalah:

B. label kedua

Dimana cond adalah kondisinya, misalnya eq (sama) atau ne (tidak sama). Program berikut memiliki subrutin doadd yang menambahkan nilai dari dua argumen dan mengembalikan hasilnya dalam R0:

Subrutin AREA, KODE, READONLY; Beri nama blok kode ini
PINTU MASUK ; Tandai instruksi pertama yang akan dieksekusi
mulai MOV r0, #10 ; Siapkan parameter
MOV r1, #3
BL tambahkan; Panggil subrutin
hentikan MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationKeluar
SVC #0x123456 ; Semihosting ARM (sebelumnya SWI)
doadd TAMBAHKAN r0, r0, r1 ; Kode subrutin
BX lr; Kembali dari subrutin
;
AKHIR ; Tandai akhir file

Angka yang akan dijumlahkan adalah desimal 10 dan desimal 3. Dua baris pertama pada blok kode (program) ini akan dijelaskan nanti. Tiga baris berikutnya mengirimkan register 10 ke R0 dan register 3 ke R1, dan juga memanggil subrutin doadd. “Doadd” adalah label yang menyimpan alamat awal subrutin.

Subrutin hanya terdiri dari dua baris. Baris pertama menambahkan konten 3 dari R ke konten 10 dari R0 yang memungkinkan hasil 13 di R0. Baris kedua dengan opcode BX dan operan LR kembali dari subrutin ke kode pemanggil.

BENAR
Opcode RET di ARM 64 masih menangani subrutin, tetapi beroperasi secara berbeda dengan RTS di 6502 atau RET di x64, atau kombinasi “BX LR” di ARM 64. Di ARM 64, sintaksis untuk RET adalah:

LURUS {Xn}

Instruksi ini memberikan kesempatan bagi program untuk melanjutkan dengan subrutin yang bukan subrutin pemanggil, atau hanya melanjutkan dengan beberapa instruksi lain dan segmen kode berikutnya. Xn adalah register tujuan umum yang menyimpan alamat tujuan kelanjutan program. Instruksi ini bercabang tanpa syarat. Defaultnya adalah konten X30 jika Xn tidak diberikan.

Standar Prosedur Panggilan
Jika pemrogram ingin kodenya berinteraksi dengan kode yang ditulis oleh orang lain atau dengan kode yang dihasilkan oleh kompiler, pemrogram perlu menyetujui orang atau penulis kompiler mengenai aturan penggunaan register. Untuk arsitektur ARM, aturan ini disebut Procedure Call Standard atau PCS. Ini adalah kesepakatan antara dua atau tiga pihak. PCS menetapkan hal berikut:

  • Register µP mana yang digunakan untuk meneruskan argumen ke dalam fungsi (subrutin)
  • Register µP mana yang digunakan untuk mengembalikan hasil ke fungsi yang melakukan pemanggilan yang disebut pemanggil
  • µP mana yang mendaftarkan fungsi yang dipanggil, yang dikenal sebagai callee, dapat rusak
  • µP mana yang didaftarkan oleh callee tidak dapat rusak

6.49 Interupsi
Ada dua jenis rangkaian pengontrol interupsi yang tersedia untuk prosesor ARM:

  • Pengontrol Interupsi Standar: Penangan interupsi menentukan perangkat mana yang memerlukan servis dengan membaca register bitmap perangkat di pengontrol interupsi.
  • Vector Interrupt Controller (VIC): Memprioritaskan interupsi dan menyederhanakan penentuan perangkat mana yang menyebabkan interupsi. Setelah mengaitkan prioritas dan alamat pengendali dengan setiap interupsi, VIC hanya memberikan sinyal interupsi ke prosesor jika prioritas interupsi baru lebih tinggi daripada pengendali interupsi yang sedang dijalankan.

Catatan : Pengecualian mengacu pada kesalahan. Detail pengontrol interupsi vektor untuk komputer ARM 32-bit adalah sebagai berikut (64 bit serupa):

Tabel 6.49.1
Pengecualian/Interupsi Vektor ARM untuk Komputer 32-Bit
Pengecualian/Interupsi Tangan Pendek Alamat Alamat Tinggi
Mengatur ulang MENGATUR ULANG 0x00000000 0xffff0000
Instruksi tidak terdefinisi UNDEF 0x00000004 0xffff0004
Interupsi Perangkat Lunak SWI 0x00000008 0xffff0008
Pengambilan awal dibatalkan pabt 0x0000000C 0xffff000C
Tanggal aborsi DABT 0x00000010 0xffff0010
Disimpan 0x00000014 0xffff0014
Permintaan Interupsi IRQ 0x00000018 0xffff0018
Permintaan Interupsi Cepat FIQ 0x0000001C 0xffff001C

Ini terlihat seperti susunan arsitektur 6502 dimana NMI , Br , Dan IRQ dapat memiliki petunjuk di halaman nol, dan rutinitas terkait berada di memori tinggi (ROM OS). Penjelasan singkat baris-baris tabel sebelumnya adalah sebagai berikut:

MENGATUR ULANG
Ini terjadi ketika prosesor menyala. Ini menginisialisasi sistem dan mengatur tumpukan untuk mode prosesor yang berbeda. Ini adalah pengecualian dengan prioritas tertinggi. Saat masuk ke pengendali reset, CPSR berada dalam mode SVC dan bit IRQ dan FIQ diatur ke 1, menutupi setiap interupsi.

TANGGAL Aborsi
Prioritas tertinggi kedua. Hal ini terjadi ketika kita mencoba membaca/menulis ke alamat yang tidak valid atau mengakses izin akses yang salah. Saat masuk ke Data Abort Handler, IRQ akan dinonaktifkan (I-bit set 1) dan FIQ akan diaktifkan. IRQ ditutupi, namun FIQ tetap terbuka kedoknya.

FIQ
Interupsi prioritas tertinggi, IRQ & FIQ, dinonaktifkan hingga FIQ ditangani.

IRQ
Interupsi prioritas tinggi, pengendali IRQ, dimasukkan hanya jika tidak ada FIQ & pembatalan data yang sedang berlangsung.

Pembatalan Pra-Pengambilan
Ini mirip dengan pembatalan data tetapi terjadi pada kegagalan pengambilan alamat. Saat masuk ke handler, IRQ dinonaktifkan namun FIQ tetap aktif dan dapat terjadi selama pembatalan pra-pengambilan.

SWI
Pengecualian Interupsi Perangkat Lunak (SWI) terjadi ketika instruksi SWI dijalankan dan tidak ada pengecualian dengan prioritas lebih tinggi yang ditandai.

Instruksi Tidak Terdefinisi
Pengecualian Instruksi Tidak Terdefinisi terjadi ketika instruksi yang tidak ada dalam set instruksi ARM atau Thumb mencapai tahap eksekusi alur dan tidak ada pengecualian lain yang ditandai. Hal ini merupakan prioritas yang sama dengan SWI karena hal ini dapat terjadi pada satu waktu. Artinya, instruksi yang sedang dieksekusi tidak bisa sekaligus menjadi instruksi SWI dan instruksi tidak terdefinisi.

Penanganan Pengecualian ARM
Peristiwa berikut ini terjadi ketika pengecualian terjadi:

  • Simpan CPSR ke SPSR mode pengecualian.
  • PC disimpan dalam LR mode pengecualian.
  • Register tautan diatur ke alamat tertentu berdasarkan instruksi saat ini. Misalnya: untuk ISR, LR = instruksi yang terakhir dieksekusi + 8.
  • Perbarui CPSR tentang pengecualian.
  • Atur PC ke alamat pengendali pengecualian.

6.5 Instruksi dan Data

Data mengacu pada variabel (label dengan nilainya) dan array serta struktur lain yang mirip dengan array. String itu seperti array karakter. Array bilangan bulat terlihat di salah satu bab sebelumnya. Instruksi mengacu pada opcode dan operannya. Suatu program dapat ditulis dengan opcode dan data dicampur dalam satu bagian memori yang berkelanjutan. Pendekatan tersebut memiliki kelemahan namun tidak direkomendasikan.

Sebuah program harus ditulis dengan instruksi terlebih dahulu, diikuti dengan data (jamak dari datum adalah data). Jarak antara instruksi dan data hanya beberapa byte saja. Untuk suatu program, instruksi dan datanya dapat berada dalam satu atau dua bagian terpisah di memori.

6.6 Arsitektur Harvard

Salah satu komputer awal disebut Harvard Mark I (1944). Arsitektur Harvard yang ketat menggunakan satu ruang alamat untuk instruksi program dan ruang alamat terpisah yang berbeda untuk data. Artinya ada dua kenangan yang terpisah. Berikut ini tampilan arsitekturnya:


Gambar 6.71 Arsitektur Harvard

Unit Kontrol melakukan decoding instruksi. Unit Logika Aritmatika (ALU) melakukan operasi aritmatika dengan logika kombinasional (gerbang). ALU juga melakukan operasi logis (misalnya pergeseran).

Dengan mikroprosesor 6502, instruksi masuk ke mikroprosesor terlebih dahulu (unit kontrol) sebelum datum (tunggal untuk data) masuk ke register µP sebelum berinteraksi. Ini membutuhkan setidaknya dua pulsa clock dan ini bukan akses simultan ke instruksi dan datum. Di sisi lain, arsitektur Harvard menyediakan akses simultan ke instruksi dan data, dengan instruksi dan datum memasukkan µP pada saat yang sama (opcode ke unit kontrol dan datum ke register µP), menghemat setidaknya satu pulsa clock. Ini adalah bentuk paralelisme. Bentuk paralelisme ini digunakan pada cache perangkat keras pada motherboard modern (lihat pembahasan berikut).

6.7 Memori Tembolok

Memori Cache (RAM) adalah wilayah memori berkecepatan tinggi (dibandingkan dengan kecepatan memori utama) yang menyimpan sementara instruksi program atau data untuk digunakan di masa mendatang. Memori cache beroperasi lebih cepat dibandingkan memori utama. Biasanya, instruksi atau item data ini diambil dari memori utama terkini dan kemungkinan besar akan diperlukan lagi dalam waktu dekat. Tujuan utama dari memori cache adalah untuk meningkatkan kecepatan pengaksesan berulang kali pada lokasi memori utama yang sama. Agar efektif, mengakses item yang di-cache harus jauh lebih cepat dibandingkan mengakses sumber asli instruksi atau data yang disebut sebagai Backing Store.

Saat caching digunakan, setiap upaya untuk mengakses lokasi memori utama dimulai dengan pencarian cache. Jika item yang diminta ada, prosesor segera mengambil dan menggunakannya. Ini disebut Serangan Cache. Jika pencarian cache tidak berhasil (cache hilang), instruksi atau item data harus diambil dari penyimpanan cadangan (memori utama). Dalam proses mengambil item yang diminta, salinannya ditambahkan ke cache untuk antisipasi penggunaan di masa mendatang.

Unit Manajemen Memori
Memory Management Unit (MMU) adalah sirkuit yang mengelola memori utama dan register memori terkait pada motherboard. Di masa lalu, ini adalah sirkuit terintegrasi terpisah pada motherboard; tetapi saat ini, ini biasanya merupakan bagian dari mikroprosesor. MMU juga harus mengelola cache (sirkuit) yang juga merupakan bagian dari mikroprosesor saat ini. Sirkuit cache adalah sirkuit terpadu yang terpisah di masa lalu.

RAM statis
RAM Statis (SRAM) memiliki waktu akses yang jauh lebih cepat dibandingkan DRAM, meskipun mengorbankan sirkuit yang jauh lebih kompleks. Sel bit SRAM memakan lebih banyak ruang pada die sirkuit terintegrasi dibandingkan sel perangkat DRAM yang mampu menyimpan jumlah data yang setara. Memori utama (RAM) biasanya terdiri dari DRAM (Dynamic RAM).

Memori cache meningkatkan kinerja komputer karena banyak algoritma yang dijalankan oleh sistem operasi dan aplikasi menunjukkan lokalitas referensi. Lokalitas Referensi mengacu pada penggunaan kembali data yang telah diakses baru-baru ini. Ini disebut sebagai Lokalitas Temporal. Pada motherboard modern, memori cache berada dalam sirkuit terintegrasi yang sama dengan mikroprosesor. Memori utama (DRAM) jauh dan dapat diakses melalui bus. Lokalitas Referensi juga mengacu pada lokalitas spasial. Lokalitas spasial berkaitan dengan kecepatan akses data yang lebih tinggi karena kedekatan fisik.

Biasanya, wilayah memori cache berukuran kecil (dalam jumlah lokasi byte) dibandingkan dengan penyimpanan cadangan (memori utama). Perangkat memori cache dirancang untuk kecepatan maksimum yang secara umum berarti perangkat tersebut lebih kompleks dan mahal per bitnya dibandingkan teknologi penyimpanan data yang digunakan di backing store. Karena ukurannya yang terbatas, perangkat memori cache cenderung cepat terisi. Jika cache tidak memiliki lokasi yang tersedia untuk menyimpan entri baru, entri lama harus dibuang. Pengontrol cache menggunakan Kebijakan Penggantian Cache untuk memilih entri cache mana yang akan ditimpa oleh entri baru.

Tujuan dari memori cache mikroprosesor adalah untuk memaksimalkan persentase cache hits dari waktu ke waktu, sehingga memberikan tingkat eksekusi instruksi tertinggi yang berkelanjutan. Untuk mencapai tujuan ini, logika caching harus menentukan instruksi dan data mana yang akan ditempatkan ke dalam cache dan disimpan untuk digunakan dalam waktu dekat.

Logika caching prosesor tidak memiliki jaminan bahwa item data yang di-cache akan digunakan lagi setelah dimasukkan ke dalam cache.

Logika caching bergantung pada kemungkinan bahwa karena lokalitas temporal (berulang dari waktu ke waktu) dan spasial (ruang), ada kemungkinan besar bahwa data yang di-cache akan diakses dalam waktu dekat. Dalam implementasi praktis pada prosesor modern, cache hits biasanya terjadi pada 95 hingga 97 persen akses memori. Karena latensi memori cache adalah sebagian kecil dari latensi DRAM, tingkat pencapaian cache yang tinggi menghasilkan peningkatan kinerja yang substansial dibandingkan dengan desain bebas cache.

Beberapa Paralelisme dengan Cache
Seperti disebutkan sebelumnya, program yang baik di memori memiliki instruksi yang terpisah dari data. Dalam beberapa sistem cache, terdapat sirkuit cache di “kiri” prosesor dan terdapat sirkuit cache lain di “kanan” prosesor. Cache kiri menangani instruksi suatu program (atau aplikasi) dan cache kanan menangani data dari program yang sama (atau aplikasi yang sama). Hal ini menyebabkan peningkatan kecepatan yang lebih baik.

6.8 Proses dan Thread

Baik komputer CISC dan RISC memiliki proses. Suatu proses ada pada perangkat lunak. Suatu program yang sedang dijalankan (eksekusi) merupakan suatu proses. Sistem operasi dilengkapi dengan programnya sendiri. Saat komputer beroperasi, program sistem operasi yang memungkinkan komputer bekerja juga berjalan. Ini adalah proses sistem operasi. Pengguna atau pemrogram dapat menulis programnya sendiri. Ketika program pengguna berjalan, itu adalah sebuah proses. Tidak masalah apakah program tersebut ditulis dalam bahasa assembly atau dalam bahasa tingkat tinggi seperti C atau C++. Semua proses (pengguna atau OS) dikelola oleh proses lain yang disebut “penjadwal”.

Thread seperti sub-proses milik suatu proses. Suatu proses dapat dimulai dan dipecah menjadi beberapa thread dan kemudian masih berlanjut sebagai satu proses. Sebuah proses tanpa thread dapat dianggap sebagai thread utama. Proses dan threadnya dikelola oleh penjadwal yang sama. Penjadwal itu sendiri adalah sebuah program yang berada di disk OS. Saat berjalan di memori, penjadwal adalah sebuah proses.

6.9 Multiproses

Utas dikelola hampir seperti proses. Multiprosesing berarti menjalankan lebih dari satu proses secara bersamaan. Ada komputer dengan hanya satu mikroprosesor. Ada komputer dengan lebih dari satu mikroprosesor. Dengan mikroprosesor tunggal, proses dan/atau thread menggunakan mikroprosesor yang sama dengan cara interleaving (atau pemotongan waktu). Artinya suatu proses menggunakan prosesor dan berhenti tanpa penyelesaian. Proses atau thread lain menggunakan prosesor dan berhenti tanpa penyelesaian. Kemudian, proses atau thread lain menggunakan mikroprosesor dan berhenti tanpa penyelesaian. Hal ini berlanjut hingga semua proses dan thread yang diantrekan oleh penjadwal telah mendapat bagian dari prosesor. Ini disebut sebagai multiprosesor bersamaan.

Ketika terdapat lebih dari satu mikroprosesor, terdapat multiprosesor paralel, bukan konkurensi. Dalam hal ini, setiap prosesor menjalankan proses atau thread tertentu, berbeda dengan yang dijalankan prosesor lainnya. Semua prosesor pada motherboard yang sama menjalankan proses yang berbeda dan/atau thread yang berbeda secara bersamaan dalam multiprosesor paralel. Proses dan thread dalam multiprosesing paralel masih dikelola oleh penjadwal. Multiprosesor paralel lebih cepat dibandingkan multiprosesor bersamaan.

Pada titik ini, pembaca mungkin bertanya-tanya bagaimana pemrosesan paralel lebih cepat daripada pemrosesan bersamaan. Hal ini karena prosesor berbagi (harus menggunakan pada waktu yang berbeda) memori dan port input/output yang sama. Nah, dengan penggunaan cache, pengoperasian motherboard secara keseluruhan menjadi lebih cepat.

6.10 Halaman

Memory Management Unit (MMU) adalah suatu rangkaian yang dekat dengan mikroprosesor atau di dalam chip mikroprosesor. Ini menangani peta memori atau paging dan masalah memori lainnya. Baik komputer 6502 µP maupun Commodore-64 tidak memiliki MMU sendiri (meskipun masih ada beberapa manajemen memori di Commodore-64). Commodore-64 menangani memori dengan membuat halaman di mana setiap halaman berjumlah 256 10 panjang byte (100 16 panjangnya byte). Tidak wajib untuk menangani memori dengan paging. Ia masih bisa memiliki peta memori dan kemudian program-program yang sesuai dengan area yang berbeda-beda. Nah, paging merupakan salah satu cara untuk memberikan efisiensi penggunaan memori tanpa harus memiliki banyak bagian memori yang tidak dapat menampung suatu data atau program.

Arsitektur komputer x86 386 dirilis pada tahun 1985. Bus alamat lebarnya 32-bit. Jadi totalnya ada 2 32 = 4,294,967,296 ruang alamat dimungkinkan. Ruang alamat ini dibagi menjadi 1.048.576 halaman = 1.024 KB halaman. Dengan jumlah halaman tersebut, maka satu halaman terdiri dari 4.096 byte = 4 KB. Tabel berikut menunjukkan halaman alamat fisik untuk arsitektur x86 32-bit:

Tabel 6.10.1
Halaman Beralamat Fisik untuk Arsitektur x86
Alamat Basis 16 Halaman Alamat Basis 10
FFFFF000 – FFFFFFFF Halaman 1.048.575 4.294.963.200 – 4.294.967.295
FFFFE000 – FFFFEFFF Halaman 1.044.479 4.294.959.104 – 4.294.963.199
FFFFD000 – FFFFDFFF Halaman 1.040.383 4.294.955.008 – 4.294.959.103
|
|
|
|
|
|
|
|
|
00002000 – 00002FFF Halaman 2 8.192 – 12.288
00001000 – 00001FFF Halaman 1 4.096 – 8.191
00000000 – 00000FFF Halaman 0 0 – 4,095

Suatu aplikasi saat ini terdiri dari lebih dari satu program. Satu program dapat memakan waktu kurang dari satu halaman (kurang dari 4096) atau dapat memakan waktu dua halaman atau lebih. Jadi, suatu aplikasi dapat mengambil satu halaman atau lebih yang masing-masing halamannya berukuran 4096 byte. Orang yang berbeda dapat menulis sebuah lamaran, dan setiap orang ditugaskan pada satu halaman atau lebih.

Perhatikan bahwa halaman 0 adalah dari 00000000H hingga 00000FFF
halaman 1 dari 00001000H hingga 00001FFFH, halaman 2 dari 00002000 H – 00002FFF H , dan seterusnya. Untuk komputer 32-bit, ada dua register 32-bit di prosesor untuk pengalamatan halaman fisik: satu untuk alamat dasar dan yang lainnya untuk alamat indeks. Untuk mengakses lokasi byte pada halaman 2, misalnya, register untuk alamat dasar harus 00002 H yang merupakan 20 bit pertama (dari kiri) untuk alamat awal halaman 2. Bit sisanya berada pada kisaran 000 H ke FFF H berada dalam register yang disebut “register indeks”. Jadi, semua byte di halaman dapat diakses hanya dengan menambah konten di register indeks dari 000 H ke FFF H . Konten dalam register indeks ditambahkan ke konten yang tidak berubah dalam register dasar untuk mendapatkan alamat efektif. Skema pengalamatan indeks ini juga berlaku untuk halaman lainnya.

Namun, ini bukanlah cara program bahasa assembly ditulis untuk setiap halaman. Untuk setiap halaman, pemrogram menulis kode mulai dari halaman 000 H ke halaman FFF H . Karena kode di halaman berbeda terhubung, kompiler menggunakan pengalamatan indeks untuk menghubungkan semua alamat terkait di halaman berbeda. Misalnya, dengan asumsi halaman 0, halaman 1, dan halaman 2 adalah untuk satu aplikasi dan masing-masing memiliki 555 H alamat yang terhubung satu sama lain, kompiler mengkompilasi sedemikian rupa sehingga ketika 555 H halaman 0 harus diakses, 00000 H akan berada di register dasar dan 555 H akan berada di register indeks. Ketika 555 H dari halaman 1 untuk diakses, 00001 H akan berada di register dasar dan 555 H akan berada di register indeks. Ketika 555 H dari halaman 2 untuk diakses, 00002 H akan berada di register dasar dan 555H akan berada di register indeks. Hal ini dimungkinkan karena alamat dapat diidentifikasi menggunakan label (variabel). Pemrogram yang berbeda harus menyetujui nama label yang akan digunakan untuk alamat penghubung yang berbeda.

Memori Virtual Halaman
Paging, seperti dijelaskan sebelumnya, dapat dimodifikasi untuk meningkatkan ukuran memori dalam teknik yang disebut sebagai “Page Virtual Memory”. Dengan asumsi bahwa semua halaman memori fisik, seperti dijelaskan sebelumnya, memiliki sesuatu (instruksi dan data), tidak semua halaman sedang aktif. Halaman yang saat ini tidak aktif dikirim ke hard disk dan digantikan oleh halaman dari hard disk yang perlu dijalankan. Dengan cara itu, ukuran memori bertambah. Saat komputer terus beroperasi, halaman yang tidak aktif tertukar dengan halaman di hard disk yang mungkin masih merupakan halaman yang dikirim dari memori ke disk. Semua ini dilakukan oleh Memory Management Unit (MMU).

6.11 Masalah

Pembaca disarankan untuk menyelesaikan semua permasalahan dalam satu bab sebelum melanjutkan ke bab berikutnya.

1) Sebutkan persamaan dan perbedaan arsitektur komputer CISC dan RISC. Sebutkan satu contoh masing-masing komputer SISC dan RISC.

2) a) Apa nama berikut untuk komputer CISC dalam hal bit: byte, word, doubleword, quadword, dan double quadword.
b) Apa nama berikut untuk komputer RISC dalam hal bit: byte, halfword, word, dan doubleword.
c) Ya atau Tidak. Apakah doubleword dan quadword memiliki arti yang sama pada arsitektur CISC dan RISC?

3 a) Untuk x64, jumlah byte untuk instruksi bahasa rakitan berkisar dari berapa hingga berapa?
b) Apakah jumlah byte untuk semua instruksi bahasa rakitan untuk ARM 64 tetap? Jika ya, berapa jumlah byte untuk semua instruksi?

4) Sebutkan instruksi bahasa assembly yang paling umum digunakan untuk x64 dan artinya.

5) Sebutkan instruksi bahasa rakitan yang paling umum digunakan untuk ARM 64 dan artinya.

6) Gambarlah diagram blok berlabel komputer lama Arsitektur Harvard. Jelaskan bagaimana instruksi dan fitur datanya digunakan dalam cache komputer modern.

7) Bedakan antara proses dan thread dan berikan nama proses yang menangani proses dan thread di sebagian besar sistem komputer.

8) Jelaskan secara singkat apa itu multiprosesor.

9) a) Jelaskan paging yang dapat diterapkan pada arsitektur komputer x86 386 µP.
b) Bagaimana paging ini dapat dimodifikasi untuk meningkatkan ukuran seluruh memori?