Jam Ne

Selasa, 08 Maret 2011

ASSEMBLY DAN EKSEKUSI PROGRAM

Source program yang ditulis dalam bahasa assembly harus diassemble menjadi object program bahasa mesin sebelum dapat dieksekusi. Hal ini dilakukan oleh program assembler, yang mengganti semua simbol untuk mode operasi dan penggalamatan dengan kode biner yang digunakan dalam instruksi mesin, dan mengganti semua nama dan label dengan nilai sebenarnya.
Assembler menetapkan alamat untuk instruksi dan blok data, mulai dari alamat yang ada dalam asembler directive ORIGIN. Juga menyisipkan konstanta yang dapat dinyatakan dalam perintah DATAWORD dan ruang memori cadangan sebagaimana yang diminta oleh perintah RESERVE.
Bagian utama proses assembly menetapkan nilainilai untuk menggantikan namanama tersebut. Pada beberapa kasus, dimana nilai suatu nama ditetapkan oleh directive EQU, maka ini merupakan tugas langsung. Pada kasus lain, dimana suatu nama didefinisikan dalam field Label suatu instruksi, maka nilai yang diwakili nama ini ditentukan dengan lokasi instruksi ini dalam object program terassemble. Karenanya, assembler barns mencatat alamat-alamat yang menghasilkan kode mesin untuk instruksi yang berurutan. Misalnya, nama START dan LOOP masingmasing akan menetapkan nilai 100 dan 112. Pada beberapa kasus, assembler tidak secara langsung mengganti nama yang mewakili alamat dengan nilai yang sebenarnya dari alamat ini. Misalnya, pada instruksi branch, nama yang menetapkan lokasi dimana branch dilakukan (branch target) tidak diganti dengan alamal yang sebenarnya. Instruksi branch biasanya diimplementasikan dalam kode mesin dengan menetapkan branch target menggunakan mode penggalamatan Relative. Assembler menghitung branch offset, yaitu jarak ke target, clan meletakkannya dalam instruksi mesin. Pada saat assembler memindai source program, assembler akan mencatat semua nama dan nilai numerik yang berhubungan dengannya dalam tabel simbol.
Sehingga, pada saat nama tersebut muncul untuk kedua kalinya, akan digantikan dengan nilainya dari tabel tersebut. Persoalan muncul pada saat strain nama muncul sebagai operand sebelum mendapatkan nilainya. Misalnya, hal ini terjadi jika diperlukan suatu forward branch. Assembler tidak akan mampu menetapkan branch target, karena nama yang dimaksud belum direkam dalam tabel symbol. Pada akhir lewatan ini, semua nama harus telah ditetapkan dengan nilai numerik. Assembler kemudian memasuki source program untuk kedua kalinya dan mensubstitusi nilai untuk semua nama dari tabel simbol. Assembler tersebut disebut twopass assembler. Assembler tersebut menyimpan object program pada disk magnetik. Object program harus diload ke dalam memori komputer sebelum dieksekusi. Pada saat hal ini berjalan, program utiliti lain yang disebut loader harus telah tersedia dalam memori. Mengeksekusi loader adalah menjalankan serangkaian operasi input yang diperlukan untuk mentransfer program bahasa mesin dari disk ke tempat tertentu dalam memori. Loader harus mengetahui panjang program dan alamat dalam memori yang akan digunakan untuk menyimpannya. Assembler biasanya menyimpan informasi ini pada header sebelum kode objek. Setelah meload kode objek, loader mulai mengeksekusi object program dengan melakukan branching ke instruksi pertama yang akan dieksekusi. Ingatlah bahwa alamat instruksi tersebut telah disertakan dalam program bahasa assembly sebagai operand assembler directive END. Assembler menyertakan alamat ini di dalarn header yang mendahului kode objek pada disk. Pada saat object program mulai mengeksekusi, akan diselesaikan hingga akhir kecuali jika terdapat kesalahan logika dalam program tersebut. User harus mampu menemukan kesalahan tersebut dengan mudah. Assembler dapat mendeteksi clan melaporkan kesalahan syntax. Unmk membantu user menemukan kesalahan pemrograman yang lain, software sistem biasanya menyertakan program debugger. Program ini memungkinkan user menghentikan eksekusi object program pada suatu titik yang diinginkan dan memeriksa berbagai register prosesor dan lokasi memori.
NOTAS1 BILANGAN
Pada saat berhadapan dengan nilai numerik, seringkali lebih mudah untuk menggunakan notasi desimal yang telah dikenal. Tentu saja, nilai tersebut disimpan dalam komputer sebagai bilangan biner. Pada beberapa situasi, lebih mudah untuk menetapkan pola biner secara langsung. Kebanyakan assembler memungkinkan bilangan numerik dinyatakan dengan berbagai cara yang berbeda, menggunakan konvensi yang ditetapkan oleh syntax bahasa assembly. Misalkan, bilangan 93, yang dinyatakan dengan bilangan biner 8bit 01011101. Jika nilai ini digunakan sebagai operand Immediate, maka dapat dinyatakan sebagai bilangan desimal, sebagaimana dalam instruksi :
ADD #93, RI
atau sebagai bilangan bitter yang diidentifikasi dengan simbol awalan seperti tanda persen, sebagaimana dalam :
ADD #%01011101, R1
Bilangan biner dapat dituliskan lebih padat sebagai bilangan heksadesimal, atau hex, dengan empat bit dinyatakan dengan digit hex tunggal. Notasi hex adalah ekstensi langsung dari kode BCD yang terdapat dalam Apendiks E. Sepuluh pola pertama 0000, 0001, ..., 1001, dinyatakan dengan digit 0, 1, ..., 9 sebagaimana dalam
BCD. Sisa enam pola 4bit, 1010, 1011, ..., I111, dinyatakan dengan huruf A, B, ..., F. Dalam representasi heksadesimal, nilai desimal 93 menjadi SD. Dalam bahasa assembly, representasi hex seringkali diidentifikasi dengan awalan tanda dolar. Sehingga kita menuliskannya :
ADD #$SD, R1
OPERASI INPUT/OUTPUT DASAR
Bagian sebelumnya dalam bab ini mendeskripsikan instruksi mesin dan mode pengalamatan. Kita telah mengasumsikan bahwa data yang dikenai operasi instruksi ini telah disimpan dalam memori. Kita sekarang membahas sarana yang digunakan untuk mentransfer data antara memori komputer dan dunia luar. Operasi Input/Output (I/O) sangat penting, dan cara operasi tersebut dijalankan dapat memiliki efek yang signifikan pada performa komputer. Misalkan suatu tugas untuk membaca input karakter dari keyboard dan menghasilkan output karakter pada layar display. Cara sederhana untuk menjalankan tugas I/O tersebut adalah dengan menggunakan metode yang dikenal sebagai programcontrolled I/O. Kecepatan transfer data dari keyboard ke komputer dibatasi oleh kecepatan mengetik user, yang tampaknya tidak melebihi beberapa karakter per detik. Kecepatan transfer output dari komputer untuk ditampilkan jauh lebih tinggi. Hal ini ditentukan oleh kecepatan karakter ditransmisikan melalui link antara komputer dan perangkat display, biasanya, beberapa ribu karakter per dedtik. Akan tetapi ini masih jauh lebih lambat daripada kecepatan prosesor yang dapat mengeksekusi jutaan instruksi per detik. Perbedaan kecepatan antara prosesor dan perangkat I/O menimbulkan kebutuhan akan adanya mekanisme untuk mensinkronisasikan transfer data diantara keduanya.


Gambar Koneksi bus untuk prosesar, keyboard, dan display.
Solusi untuk persoalan tersebut adalah sebagai berikut: pada output, prosesor mengirim karakter pertama dan kemudian menunggu sinyal dari display bahwa karakter telah diterima. Kemudian mengirim karakter kedua, dan seterusnya. Input dikirim dari keyboard dengan cara yang sama; prosesor menunggu sinyal yang mengindikasikan bahwa suatu tombol karakter telah ditekan dan kodenya tersedia dalam beberapa registerbuffer yang diasosiasikan dengan keyboard. Kemudian prosesor membaca kode tersebut.
Keyboard dan display adalah perangkat yang terpisah. Tindakan menekan suatu tombol pada keyboard tidak secara otomatis menyebabkan karakter yang sesuai ditampilkan pada layar. Satu blok instruksi dalam program I/O mentransfer karakter tersebut ke prosesor, dan blok lain yang berhubungan dengan instruksi tersebut menyebabkan ditampilkannya karakter tersebut. Misalkan suatu persoalan pemindahan kode karakter dari keyboard ke prosesor. Menekan suatu tombol akan menyimpan kode karakter yang sesuai dalam register buffer 8bit yang sesuai dengan keyboard. Mari kita sebut register ini DATAIN. Untuk memberitahu prosesor bahwa karakter yang valid berada dalam DATAIN, suatu status control flag, SIN, diset ke 1. Suatu program memonitor SIN, dan saat SIN diset ke 1, prosesor membaca isi DATAIN. Pada saat karakter ditransfer ke prosesor, maka SIN secar otomatis dikosongkan ke 0. Jika karakter kedua dimasukkan melalui keyboard, maka SIN diset lagi ke 1 dan proses tersebut diulang. Proses yang analog terjadi pada saat karakter ditransfer dari prosesor ke display. Register buffer, DATAOUT, dan status control flag, SOUT, digunakan untuk transfer ini. Pada saat SOUT setara dengan I, maka display siap untuk menerima suatu karakter. Di bawah kontrol program, prosesor memonitor SOUT, dan pada saat SOUT diset ke 1, prosesor mentransfer kode karaktei ke DATAOUT. Transfer karakter ke DATAOUT mengosongkan SOUT ke 0; pada saat perangkat display siap untuk menerima karakter kedua, maka SOUT sekali lagi di set ke 1. Register buffer
DATAIN dan DATAOUT dan flag status SIN dan SOUT adalah bagian dari sirkuit yang biasanya dikenal sebagai device interface. Sirkuit untuk tiap perangkat dihubungkan ke prosessor melalui bus, sebagaimana yang diperlihatkan pada Gambar di atas Untuk menjalankan transfer I/O, kita memerlukan instruksi mesin yang dapat memeriksa keadaan flag status dan transfer data antara prosesor dan perangkat I/O. Instruksi tersebut memiliki kemiripan format dengan yang digunakan untuk memindahkan data antara prosesor dan memori. Misalnya, prosesor dapat memonitor flag status keyboard SIN dan transfer karakter dari DATAIN ke register Rl dengan rangkaian operasi sebagai berikut:
READWAIT Branch to READMIT if SIN = 0
Input from DATAIN to R1.
Operasi Branch biasanya diimplementasikan oleh dua instruksi mesin. Instruksi pertama menguji flag status dan yang kedua menjalankan branch. Sekalipun detilnya bervariasi dan satu komputer ke komputer lain, ide utamanya adalah prosesor memonitor flag status dengan mengeksekusi wait loop pendek dan melanjutkan untuk mentransfer data input pada saat SIN diset ke 1 sebagai hasil dari adanya suatu tombol yang ditekan. Operasi Input mereset SIN ke 0. Rangkaian yang analog dari operasi tersebut digunakan untuk mentransfer output ke dis play. Contohnya adalah :
WRITEWAIT Branch to WRITEWAIT if SOUT = 0
Output from R1 to DATAOUT
Lagi, operasi Branch biasanya diimplementasikan oleh dua instruksi mesin. Wait loop dieksekusi berulangkali hingga flag status SOUT diset ke 1 oleh display pada saat display bebas untuk menerima suatu karakter. Operasi Output mentransfer suatu karakter dari RI ke DATAOUi untuk ditampilkan, dan operasi tersebut mengosongkan SOUT ke 0. Kita mengasumsikan bahwa keadaan awal SIN adalah 0 dan keadaan awal SOUT adalah 1. Awalan ini biasanya dilakukan oleh sirkuit kontrol perangkat pada saat perangkat ditempatkan di bawah kontrol komputer sebelum eksekusi program dimulai. Hingga sekarang, kita telah mengasumsikan bahwa alamat yang dinyatakan oleh prosesor untuk untuk mengakses iustruksi dan operand selalu mengacu ke lokasi memori. Banyak komputer menggunakan pengaturan yang disebut memorymapped I/O dimana beberapa nilai alamat memori digunakan untuk mengacu ke register buffer perangkat periferal, seperti DATAIN dan DATAOUT. Sehingga, tidak ada instruksi khusus untuk mengakses isi register tersebut; data dapat ditransfer antara register dan prosesor menggunakan instruksi yang telah kita bahas, seperti Move, Load, atau Store. Misalnya, isi buffer karakter keyboard DATAIN dapat ditransfer ke register R1 dalam prosesor dengan instruksi :
MoveByte DATAIN, RI
Serupa dengan isi register RI dapat ditransfer ke DATAOUT dengan instruksi :
MoveByte R1, DATAOUT
Flag status SIN dan SOUT secara otomatis dikosongkan pada saat masingmasing mengacu pada register buffer DATAIN dan DATAOUT. Kode operasi MoveByte menunjukkan bahwa ukuran operand adalah satu byte, untuk membedakannya dari kode operasi Move yang telah digunakan untuk operand word. Kita telah menetapkan bahwa dua buffer data pada Gambar di atas dapat diberi alamat seakan keduanya adalah dua lokasi memori. Sangat dimungkinkan untuk menangani flag status SIN dan SOUT dengan cara yang sama, dengan menetapkan alamat yang berbeda padanya. Akan tetapi, lebih umum untuk menyertakan SIN dan SOUT pada register device status, satu untuk tiap dua perangkat. Mari kita asumsikan bahwa bit b3 dalam register INSTATUS dan OUTSTATUS masingmasing berhubungan dengan SIN dan SOUT. Operasi baca yang barn saja dideskripsikan dapat diimplementasikan dengan rangkaian instruksi mesin.
READWAIT Testbit #3,INSTATUS
Branch=0 READWAIT
MoveByte DATAIN, R1
Operasi tulis dapat diimplementasikan sebagai berikut
WRITEWAIT Testbit #3, OUTSTATUS
Branch=0 WRITEWAIT
MoveByte RI, DATAOUT
Instruksi Testbit menguji keadaan satu bit pada lokasi destinasi, dimana posisi bit yang diuji diindikasikan oleh operand pertama. Jika bit yang diuji setara dengan 0, maka kondisi instruksi branch adalah benar, dan suatu branch dibuat pada awal wait loop. Pada saat perangkat tersebut siap, yaitu pada saat bit yang diuji menjadi setara dengan 1, data dibaca dari buffer input atau ditulis ke buffer output. Program yang ditampilkan pada Gambar 8.4 menggunakan dua operasi untuk membaca baris karakter yang diketikkan pada keyboard dan dikirim ke parangkat display. Pada saat karakter tersebut dibaca, satu demi satu, karakter tersebut disimpan pada area data dalam memori dan kemudian ditampilkan pada display. Program berakhir pada saat karakter carriage return, CR, dibaca, disimpan, dan dikirim ke display. Alamat lokasi byte pertama dari memori data area tempat baristersebut disimpan adalah LOC dengan instruksi pertama dari program tersebut. RO dinaikkan untuk tiap karakter yang dibaca dan ditampilkan oleh mode pengalamatan Autoincrement yang digunakan dalam instruksi Compare.
Move #LOC,RO Initialize pointer register RO to point to
the address of the first location in
memory where the characters are to be
stored.
READ TestBit
Branch=0
MoveByte
#3,INSTATUS
READ
DATAIN,(RO)
Wait for a character to be entered in the
keyboard buffer DATAIN.
Transfer the character from DATAIN.
into the memory (this clears SIN to 0).
ECHO TestBit
Branch=0
MoveByte
Compare
Branch≠0
#3,OUTSTATUS
ECHO
(RO),DATAOUT
#CR,(RO)+
READ
Wait for the display to become ready.
Move the character just read to the display
buffer register (this clears SOUT to 0).
Check if the character just read is CR
(carriage return). If it is not CR, then
branch back and read another character.
Also, increment the pointer to store the next
character.
Gambar 8.4. Program yang membaca sebaris karakter dan menampilkannya
Programcontrolled
IO memerlukan keterlibatan kontinyu prosesor dalam
aktifitas l/0. Hampir semua waktu eksekusi untuk program dalam Gambar 8.4
dihitung dalam dua wait loop, pada saat prosesor menunggu karakter yang akan
ditekan atau menunggu display tersedia. Sangat diinginkan untuk menghindari
terbuangnya waktu eksekusi prosesor pada situasi ini. Teknik I/O yang lain, berdasar
pada penggunaan interrupt, dapat digunakan untuk meningkatkan utilisasi prosesor.

Bahasa Assembly

Instruksi mesin dinyatakan dengan pola 0 dan l. Pola semacam itu sangat sulit untuk dijelaskan pada saat membahas atau menyiapkan program. Oleh karena itu, kita menggunakan nama simbolik untuk menyatakan pola tersebut. Sejauh ini kita telah menggunakan katakata biasa seperti Move, Add, Increment, dan Branch, untuk instruksi operasi yang menyatakan pola kode biner yang sesuai. Pada saat menulis program untuk komputer tertentu, kata-kata tersebut biasanya diganti dengan akronim yang disebut mnemonic, seperti MOV, ADD, INC, dan BR Serupa dengan kita menggunakan notasi R3 untuk mengacu pada register 3, dan LOC untuk mengacu pada lokasi memori. Set lengkap nama simbolik semacam dan aturan penggunaannya membentuk bahasa pemrograman, yang biasanya disebut sebagai bahasa assembly. Set aturan untuk menggunakan mnemonic dalam spesifikasi instruksi dan program lengkap disebut syntax bahasa. Program yang ditulis dalam bahasa assembly dapat secara otomatis ditranslasikan ke rangkaian instruksi mesin oleh suatu program yang disebut assembler. Program assembler adalah salah satu kumpulan program yang merupakan bagian dari software sistem. Assembler, seperti halnya program yang lain, disimpan sebagai rangkaian instruksi mesin dalam memori komputer. Program user biasanya dimasukkan ke dalam komputer melalui keyboard dan disimpan dalam memori atau disk magnetik. Pada titik ini, program user hanyalah kumpulan baris karakter alfanumerik. Pada saat program assembler dieksekusi, program tersebut membaca program user, menganalisanya, dan kemudian menghasilkan program bahasa mesin yang diinginkan. Bahasa mesin tersebut berisi pola 0 dan 1 yang menetapkan instruksi yang akan dieksekusi oleh komputer tersebut. Program user dalam format teks alfanumerik aslinya disebut source program, dan program bahasa mesin yang diassemble disebut object program. Bahasa assembly untuk suatu komputer mungkin case sensitive atau mungkin tidak, sehingga, komputer tersebut bisa membedakan antara huruf kapital dan huruf kecil atau tidak dapat. Kita akan menggunakan huruf kapital mark menunjukkan semua nama dan label dalam contoh kita untuk dapat meningkatkan kemudahan pembacaan teks. Misalnya, kita akan menuliskan instruksi Move sebagai berikut :

MOVE R0, SUM
MOVE mnemonic menyatakan pola biner, atau OP code, untuk operasi yang dilakukan oleh instruksi tersebut. Assembler mentranslasi rnnemonic ini menjadi OP code biner yang dipahatni komputer. Mnemonic OPcode diikuti oleh setidaknya satu karakter spasi kosong. Kemudian informasi yang menyatakan operand ditetapkan. Dalam contoh kita, source operand berada dalam register R0. Informasi ini diikuti oleh spesifikasi destination operand, dipisah dari source operand dengan koma, tanpa jeda kosong. Destination operand berada dalam lokasi memori yang alamat binernya dinyatakan dengan nama SUM.
Karena terdapat beberapa mode pengalamatan yang dapat digunakan untuk menetapkan lokasi operand, maka bahasa assembly barns mengindikasikan mode mana yang digunakan. Misalnya, nilai numerik atau nama yang digunakannya, seperti SUM pada instruksi sebelumnya, dapat digunakan untuk menunjukkan mode Absolute. Sehingga instruksi :
ADD #5, R3
menambahkan bilangan 5 ke isi register R3 dan meletakkan hasilnya kembali ke register R3. tanda sharp bukanlah cara satusatunya untuk menunjukkan mode pengalamatan Immediate. Dalam beberapa bahasa assembly, mode pengalamatan yang dimaksud dinyatakan dalam mnemonic OPcode.
Dalam hal ini, suatu instruksi memiliki mnonemonic OPcode yang berbeda untuk mode peugalamatan yang berbeda. Misalnya, iustruksi Add sebelumnya dapat ditulis sebagai berikut :
ADDI 5, R3
Akhiran I dalam mnemonic ADDI menyatakan bahwa source operand dinyatakan dalam mode pengalamatan Immediate. Pengalamatan Indirect biasanya dinyatakan dengan meletakkan tanda kurung di sekitar nama atau simbol yang menunjukkan pointer ke operand. Misalnya, jika nomor 5 ditempatkan dalam lokasi memori yang alamatnya disimpan dalam register R2, maka aksi yang diinginkan dapat ditetapkan sebagai berikut :
MOVE #5, (R2)
atau mungkin :
MOVE 5, (R2.