Anda di halaman 1dari 15

Tutorial 2:

Pengenalan CPU-OS SIMULATOR


(LANJUTAN)
A. Pendahuluan
Tujuan
Pada akhir latihan terbimbing ini, mahasiswa diharapkan mampu:
✓ Menggunakan mode pengalamatan langsung dan tidak langsung untuk
mengakses data dalam memori
✓ Membuat instruksi iterative loop
✓ Menampilkan teks di konsol menggunakan instruksi IO
✓ Membuat sub-routine, sub-routine call, dan return dari sub-routine
✓ Meneruskan parameter ke subrutin

B. Simulator Prosesor (CPU)


Tutorial arsitektur komputer didukung oleh simulator, yang dibuat untuk mendukung
konsep teoritis yang biasanya dibahas selama perkuliahan. Simulator menyediakan
representasi visual dan animasi dari mekanisme yang terlibat dan memungkinkan
mahasiswa untuk mengamati cara kerja sistem yang tersembunyi, yang akan sulit
atau tidak mungkin untuk dilakukan sebaliknya. Keuntungan tambahan
menggunakan simulator adalah memungkinkan mahasiswa untuk bereksperimen
dan mengeksplorasi berbagai aspek teknologi sistem tanpa harus menginstal dan
mengkonfigurasi sistem yang sebenarnya.

C. Dasar Teori
Model pemrograman arsitektur komputer mendefinisikan komponen
arsitektur low level tersebut, yang meliputi berikut ini:
➢ Set instruksi CPU
➢ Register CPU
➢ Berbagai cara menangani instruksi dan data dalam instruksi

Ini juga mendefinisikan interaksi antara komponen di atas. Model pemrograman


tingkat rendah inilah yang memungkinkan penghitungan terprogram.

D. Detail Simulator
Bagian ini mencakup beberapa informasi dasar tentang simulator, yang
memungkinkan mahasiswa untuk menggunakan simulator tersebut. Simulator untuk
lab ini adalah aplikasi yang berjalan di PC yang menjalankan sistem operasi MS
Windows.

1
Jendela simulator utama terdiri dari beberapa tampilan, yang mewakili bagian
fungsional berbeda dari prosesor yang disimulasikan. Ini ditunjukkan pada Gambar 1
di bawah dan terdiri dari:
CPU Instruction memory
Special CPU registers
CPU (general purpose) registers
Program stack
Program creation and running features
Memory in which data is stored
Input, output console

CPU Instruction Special CPU CPU registers


memory view registers view view
Add program

instructions tab Program list view Program stack view

Click to view program Click to view


Create program tab
data memory IO console

Gambar 1 – CPU Simulator window

2
1. CPU instruction memory view
Gambar 2 ‐ Instruction
memory view

Tampilan ini berisi instruksi


program. Instruksi ditampilkan
sebagai urutan mnemonik
instruksi level rendah (format
level assembler) dan bukan
sebagai kode biner. Ini dilakukan
untuk kejelasan dan membuat
kode lebih mudah dibaca oleh
manusia.

Setiap instruksi dikaitkan dengan


dua alamat: alamat fisik (PAdd)
dan alamat logis (LAdd).
Tampilan ini juga menampilkan
alamat dasar (Base) terhadap
setiap instruksi. Urutan instruksi
yang termasuk dalam program
yang sama akan memiliki alamat
dasar yang sama.

2. Special CPU registers view Tampilan ini menunjukkan kumpulan register CPU,
yang memiliki fungsi spesialis yang telah
ditentukan sebelumnya:
PC: Program Counter berisi alamat dari instruksi
selanjutnya yang akan dieksekusi.
IR: Instruction Register berisi instruksi yang
sedang dijalankan.
SR: Status Register berisi informasi yang
berkaitan dengan hasil dari instruksi yang terakhir
dieksekusi.
SP: Stack Pointer register poin ke nilai yang
dipertahankan di bagian atas tumpukan program
(lihat di bawah).
BR: Base Register berisi basis saat ini
alamat.
MAR: Memory Address Register berisi alamat
memori yang sedang diakses.

Status bits: OV: Overflow; Z: Zero; N: Negative

3
3. CPU registers view

Gambar 4 – CPU Registers view

Tampilan set register menunjukkan isi


dari semua register tujuan umum, yang
digunakan untuk mempertahankan nilai
sementara saat instruksi program
dijalankan. Register adalah memori yang
sangat cepat yang menyimpan nilai
sementara saat CPU menjalankan
instruksi.

Arsitektur ini mendukung dari 8 hingga


64 register. Register ini sering digunakan
untuk menyimpan nilai variabel
program seperti yang didefinisikan
dalam bahasa tingkat tinggi.

Tidak semua arsitektur memiliki register


sebanyak ini. Beberapa memiliki lebih
banyak (misalnya 128 register) dan
beberapa lainnya lebih sedikit (misalnya
8 register). Dalam semua kasus, register
ini memiliki tujuan yang serupa.

This Tampilan ini menampilkan setiap


nama register (Reg), nilai saat ini (Val)
dan beberapa nilai tambahan, yang
dicadangkan untuk debugging program.
Ini juga dapat digunakan untuk
mengatur ulang nilai register individual
secara manual yang seringkali berguna
untuk debugging tingkat lanjut. Untuk
mengubah konten register secara
manual, pertama pilih register kemudian
masukkan nilai baru di kotak teks, Reg
Value, dan klik tombol CHANGE di tab
Registers.

4
4. Program stack view

Gambar 5 ‐ Program stack view

Tumpukan program adalah area lain yang


mempertahankan nilai sementara saat
instruksi dijalankan. Tumpukan adalah
struktur data LIFO (terakhir masuk
pertama keluar). Ini sering digunakan
untuk penanganan interupsi dan sub‐
routine calls yang efisien. Setiap program
memiliki stack masing-masing.

Instruksi CPU PSH (push) dan POP


digunakan untuk menyimpan nilai di atas
stack dan nilai pop dari atas stack masing-
masing.

5. Program list view

Gambar 6 ‐ Program List View

Gunakan tombol REMOVE PROGRAM


untuk menghapus program yang dipilih
dari daftar; gunakan tombol REMOVE ALL
PROGRAMS untuk menghapus semua
program dari daftar. Perhatikan bahwa
ketika sebuah program dihapus,
instruksinya juga dihapus dari Instruction
Memory View juga.

6. Pembuatan program
Gambar 7 – Tab pembuatan
program

Untuk membuat program baru


masukkan namanya di kotak
Program Name dan alamat dasarnya
di kotak Base Address lalu klik
tombol ADD. Nama program baru
akan muncul di tampilan Daftar
Program (lihat Gambar 6).

5
Gambar 8 – Tab untuk
menambahkan instruksi program

Gunakan tombol ADD NEW…


tombol untuk menambahkan
instruksi baru; gunakan tombol
EDIT… button untuk mengedit
instruksi yang dipilih; gunakan
MOVE DOWN/ MOVE UP untuk
memindahkan instruksi yang
dipilih ke bawah atau ke atas;
gunakan INSERT ABOVE…/INSERT
BELOW… untuk memasukkan
instruksi baru di atas atau di
bawah instruksi yang dipilih
masing-masing.

7. Program data memory view

Gambar 9 ‐ Program data memory view


6
Instruksi CPU yang mengakses bagian memori yang berisi data dapat menulis atau
membaca data di lokasi yang dituju. Data ini dapat dilihat pada jendela halaman
memori yang ditunjukkan pada Gambar 9 di atas. Anda dapat menampilkan jendela ini
dengan mengklik tombol SHOW PROGRAM DATA MEMORY… ditunjukkan pada
Gambar 6 di atas. Kolom Ladd (alamat logis) menunjukkan alamat awal setiap baris di
layar. Setiap baris tampilan mewakili 8 byte data. Kolom B0 sampai B7 mewakili byte 0
sampai 7 pada setiap baris. Kolom Data menunjukkan karakter yang dapat ditampilkan
sesuai dengan 8 byte. Byte yang sesuai dengan karakter yang tidak dapat ditampilkan
ditampilkan sebagai titik. Byte data hanya ditampilkan dalam format hex. Misalnya, di
Gambar 9, ada byte data bukan nol di lokasi alamat 19 dan 37. Byte data ini sesuai
dengan karakter yang dapat ditampilkan, kapital A dan B.

Untuk mengubah nilai byte apa pun, pertama-tama pilih baris yang berisi byte.
Kemudian gunakan informasi di frame Initialize Data untuk mengubah nilai byte pada
baris yang dipilih sebagai format Integer, Boolean or String. Anda perlu mengklik
tombol the UPDATE untuk membuat perubahan.

8. IO console view

Image 10 – Input, output console view


Gambar 10 di atas menunjukkan konsol yang digunakan oleh program untuk menulis
pesan dan membaca data dari. Itu dapat ditampilkan dengan mengklik tombol INPUT
OUTPUT… ditunjukkan pada Gambar 1 di atas. Klik pada tombol SHOW KEYBD… untuk
menampilkan jendela keyboard kecil yang dapat digunakan untuk memasukkan data
ke program yang meminta masukan.

7
E. Latihan – Investigasi dan Eksplorasi
Latihan praktikum merupakan rangkaian kegiatan yang dilaksanakan oleh mahasiswa
sesuai dengan pedoman dasar. Jadi, bagaimana tutorial ini dilakukan? mahasiswa
diharapkan mengikuti petunjuk yang diberikan untuk mengidentifikasi dan
menemukan informasi yang diperlukan, untuk menindaklanjutinya, membuat catatan
tentang pengamatan mereka dan menawarkan penjelasan untuk pengamatan ini jika
diminta. Untuk bisa melakukan ini Anda harus melihat informasi di Bagian D di atas dan
juga sering merujuk ke Lampiran untuk informasi tentang berbagai instruksi CPU yang
akan diminta untuk Anda buat dan gunakan. Ingat, Anda perlu membaca dengan
cermat dan memahami instruksi sebelum Anda mencoba setiap aktivitas.
Sekarang, mari kita mulai. Pertama, Anda perlu memasukkan beberapa instruksi di
Instruction Memory View (lihat Gambar 2), mewakili RAM di mesin sebenarnya,
sebelum menjalankan instruksi apa pun. Untuk melakukan ini, ikuti langkah-langkah di
bawah ini:
Pada Tab Program (lihat Gambar 7), pertama masukkan Nama Program pada Program
Name, dan kemudian masukkan Base Address (ini bisa berapa saja, tapi untuk latihan
ini gunakan 100). Klik tombol ADD. Nama program baru akan dimasukkan di Program
List View (lihat Gambar 6). Anda dapat mengklik tombol SAVE… untuk menyimpan
instruksi dalam sebuah file. Anda dapat menggunakan tombol LOAD… untuk memuat
instruksi dari file.
Anda sekarang siap untuk memasukkan instruksi ke dalam Simulator CPU. Anda
melakukan ini dengan mengklik tombol ADD NEW… pada Tab Instructions (lihat
Gambar 8). Ini akan menampilkan jendela Instructions: CPU0. Anda menggunakan
jendela ini untuk memilih dan memasukkan instruksi CPU. Lampiran mencantumkan
beberapa instruksi yang digunakan simulator ini dan juga memberikan contoh
penggunaannya.
Sekarang, coba aktivitas berikut (masukkan jawaban Anda di kotak teks yang tersedia).
Perhatian: Simpan kode Anda secara teratur dalam sebuah file. Apabila simulator
crash, Anda dapat memulai ulang simulator dan memuat ulang file Anda.

8
1. Dalam Lampiran di akhir dokumen ini, temukan instruksi yang dapat digunakan
untuk menyimpan satu byte data di lokasi memori. Gunakan untuk menyimpan
nomor 65 di lokasi alamat 20 (semua nomor dalam desimal). Ini adalah contoh
pengalamatan langsung (direct addressing). Lihat Gambar 9 untuk melihat cara
menampilkan konten memori data. Buat catatan di bawah instruksi yang digunakan:

2. Buat instruksi untuk memindahkan angka desimal 22 ke register R01 dan catat di
bawah ini. Jalankan instruksi ini dan verifikasi hasilnya di R01.

3. Buat instruksi untuk menyimpan angka desimal 51 di lokasi memori alamat yang
saat ini disimpan di register R01. Ini adalah contoh pengalamatan tidak langsung
(indirect addressing). Perhatikan penggunaan awalan “@” di samping R01 dalam
kasus ini.

4. Catat apa yang Anda lihat di lokasi memori data 20 dan 22 (lihat Gambar 9 untuk
informasi bantuan tentang cara menampilkan memori data).

5. Sekarang, mari buat loop. Pertama, masukkan kode berikut. Awalan # digunakan
untuk menunjukkan nilai literal sehingga membedakannya dari nilai alamat yang
tidak menggunakannya. R01 mewakili arbitrary register; Anda dapat menggunakan
register mana pun dari R00 hingga R31.
MOV #0, R01
ADD #1, R01
CMP #5, R01
JNE 0
HLT

6. Kode di atas belum sepenuhnya siap. Instruksi JNE menggunakan nilai numerik
sebagai alamat tujuan. Dalam kasus ini 0. Ini mungkin tidak selalu terjadi
sehingga untuk membuat kode lebih fleksibel kita dapat menggunakan label
untuk mewakili alamat instruksi. Simulator memungkinkan Anda melakukan ini.
Ikuti instruksi di bawah ini untuk ini:
▪ Sorot instruksi MOV di atas (yaitu yang ada di kotak di atas)
▪ Klik tombol INSERT BELOW…

9
▪ Ketik nama label L0 di kotak di samping tombol ENTER LABEL di jendela yang
Anda gunakan untuk memasukkan instruksi
▪ Klik tombol ENTER LABEL
Kode baru sekarang akan terlihat seperti ini (modifikasi berwarna merah)::

MOV #0, R01


L0:
ADD #1, R01
CMP #5, R01
JNE 0
HLT

▪ Selanjutnya, sorot instruksi JNE


▪ Klik tombol EDIT…
▪ Pilih L0 dalam daftar drop-down di bawah tombol bagian Source Operand di
jendela yang Anda gunakan untuk memasukkan instruksi
▪ Klik tombol EDIT
Kode baru sekarang akan terlihat seperti ini:

MOV #0, R01


L0:
ADD #1, R01
CMP #5, R01
JNE $L0
HLT

7. Seperti yang Anda lihat, label L0 mewakili alamat instruksi tepat di bawahnya, yaitu
instruksi ADD. Jadi sekarang instruksi JNE bisa menggunakan L0 sebagai alamat
untuk lompat. Karena label L0 dapat mewakili alamat apa pun, kode ini harus
berfungsi di mana saja di memori sehingga sangat fleksibel. Tanda $ menunjukkan
bahwa L0 adalah label. Kode di atas sekarang siap dijalankan. Untuk menjalankan
program ini, ikuti petunjuk di bawah ini:
▪ Klik tombol RESET PROGRAM pada jendela CPU Simulator
▪ Sorot instruksi MOV, yaitu instruksi pertama program
▪ Sesuaikan penggeser kecepatan ke nilai, katakanlah, yang paling dekat
dengan nilai 80
▪ Klik pada tombol RUN
▪ Setelah beberapa saat, program akan berhenti. Jika tampaknya berjalan
terlalu lama, klik tombol STOP dan periksa kode Anda. Perbaiki jika perlu dan
ulangi petunjuk di atas sekali lagi.
▪ Ketika program berhenti, catat nilai di R01 di bawah ini

8. Sekarang Anda akan melakukan sedikit modifikasi pada program di atas. Ubah kode
program sehingga loop program diulang selama nilai R01 kurang dari atau sama
dengan 3 (Anda mungkin ingin merujuk ke Lampiran untuk ini) dan uji kode
tersebut. Ketika Anda melakukannya dengan benar, catat nilai di R01 dan salin kode

10
baru di bawah ini. Sekarang, ubah instruksi yang diubah kembali ke instruksi asli
(Anda dapat menggunakan tombol UNDO untuk ini - lihat Gambar 8 di atas).

9. Oke, mari kita buat subrutin sederhana. Masukkan kode baru berikut. Anda perlu
membuat label baru L1 di awal subrutin. Label ini mewakili alamat awal dari
subrutin. Anda harus memasukkan label dengan menggunakan tombol ENTER
LABEL seperti yang dijelaskan di (6). Selain itu, pastikan Anda memilih tombol radio
Direct Mem saat memasukkan nilai operand pertama 24 dari instruksi OUT:
L1:
OUT 24, 0
RET

10. Kode subrutin di atas hanya menampilkan teks yang dimulai dari lokasi memori
data 24 dan kembali (lihat instruksi RET di lampiran). Agar berfungsi, perlu ada
beberapa teks di lokasi alamat data 24. Anda dapat melakukannya secara manual
dengan mengikuti langkah-langkah di bawah ini:
▪ Klik tombol SHOW PROGRAM DATA MEMORY… (lihat Gambar 6).
▪ Di jendela yang ditampilkan, sorot baris 0024 di bawah kolom LAdd
▪ Di bawah Initialise Data klik tombol radio String
▪ Masukkan beberapa teks di kotak teks berlabel Value, misalnya: Nama saya
Joko
▪ Klik tombol UPDATE

11. Sekarang, subrutin tidak berguna dengan sendirinya. Agar bermanfaat, program
Anda harus memanggilnya dengan menggunakan instruksi MSF diikuti oleh CAL
(lihat Lampiran). MSF (Mark Stack Frame) diperlukan sebagai tempat untuk alamat
pengirim di tumpukan program. Instruksi CAL perlu menentukan alamat awal dari
subrutin yang dipanggil. Mari kita ubah kode kita sehingga ketika subrutin di atas
dipanggil, ia menampilkan teks berulang kali dalam satu lingkaran. Misalnya,
menggunakan kode yang ditambahkan (6) dan (9) pada program yang dimodifikasi
akan terlihat seperti ini:
MOV #0, R01
L0:
ADD #1, R01
MSF
CAL $L1
CMP #5, R01
JNE $L0
HLT
L1:
OUT 24, 0
RET

11
12. Kode di atas sekarang siap dijalankan. Untuk melihat teks yang ditampilkan, Anda
perlu menunjukkan jendela konsol. Klik pada tombol INPUT OUTPUT… (lihat
Gambar 1) yang akan menampilkan jendela konsol yang disimulasikan. Untuk
menjalankan program ini, ikuti petunjuk di bawah ini:
▪ Klik tombol RESET PROGRAM
▪ Sorot instruksi MOV, yaitu instruksi pertama program
▪ Sesuaikan penggeser kecepatan ke nilai yang paling dekat dengan nilai 80
▪ Klik tombol RUN

13. Kita perlu membuat sedikit perubahan pada subrutin kita. Saat ini instruksi OUT
menggunakan pengalamatan memori langsung, yaitu alamat memori 24 adalah
bagian dari instruksi. Kami sekarang ingin membuatnya menggunakan
pengalamatan tidak langsung dengan cara yang mirip dengan (3). Jadi, Anda harus
menempatkan alamat memori 24 di register (register cadangan apa pun). Maka
Anda perlu memiliki instruksi OUT menggunakan register ini secara tidak langsung
sebagai sumber alamat teks yang akan ditampilkan. Jalankan kode untuk menguji
modifikasi Anda. Catat bagian kode program yang dimodifikasi di bawah ini.
Gunakan tombol UNDO untuk memulihkan petunjuk sebelum modifikasi ini:

14. Oke, mari kita sedikit lebih ambisius sebagai tantangan. Mari kita ubah
pengulangan menjadi subrutin lain dan kemudian memanggilnya. Jadi, sekarang
kita akan memiliki dua subrutin dimana satu memanggil yang lain. Kode berikut
mewakili perubahan ini. Perhatikan bahwa instruksi HLT diubah menjadi instruksi
RET dan instruksi baru MSF, CAL dan HLT ditambahkan bersama dengan label baru
L2 di bagian atas kode.
CAL $ L2 memanggil subrutin dengan loop dan CAL $ L1 memanggil subrutin yang
menampilkan teks.

MSF
CAL $L2
HLT
L2:
MOV #0, R01
L0:
ADD #1, R01
MSF
CAL $L1
CMP #5, R01
JNE $L0
RET
L1:
OUT 24, 0
RET

Sekarang, reset program terlebih dahulu lalu sorot instruksi MSF pertama. Jalankan
program dan verifikasi hasilnya di jendela konsol seperti sebelumnya.
12
15. Kenapa berhenti disini! Mari membuatnya sedikit lebih menarik. Kode di atas akan
melakukan loop sebanyak 5 kali dan nomor ini tetap. Untuk fleksibilitas, kita dapat
meneruskan jumlah loop sebagai parameter ke subrutin (mulai dari label L2). Untuk
ini kita akan menggunakan instruksi PSH dan POP (lihat Lampiran). Ubah kode Anda
agar terlihat seperti di bawah ini dan jalankan dengan mengamati tampilan di
konsol:
MSF
PSH #8
CAL $L2
HLT
L2:
POP R02
MOV #0, R01
L0:
ADD #1, R01
MSF
CAL $L1
CMP R02, R01
JNE $L0
RET
L1:
OUT 24, 0
RET
16. Perhatikan kode di atas dan jelaskan secara singkat cara kerja parameter passing:

17. Akhirnya, sebagai tantangan nyata, ubah kode di atas sehingga parameter kedua
diteruskan ke subrutin (dimulai dari label L2) dengan cara yang sama seperti
parameter pertama dilewatkan. Parameter kedua digunakan untuk menginisialisasi
register R01 ke nilai parameter kedua ini. Salin kode yang diubah hanya ke bagian
modifikasi terakhir pada kotak di bawah ini:

13
Lampiran - Sub-set Instruksi Simulator

Inst Description
Data transfer instructions
Move data to register; move register to register
MOV e.g.
MOV #2, R01 moves number 2 into register R01
MOV R01, R03 moves contents of register R01 into register R03
Load a byte from memory to register
LDB e.g.
LDB 1022, R03 loads a byte from memory address 1022 into R03
LDB @R02, R05 loads a byte from memory the address of which is in R02
LDW Load a word (2 bytes) from memory to register
Same as in LDB but a word (i.e. 2 bytes) is loaded into a register
Store a byte from register to memory
STB STB R07, 2146 stores a byte from R07 into memory address 2146
STB R04, @R08 stores a byte from R04 into memory address of which is in
R08
STW Store a word (2 bytes) from register to memory
Same as in STB but a word (i.e. 2 bytes) is loaded stored in memory
Push data to top of hardware stack (TOS); push register to TOS
PSH e.g.
PSH #6 pushes number 6 on top of the stack
PSH R03 pushes the contents of register R03 on top of the stack
Pop data from top of hardware stack to register
e.g.
POP POP R05 pops contents of top of stack into register R05
Note: If you try to POP from an empty stack you will get the error message
“Stack underflow”.
Arithmetic instructions
Add number to register; add register to register
e.g.
ADD ADD #3, R02 adds number 3 to contents of register R02 and stores the
result in register R02.
ADD R00, R01 adds contents of register R00 to contents of register R01
and stores the result in register R01.
SUB Subtract number from register; subtract register from register
MUL Multiply number with register; multiply register with register
DIV Divide number with register; divide register with register
Control transfer instructions
Jump to instruction address unconditionally
JMP e.g.
JMP 100 unconditionally jumps to address location 100 where there is
another instruction

14
JLT Jump to instruction address if less than (after last comparison)
JGT Jump to instruction address if greater than (after last comparison)
Jump to instruction address if equal (after last comparison instruction)
e.g.
JEQ JEQ 200 jumps to address location 200 if the previous comparison
instruction result indicates that the two numbers are equal, i.e. the Z
status flag is set (the Z box will be checked in this case).
JNE Jump to instruction address if not equal (after last comparison)
Mark Stack Frame instruction is used in conjunction with the CAL
instruction.
MSF e.g.
MSF reserve a space for the return address on program stack
CAL 1456 save the return address in the reserved space and jump to
subroutine in address location 1456
Jump to subroutine address (saves the return address on program stack)
CAL This instruction is used in conjunction with the MSF instruction. You’ll
need an MSF instruction before the CAL instruction. See the example
above
RET Return from subroutine (uses the return address on stack)
SWI Software interrupt (used to request OS help)
HLT Halt simulation
Comparison instruction
Compare number with register; compare register with register
e.g.
CMP #5, R02 compare number 5 with the contents of register R02
CMP R01, R03 compare the contents of registers R01 and R03
CMP Note:
If R01 = R03 then the status flag Z will be set, i.e. the Z box is checked.
If R03 > R01 then non of the status flags will be set, i.e. none of the status
flag boxes are checked.
If R01 > R03 then the status flag N will be set, i.e. the N status box is
checked.
Input, output instructions
IN Get input data (if available) from an external IO device
Output data to an external IO device
OUT e.g.
OUT 16, 0 outputs contents of data in location 16 to the console (the
second parameter must always be a 0)

15

Anda mungkin juga menyukai