Tipe Data Dan Directive Pada MCS-51

| | Tidak ada komentar
Pada artikel ini akan dibahas tentang beberapa tipe data dan directive apa saja yang didukung oleh assembler dari keluarga 8051. Pada dasarnya, keluarga 8051 hanya memiliki 1 jenis tipe data, yaitu 8-bit. Ukuran dari setiap registernya adalah 8-bit. Jika ternyata data yang hendak diproses ternyata lebih besar dari 8–bit, maka programer harus memecah data menjadi beberapa data 8-bit agar dapat diproses oleh CPU.

DB (Define Byte)

Directive DB ini digunakan secara luas dalam proses assembly oleh assembler. Directive ini digunakan untuk mendefinisikan data 8-bit pada memori program. Saat DB digunakan untuk medefinisikan suatu data, maka data tersebut dapat berupa bilangan desimal, biner, hex, ataupun karakter-karakter ASCII. Untuk desimal, simbol "D" atau "d" setelah bilangan angka desimal boleh ditambahkan atau tidak. Walaupun demikian data desimal tersebut akan dikonversikan menjadi bilangan hex oleh assembler. Untuk mendefinisikan karakter ASCII, maka cukup mudah, yakni dengan menempatkan simbol tanda petik satu atau quotation mark, misalnya (‘seperti ini’). Kemudian assembler akan mengubah setiap karakter ASCII tersebut menjadi kode-kode hex seperti yang sudah diatur dalam format ASCII. Perhatikan beberapa contoh penggunaan DB dibawah ini:
        ORG  500H
DATA1:  DB   28                 ;DESIMAL (1C dalam hex)
DATA2:  DB   00110101B          ;BINER   (35 dalam hex)
DATA3:  DB   39H                ;HEKSADESIMAL
        ORG  510H
DATA4:  DB   "2591"             ;BILANGAN ASCII
        ORG  51BH
DATA5:  DB   "Bespus Community" ;KARAKTER ASCII
Baik tanda kutip tunggal ataupun ganda, keduanya dapat digunakan pada string ASCII. Hal ini akan berguna dalam kasus dimana sebuah string berisi tanda kutip tunggal, seperti "Al-Qur'an". DB juga dapat digunakan untuk mengalokasikan memori dalam byte-sized chunks.

ORG (Origin)

Directive ORG digunakan untuk mengindikasikan awal dari alamat. Artinya adalah kode berikutnya akan ditempatkan oleh assembler yang berawal pada alamat yang dideklarasikan oleh direcive ORG ini. Bilangan setelah simbol ORG ini boleh berbentuk desimal maupun hex. Jika bilangan ternyata tidak diikuti oleh symbol "h", maka nanti assembler akan merubahnya menjadi bentuk hex.

EQU (Equate)

Directive ini digunakan untuk mendefinisikan sebuah konstanta tanpa menuntut disediakannya sebuah lokasi memori. Biasanya simbol EQU ini digunakan sebagai data masukan langsung (immediate). Untuk lebih jelasnya dapat anda lihat pada contoh dibawah ini:
     COUNT  EQU 25
     ...    ...
     MOV    R3,#COUNT
Ketika menjalankan instruksi "MOV R3,#COUNT", register R3 akan diisikan dengan nilai 25 (perhatikan tanda #). Apa keuntungan dari penggunaan EQU? Asumsikan bahwa ada sebuah konstanta (nilai tetap) yang digunakan dibeberapa tempat dalam suatu program, dan suatu ketika programmer ingin mengubah nilai tersebut. Dengan menggunakan EQU, programer hanya harus mengubahnya sekali dibagian EQU saja dan assemblerlah yang akan mengubah seluruh konstanta yang bersangkutan tersebut.

Directive END

Pseudocode penting lainnya adalah directive END. Dimana directive ini akan memberitahukan kepada assembler bahwa disitulah akhir dari suatu program assembly 8051, yang berarti bahwa pada kode sumber jika terdapat kode lainnya setelah directive END maka akan diabaikan oleh assembler. Beberapa assembler menggunakan ".END" (dengan tanda titik) bukan "END".

Aturan Untuk Label Dalam Bahasa Assembly

Dalam memilih nama dari sebuah label, idealnya adalah nama yang sangat singkat namun penuh arti. Sehingga programmer dapat membuat program menjadi sangat mudah dan cepat. Ada beberapa aturan yang harus programer ikuti. Pertama adalah Setiap Label (atau simbol) haruslah unik (tidak sama). Karakter yang boleh digunakan untuk label bisa terdiri dari huruf abjad, angka 0 s/d 9, dan karakter khusus seperti tanda tanya (?), titik (.), at (@), garis bawah (_), dan tanda dollar ($). Namun karakter pertama dari nama label harus berupa huruf abjad, dengan kata lain tidak boleh berupa angka. Setiap assembler memiliki beberapa kata "reserved" yang tidak boleh digunakan sebagai label dalam program. Terutama adalah kata-kata yang telah digunakan untuk instruksi mnemonic, seperti "MOV" dan "ADD". Selain mnemonic, ada beberapa kata lain yang tidak boleh digunakan. Untuk lebih jelasnya, periksalah kembali assembler yang anda gunakan.

Sumber:
1. Mazidi, Muhammad Ali., The 8051 Microcontroller and Embedded Systems - Using Assembly and C.

Program Counter dan Ruang ROM Pada MCS-51

| | Tidak ada komentar
Pada artikel ini akan dijelaskan tentang register Program Counter (PC) dalam proses menjalankan perintah pada program 8051. Disini juga akan dibahas tentang ruang (space) ROM untuk berbagai variant dari keluarga 8051.

Program Counter Pada 8051

Regsiter 8051 penting lainnya adalah PC (Program Counter). Program Couter adalah penunjuk lokasi alamat selanjutnya yang hendak dijalanakan. Setelah CPU membaca program dari ROM program, program Counter kemudian di-increment (ditambah satu bilangan) yang berarti menunjuk pada alamat byte selanjutnya dalam ROM Porgram. Program Counter pada 8051 termasuk ke dalam register 16-bit. Artinya 8051 dapat mengakses program mulai dari alamata 0000 s/d FFFFh, sehingga totalnya adalah 64 Kbytes. Namun tidak semua variant keluarga 8051 memiliki ROM program sebanyak itu di dalam chip-nya. Beberapa diantaranya hanya memiliki 2 Kbytes atau bahkan tidak sama sekali sehingga membutuhkan ROM program tambahan eksternal.

Mulai Dari Mana 8051 Bekerja Saat Pertama Dihidupkan

Pertanyan yang harus kita tanyakan mengenai setiap mikrokontroler (mikroprosesor) adalah pada lokasi mana dari ROM program, sebuah CPU mememulai tugas-tugasnya saat kita mulai menyalakannya. Setiap mikroprosesor berbeda-beda, namun pada keluarga 8051 siapapun pabrik pembuat atau penjualnya, lokasi pertama yang dijalankan oleh 8051 saat pertama dihidupkan adalah lokasi 0000. Menghidupkan atau menyalakan yang dimaksudkan disini adalah dengan memeberikan tegangan sebesar Vcc pertama kali sesuai kebutuhan pin Vcc mikrokontroler tersebut. Atau penerapan perubahan kondisi pin Reset pada mikrokontroler. Dengan kata lain, saat 8051 pertama dihidupkan Program Counter akan selalu bernilai 0000. Yang berarti bahwa pada lokasi ini opcode pertama akan dijalankan. Untuk alasan inilah setiap program dalam 8051 harus dimulai dari lokasi 0000 dan dituliskan ke dalam ROM program juga dimulai dari alamat 0000. Kita dpat memastika agar assembler memulai penyusuan kode program dari alamat tersebut dengan memberikan direvative ORG dalam program kita.

Menempatkan Program Dalam ROM Program

Untuk lebih memahami tentang peran Program Counter dalam mengambil dan mejalankan sebuah program, kita akan mengkaji aksi dari Program Counter ini. Pertama, kita mengkaji sekali lagi file List dari program contoh pada artikel sebelumnya dan melihat bagaiaman kode tersebut ditempatkan pada ROM yang terdapat dalam chip 8051. Seperti yang kita lihat, bahwa opcode dan operand untuk setiap instruksi ditampilkan pada bagian sebelah kiri file tersebut.
0000               ORG   0H       ;Mulai program di alamat 0
0000  7D25         MOV   R5,#25H  ;Isikan 25H ke dalam R5
0002  7F34         MOV   R7,#34H  ;Isikan 34H ke dalam R7
0004  7400         MOV   A,#0     ;Isikan 0 ke dalam A
0006  2D           ADD   A,R5     ;Jumlahkan isi R5 dengan A (A=A+R5)
0007  2F           ADD   A,R7     ;Jumlahkan isi R7 dengan A (A=A+R7)
0008  2412         ADD   A,#12KH  ;Jumlahkan A dengan 12H (A=A+12H)
000A  80FE  HERE:  SJMP  HERE     ;Program berputar disini
000C               END            ;Akhir dari file sumber
Setelah program ditulis (burned) ke dalam ROM internal pada keluarga 8051 (misalnya AT89C51 atau DS5000), Opcode dan operand ditempatkan pada lokasi memori ROM yang beralamat 0000 seperti yang terlihat pada daftar dibawah ini.

Alamat ROM, opcode, dan assembly

Alamat dan opcodeDaftar tersebut menunjukkan alamat 0000 berisi 7D, dimana opcodenya adalah untuk mengisikan sebuah nilai ke register R5, dan alamat 0001 berisi operand (dalam daftar, terlihat 25h) yang diisikan ke dalam R5. Sehingga instruksi "MOV R5,#25h" memiliki kode mesin "7D25" dimana 7D adalah opcode dan 25 adalah operand. Hal yang sama juga terlihat pada kode mesin 7F34 yang berlokasi di alamat 0002 dan 0003, dimana ini merupakan representasi dari instruksi "MOV R7,#34h". Termasuk juga untuk kode mesin 7400 yang berada pada alamat 0004 dan 0005 adalah representasi dari instruksi "MOV A,#0". Lokasi memori 0006 memiliki opcode 2D, dimana itu adalah opcode untuk instruksi  "ADD  A,R5" dan lokasi memori 0007 berisi 2F yang merupakan opcode untuk instruksi "ADD A,R7". Opcode dari intstruksi "ADD A,#12h" berlokasi pada alamat 0009. memory lokasi 000A berisi opcode dari instruksi SJMP. Sedangkan alamat target dari opcode SJMP tersebut berada pada alamat 000B.

Menjalankan Program Byte Demi Byte

Anggaplah program di atas telah ditulis ke dalam ROM dari Chip 8051, berikut ini adalah penjelasan langkah-langkah dari kejadian dalam 8051 setelah catu daya dipasang.
  1. Ketika 8051 dinyalakan, PC (Program Counter) memiliki nilai 0000 dan mulai membaca opcode pertama, yaitu 7D, dimana kode tersebut berarti mengisikan operand ke dalam R5. Setelah menjalankan opcode tersebut, CPU dengan bantuan PC kembali membaca lokasi ROM program berikutnya, yaitu  25, dan selanjutnya menjalankan tugasnya yakni memindahkan nilai 25 pada R5. Sekarang 1 instruksi sudah selesai. Selanjutnya Program Counter di-increment ke lokasi opcode berikutnya (ke alamat 0002). PC = 0002, dimana berisi opcode 7F, yang berarti opcode untuk instruksi "MOV R7,…".
  2. Setelah menjalankan opcode 7F, nilai 34h lalu dipindahkan ke register R7. Kemudian Program Counter di-increment ke 0004.
  3. Alamat ROM 0004 berisi opcode untuk instruksi "MOV A,#0". Instruksi ini dijalankan dan sekarang PC bernilai 0006. Perlu diingat, bahwa instruksi diatas merupakan instruksi 2-byte, yang berarti instruksi tersebut menempati dua alamat memori.
  4. Sekarang PC = 0006 yang menunjuk pada alamat opcode dari instruksi "MOV ADD A,R5". Ini adalah instruksi 1-byte. Setelah menjalankan instruksi ini, PC bernilai 0007.
  5. Alamat 0007 berisi opcode 2F, dimana opcode ini adalah milik instruksi "ADD A,R7". Ini juga termasuk dalam instruksi 1-byte. Setelah CPU menjalankan instruksi tersebut, maka PC akan di-increment lagi menjadi 0008. Hal ini terus terjadi sampai semua instruksi dilaksanakan. Faktanya bahwa PC berisi lokasi alamat dari instruksi yang akan dieksekusi. Hal tersebutlah yang menyebabkan mengapa mikroprosesor sekelas X86 menyebut program counter ini sebagai instruction pointer.

Peta Memori ROM Pada Keluaraga 8051

Seperti yang kita ketahui, beberapa dari keluarga 8051 memiliki jumlah ROM program internal hanya sebesar 4Kb, seperti 8751 dan AT89C51. Beberapa di antaranya memiliki ukuran yang lebih besar, misalnya AT89C52 yang memiliki ROM program sebanyak 8Kb. Dallas Semiconductor’s DS5000-32 memiliki ROM program internal sebesar 32Kb, ada pula yang memiliki ukuran sebesar 64Kb. Perlu diingat, karena PC pada keluarga 8051 selebar 16-bit, maka jumlah memori Program ataupun data yang bisa dialamati hanya sampai sebatas 64Kb.

Gambar rentang alamat ROM pada chip 8051
Gambar rentang alamat ROM pada chip 8051

Sumber:
1. Mazidi, Muhammad Ali., The 8051 Microcontroller and Embedded Systems - Using Assembly and C.

Assembling dan Menjalankan Program MCS-51

| | Tidak ada komentar
Bentuk dasar dari program bahasa assembly telah dibahas pada artikel sebelumnya, pertanyaan berikutnya adalah: Bagaimana itu dibuat, dirakit, dan siap untuk dijalankan? Langkah-langkah untuk membuat program bahasa assembly yang siap untuk dijalankan akan diuraikan sebagai berikut:

Diagram langkah-langkah membuat sebuah program
Diagram langkah-langkah membuat sebuah program
  1. Pertama kita harus menggunakan sebuah editor untuk mengetik program. Banyak program editor atau pemrosesan kata yang tersedia untuk digunakan dalam membuat dan/atau mengedit sebuah program. Editor yang banyak digunakan adalah program MS-DOS EDIT (atau Notepad pada Windows), dimana tersedia dalam semua sistem operasi microsoft. Perlu diperhatikan bahwa editor harus mampu menghasilkan file ASCII. Bagi kebanyakan assembler, nama file biasanya mengikuti konvesi DOS, namun file sumber memiliki ekstensi "asm" atau "src" tergantuk dari assembler yang anda gunakan. Periksa assembler anda untuk konvesi ini. Ekstensi "asm" pada file sumber digunakan oleh assembler untuk langkah berikutnya. Ada beberapa editor yang dirancang khusus untuk menulis program bahasa assembly 8051, salah satunya adalah MIDE-51 keluaran OpCUBE. Editor ini menurut saya sudah cukup baik karena telah dilengkapi oleh syntax highlighter yang dapat memudahkan kita dalam menulis sebuah program.
  2. File sumber "asm" yang berisi kode program yang dibuat pada langkah pertama kemudian  diserahkan ke assembler 8051. Assembler akan mengubah instruksi-intruksi dalam file tersebut kedalam kode mesin. Assembler akan menghasilkan file objek dan file list. Ekstensi untuk file objek adalah "obj", sedangkan ekstensi untuk file list adalah "lst". Sebagai pilihan, anda dapat menggunakan program assembler ASEM-51 buatan W.W.Heinz atau ASM51 buatan intel.
  3. Assembler memerlukan langkah ketiga yang disebut linking. Program link mengambil satu atau lebih file objek dan akan menghasilkan file objek absolut dengan ekstensi "abs". Umumnya file abs ini digunakan untuk latihan, jika kita memiliki program monitor.
  4. Selanjutnya, file "abs" dimasukkan ke dalam program yang disebut "OH" (konverter dari objek ke hex), dimana akan menghasilkan sebuah file berekstensi "hex" yang siap untuk di-burn ke dalam ROM. Program ini terdapat pada semua assembler 8051. Program assembler yang berbasiskan windows dimasa sekarang telah menggabungkan langkah 2 sampai 4 menjadi satu langkah saja.

Lebih Jauh Tentang File "asm" dan "obj"

File "asm" dapat disebut juga sebagai file source (sumber), dan untuk alasan inilah beberapa assembler juga mendukung extensi "src". Periksa assembler 8051 anda untuk melihat ekstensi yang dibutuhkan. Seperti yang disebutkan sebelumnya, file ini dibuat dengan editor seperti DOS EDIT, Windows Notepad, atau editor lainnnya. Assembler 8051 mengubah file asm intruksi bahasa assembly tersebut ke bahasa mesin dan menghasilkan file obj (object). Selain membuat file objek, assembler juga menghasilkan file lst (file list).

File List "lst"

File Lst (List) adalah tambahan, namun bagaimanapun juga file tersebut sangat penting karena file tersebut mendaftar setiap opcode yang telah dibuat oleh assembler, termasuk alamat-alamatnya, dan termasuk pemberitahuan jika ada kesalahan dalam penulisan program. Beberapa Assembler tidak otomatis mebuatkan file lst tersebut untuk kita, dan membutuhkan perintah tambahan dalam DOS Command Promt saat menjalankan assembler yang bersangkutan. Namun untuk program assembler ASM51 buatan Intel atau ASEM-51 buatan W.W.Heinz sudah otomatis membuatkan file lst ini. File tersebut sangat penting bagi programer untuk melihat setiap baris syntax yang dituliskan apa sudah benar atau tidak. Termasuk dapat melihat alamat setiap opcode dengan jelas. Dibawah ini merupakan contoh file lst dari sebuah program.
0000               ORG   0H       ;Mulai program di alamat 0
0000  7D25         MOV   R5,#25H  ;Isikan 25H ke dalam R5
0002  7F34         MOV   R7,#34H  ;Isikan 34H ke dalam R7
0004  7400         MOV   A,#0     ;Isikan 0 ke dalam A
0006  2D           ADD   A,R5     ;Jumlahkan isi R5 dengan A (A=A+R5)
0007  2F           ADD   A,R7     ;Jumlahkan isi R7 dengan A (A=A+R7)
0008  2412         ADD   A,#12KH  ;Jumlahkan A dengan 12H (A=A+12H)
000A  80FE  HERE:  SJMP  HERE     ;Program berputar disini
000C               END            ;Akhir dari file sumber

Sumber:
1. Mazidi, Muhammad Ali., The 8051 Microcontroller and Embedded Systems - Using Assembly and C.