Bahasa MesinSetiap jenis CPU (Central Processing Unit) atau dikenal juga sebagai mikroprosesor, hanya dapat mengerti atau menterjemahkan setiap bahasa mesin yang dimilikinya. Artinya setiap CPU telah dilengkapi perangkat intruksi (instructions set) yang dimilikinya. Menyusun program dengan perangkat instruksi pada CPU tertentu disebut dengan program bahasa mesin (machine language). Instruksi-instruksi dalam bahasa mesin adalah bilangan-bilangan yang merupakan kode mesin disimpan dalam memori. Setiap instruksi akan memiliki kode numerik yang unik disebut sebagai kode operasi (operation code) atau disingkat sebagai opcode. Instruksi pada Prosesor 80x86 memiliki variasi ukuran. Opcode selalu berada pada awal setiap instruksi. Beberapa instruksi juga diikuti dengan data (seperti konstanta atau alamat) digunakan oleh instruksi. Bahasa mesin sangat sulit diprogram secara langsung. Menterjemahkan maksud/arti dari instruksi yang berupa kode numerik bagi manusia sangat membosankan untuk dihapalkan atau dimengerti maksudnya. Sebagai contoh, instruksi katakan untuk menambah isi dari register EAX dan EBX dan hasilnya disimpan kembali dalam register EAX dikodekan oleh kode heksa: 03 CE. Program bahasa mesin yang merupakan kumpulan kode operasi disimpan dalammemori CPU untuk selanjutnya dieksekusi satu persatu sehingga membentuk program secara utuh. Bahasa AssemblyTidak seperti halnya bahasa mesin yang merupakan kumpulan kode operasi yang berupa kode numerik yaitu kode heksa, yang sangat sulit untuk diingat atau dimengerti. Penulisan program bahasa assembly disimpan sebagai teks seperti halnya bahasa pemrograman aras tinggi. Setiap instruksi assembly kenyataannya mewakili satu instruksi bahasa mesin. Sebagai contoh, instruksi penjumlahan yang telah diuraikan sebelumnya akan mewakili bahasa assembly berikut ini: add eax, ebx Instruksi ini akan lebih bisa dimengerti daripada kode mesin. Instruksi add adalah sebuah mnemonic untuk instruksi penjumlahan. Bentuk secara umum dari sebuah instruksi assembly adalah: mnemonic operand(s) Assembler adalah sebuah program yang membaca file teks dari instruksi assembly dan dikonversi menjadi kode mesin. Kompiler adalah program juga melakukan pengkonversian namun untuk bahasa tingkat tinggi. Assembler lebih sederhana daripada kompiler. Setiap perintah bahasa assembly secara langsung mewakili satu instruksi mesin. Perintah bahasa tingkat tinggi lebih komplek dan memerlukan banyak instruksi mesin. Perbedaan penting lainnya antara assembly dan bahasa tingkat tinggi adalah, bahwa setiap perbedaan jenis CPU akan memiliki instruksi mesin tersendiri juga akan memiliki bahasa assembly tersendiri pula. Porting (maksudnya: peng-adaptasi-an) program assembly ke berbagai jenis arsitektur komputer sangatlah sulit jika dibandingkan dengan bahasa pemrograman beraras tinggi (high level language). Dalam pembahasan selanjutnya digunakan Netwide Assembler atau disingkat NASM. NASM tersedia secara gratis di internet. Yang sering digunakan adalah Microsoft's Assembler (MASM) atau Borland's Assembler (TASM). Terdapat perbedaan sintak untuk MASM/TASM dan NASM. Operand sebuah InstruksiInstruksi bahasa mesin memiliki sejumlah variasi dan jenis operand; akan tetapi, secara umum, setiap instruksi itu sendiri akan memiliki sejumlah operand yang telah ditetapkan (0 sampai 3). Jenis-jenis operand yang ada adalah sebagai berikut:
Operand ini merupakan nilai yang tetap yang diperlihatkan dalam instruksi itu sendiri, disimpan dalam instruksi itu sendiri (dalam segmen kode), tidak dalam segmen data.
Operand ini tidak ditunjukkan secara ekplisit. Sebagai contoh, instruksi menaikkan (increment) adalah menaikkan satu isi dari sebuah register atau memori. Ini salah satu dari implikasi (implied). Instruksi DasarSebagian besar instruksi dasar adalah instruksi MOV. Instruksi ini memindahkan data dari salah satu lokasi ke lokasi lainnya, seperti operator assignment dalam bahasa pemrograman beraras tinggi. Terdiri dari dua operand: mov dest, src Data yang dispesifikasikan oleh src disalin ke dest. Satu pembatasan adalah bahwa keduanya tidak diperbolehkan operand memori, artinya tidak dapat memindahkan data dari memori ke memori. Hal ini ini ke luar ciri-ciri dari assembly. Sedikit banyak terdapat aturan yang harus diikuti tentang bagaimana cara variasi instruksi digunakan. Operand harus memiliki ukuran yang sama. Nilai register AX tidak dapat disimpan dalam register BL. Ukuran dari register AX adalah pasangan register sebesar 32bit, sedangkan BL ukurannya 16bit untuk mikroprosesor 80486. Sebagai contoh: mov eax, 3 ; store 3 into EAX register (3 is immediate operand) mov bx, ax ; store the value of AX into the BX register Tanda semikolon ';' merupakan tanda awal untuk penulisan komentar. Instruksi ADD digunakan untuk operasi penjumlahan integer: add eax, 4 ; eax = eax + 4
add al, ah ; al = al + ah Instruksi SUB merupakan instruksi pembagian secara integer: sub bx, 10 ; bx = bx - 10
sub ebx, edi ; ebx = ebx - edi Instruksi INC dan DEC adalah instruksi penaikan (increment) atau penurunan (decrement) dengan nilai satu. Ini adalah salah satu dari operan secara implisit, kode mesin untuk INC dan DEC adalah kecil ukurannya dibanding dengan instruksi ADD dan SUB. inc ecx ; ecx++ dec dl ; dl-- Pengarahan (Directive)Directive merupakan sebuah artifak assembler bukan CPU. Secara umum digunakan untuk menginstruksikan assembler untuk melakukan sesuatu atau menginformasikan tentang sesuatu ke assembler. Directive tidak diubah kedalam kode mesin. Penggunaan umum dari directive adalah:
Pelolosan kode NASM melalui sebuah perintah (command) preprosesor (preprocessor) seperti C. Begitu pula, pengarahan preprosesor (directive preprocessor) dimulai dengan % dibandingkan # dalam C. Pengarahan EQUPengarahan EQU dapat digunakan untuk mendefinisikan sebuah simbol. Simbol adalah nama dari konstanta yang dapat digunakan dalam program assembly. Formatnya adalah: simbol equ nilai Nilai dari simbol tidak dapat didefinisikan secara berulang (didefinisikan kembali). Pengarahan %definePengarahan ini adalah sama dengan pengarahan #define dalam C. Ini secara umum digunakan untuk mendefinisikan mkro konstan seperti dalam C. %define SIZE 100 mov eax, SIZE Kode di atas mendefinisikan sebuah makro dengan nama SIZE sebagai konstanta 100 dan ditunjukkan penggunaannya dalam instruksi. Makro sangat fleksibel daripada simbol dalam dua cara. Makro dapat didefinisikan kembali dan bisa lebih dari sekedar bilangan konstan. Pengarahan Data Pengarahan data digunakan dalam segmen data untuk mendefinisikan ruang memori. Terdapat dua cara menyiapkan ruang memori. Cara pertama, hanya mendefinisikan ruang untuk data; cara kedua mendefinisikan ruang dan nilai awal. Metode pertama menggunakan satu dari pengarahan RESX. X diganti dengan huruf sebagai ukuran dari obyek (atau beberapa obyek) yang akan disimpan. Berikut ini ditunjukkan beberapa kemungkinan nilai itu.
Metode kedua (mendefinisikan sebuah nilai awal) menggunakan satu dari pengarahan DX. Huruf X adalah sama dengan pengarahan RESX. Hal ini sangat umum untuk menandai lokasi memori dengan label. Label merupakan salah satu cara mudah untuk mengarahkan lokasi memori dalam kode. Berikut ini terdapat beberapa contoh:
Tanda "..." dan '...' adalah sama perlakuannya. Konsekwensinya data yang didefinisikan disimpan secara berurutan dalam memori. Dengan demikian L2 disimpan secara seketika sesuada L1 dalam memori. urutan dari memori dapat didefinisikan juga.
Untuk urutan yang sangat besar, pengarahan TIMES dalam NASM seringkali digunakan. Pengarahan ini mengulang sejumlah operand spesifik, sebagai contoh:
Ingat bahwa label dapat digunakan untuk mengarahkan ke data dalam kode. Terdapat dua cara bahwa sebuah label dapat digunakan. Jika label akan digunakan, label akan diinterprestasikan sebagai alamat (atau offset) dari data. Jika label diletakkan dalam kurung kotak ([...]), akan diinterprestasikan sebagai data pada alamat yang ditunjukkan oleh label. Dalam bentuk yang lain, salah satu yang harus diingat bahwa sebuah label adalah sebagai pointer data pada alamat tertentu dan kurung kotak direferensikan sebagai pointer seperti halnya araterisk (*) dalam C. (MASM/TASM memiliki perbedaan konvensi). Dalam mode 32bit, pengalamatannya adalah 32bit. Berikut ini terdapat beberapa contoh:
Label yang digunakan dalam contoh di atas merupakan label yang diberikan dalam contoh sebelumnya. Baris 7 dari contoh di atas menunjukkan sebuah properti yang penting untuk NASM. Assembler tidak dapat menangkap dari jenis data yang ditunjukkan oleh label tersebut. Ini tergantung pada programmer untuk membuat suatu kepastian bahwa penggunaan sebuah label harus benar. Selanjutnya hal ini secara umum untuk menyimpan alamat dari sebuah data dalam register dan menggunakan register seperti halnya pointer dalam variabel C. Lagi, tidak ada pengecekan yang dilakukan bahwa sebuah pointer digunakan secara benar. Cara ini, assembly akan lebih banyak menghasilkan error daripada C. Instruksi berikutnya adalah: mov [L6], 1 ; simpan (store) 1 byte ke memori yang ditunjukkan oleh label L6 Pernyataan tersebut menghasilkan sebuah operasi dengan ukuran yang tidak salah (error), mengapa ?. Sebab assembler tidak mengetahui apa yang akan disimpan (store) sebagai 1 byte, word atau double word. Untuk memperbaiki ini, tambahkan sebuah spesifikasi ukuran: mov dword [L6], 1 ; simpan (store) 1 byte ke memori yang ditunjukkan oleh label L6 Hal ini akan mengatakan ke assembler untuk menyimpan 1 byte ke double word yang dimulai dengan alamat yang ditunjukkan oleh label L6. Spesifikasi ukuran lainnya adalah: BYTE, WORD, QWORD and TWORD. Input and OutputInput dan output merupakan aktifitas yang sangat bergantung dengan sistem. Hal ini merupakan antarmuka denga perangkat keras sistem. Bahasa tingkat tinggi, seperti C, dilengkapi dengan pustaka (library) standar berupa rutin-rutin program yang dapat diperoleh secara sederhana, programming membentuk antarmuka I/O. Bahasa assembly tidak memiliki library standar. C harus secara langsung mengakses perangkat keras (melalui operasi pengijinan dalam mode protect) atau menggunakan rutin beraras rendah yang diperoleh dalam sistem operasi. Sangat umum rutin assembly di-antarmuka-kan dengan C. Salah satu keuntungannya bahwa kode assembly dapat digunakan sebagai library standar C untuk rutin I/O. Selanjutnya, salah satu yang harus diketahui adalah aturan untuk meloloskan informasi rutin dengan informasi yang digunakan C. Aturan ini sangat komplek untuk dijelaskan disini (akan dijelaskan pada pembahasan berikutnya). Untuk menyederhanakan I/O, digunakan rutin yang siap dipakai untuk menyembunyikan aturan-aturan C yang komplek dan akan diperoleh cara antarmuka yang sangat sederhana. Berikut ini diuraikan fungsi setiap rutin yang dapat anda peroleh disini.
Seluruh rutin menyediakan nilai dari seluruh register, kecuali rutin read. Rutin ini memodifikasi nilai yang ada dalam register EAX. Untuk menggunakan rutin ini, harus menyertakan file rutin dalam program dengan pengarahan preprosesor %include yang akan menginformasikan ke assemble mengenai penggunaan file rutin tersebut. Berikut ini harus ditambahkan ke program assembly anda sebelum menggunakan rutin: %include "asm_io.inc" Untuk menggunakan salah satu rutin print, terlebih dahulu muati register EAX dengan nilai yang benar dan gunakan instruksi CALL untuk mengakses rutin. Instruksi CALL adalah sama dengan sebuah pemanggilan fungsi dalam bahasa pemrograman beraras tinggi. Selanjutnya akan melompat mengeksekusi ke bagian kode yang lainnya, tetapi akan kembali ke asalnya sesudah rutin selesai dieksekusi. |
http://fpga.songolimo.net/kuliah-1/bahasa-assembly/pengantar-bahasa-assembly
1 komentar:
menurut anda cara dasar u jadi pemrogram harus di mulai dari mana dlu apakah belajar syntax,c++,biner,assembly, dll manakah yg harus di pelajari lebih dulu!!
Posting Komentar