P. 1
77211904 Pemrograman Dengan Bahasa Assembler 8051

77211904 Pemrograman Dengan Bahasa Assembler 8051

|Views: 3|Likes:
Published by Sigit Santoso

More info:

Published by: Sigit Santoso on Mar 28, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

07/20/2014

pdf

text

original

Pemrograman dengan Bahasa Assembler 8051

Nama : Okto Duapan Simanullag NPM : 10408639 Kelas : 4IB 02

FAKULTAS TEKNOLOGI INDUSTRI JURUSAN TEKNIK ELEKTRONIKA UNIVERSITAS GUNADARMA BEKASI 2011

Pemrograman dengan Bahasa Assembler 8051

Instruksi MOV Singkatnya instruksi MOV adalah menyalin isi data dari register yang satu ke register yang lain, dengan format sebagai berikut : MOV dest, source ;salin data source ke dest Instruksi ini memerintahkan pada CPU untuk memindahkan (sebenarnya adalah menyalin) operand source menuju operand destination.Seperti contohnya, "MOV A,R0" adalah menyalin isi R0 ke register A. Setelah instruksi ini dijalankan isi dari kedua register tersebut adalah sama. Instruksi MOV tidak mengubah isi dari operand Source. Program berikut ini adalah contoh untuk mengubah Akumulator menjadi 55h (h adalah hex), lalu kemudian memindahkan nilainya kedalam beberapa register dalam CPU. Perhatikan tanda "#" dalam instruksi tersebut. Hal itu mengindikasikan bahwa simbol dibelakangnya adalah sebuah nilai. Hal tersebut akan kita bahas segera. MOV A,#55 ;Mengisi A dengan nilai 55h MOV R0,A ;Salin isi A ke dalam R0 ;Sekarang R0 = 55h MOV R1,A ;Salin isi A ke dalam R1 ;Sekarang R1 = 55h MOV R2,A ;Salin isi A ke dalam R2 ;Sekarang R2 = 55h MOV R3,#95h ;Mengisi R3 dengan nilai 95h ;Sekarang R3 = 95h MOV A,R3 ;Salin isi R3 ke dalam A ;Sekarang A = 95h Saat menulis program untuk mikrokontroller 8051, hal-hal berikut ini harus diperhatikan. 1. Bahwa sebuah nilai dapat langsung diberikan pada register-register misalnya A, B, R0 s/d R7. Namun bagaimanapun juga untuk mengindikasikan bahwa sebuah simbol adalah sebagai sebuah nilai, dan bukan sebagai alamat atau yang lain, sebelumnya harus diberi simbol pound ataupagar atau "#". MOV MOV MOV MOV A,#23h R0,#12h R1,#1Fh R2,#2Bh ;Mengisi A dengan nilai 23h ;Mengisi R0 dengan nilai 12h ;Mengisi R1 dengan nilai 1Fh ;Mengisi R2 dengan nilai 2Bh

MOV MOV MOV MOV

B,#3Ch R7,#9Dh R6,#0F9h R5,#12

;Mengisi R3 dengan nilai 3Ch ;Mengisi R3 denga nilai 9Dh ;Mengisi R3 denga nilai F9h ;Mengisi R3 denga nilai 12 desimal

Perhatikan pada instruksi "MOV R5,#0F9h" sebelum simbol F nampak di sana diimbuhi oleh simbol "0" sehingga menjadi "0F9h". Hal ini penting bagi assembler untuk membedakan apakah sebuah symbol yang dituliskan itu sebagai sebuah angka bilangan atau sebuah identifier. Sedang identifier harus selalu dimulai dari karakter alphabeth. 2. Jika nilai 0 s/d F kita isikan pada sebuah register 8-bit, maka akan mengubah 4-bit paling kecil dari register tersebut. Dan kita akan mendapatkan 4-bit teratas darinya akan dibuat menjadi 0. Misalnya dengan instruksi "MOV A,#5", maka sejatinya instruksi tersebut adalah sama dengan "MOV A,#05h", dan menghasilkan A = 05h. Dan dalam bilangan biner adalah A = 00000101 biner. 3. Mengisikan sebuah nilai yang terlalu besar dari nilai yang sanggup ditampung sebuah register akan menghasilkan error. MOV A,#7F2h ; 7F2h > (8-bit atau FFh atau 255 desimal) MOV R2,#456 ; 456d > (8-bit atau FFh atau 255 dec) 4. Untuk mengisikan nilai ke dalam register, kita harus mengimbuhkan symbol pound (#). Jika tidak ada simbol tersebut, maka assembler akan menganggapnya sebagai sebuah lokasi memory. Ambil contoh "MOV A,17h" yang berarti pindahkan isi nilai dari memory 17h ke dalam A. Sedang saat kita menginginkan untuk mengisi A dengan nilai 17h, maka kita harus menuliskan dengan "MOV A,#17h". Tidak adanya symbol pagar tersebut tidak akan membuat assembler menghasilkan error. Namun Assembler akan membuatkan kode yang bukan seperti kemauan kita, hanya karena kesalahan kecil kita dalam menulis program. Biasanya hal ini biasa terjadi bagi para pemula.

Instruksi ADD Instruksi ADD adalah berdasar pada format : ADD A,Source ;Tambahakan source ke Akumulator

Instruksi ini menambahkan sembarang tipe data ke dalam A dan A pula bertindak sebagai penerima hasil dari operasi. Sehingga dapat dikata operand tujuan (Dest) selalu adalah Akumulator (A). Di bawah ini contohnya…

MOV A,#25h ;Isi A dengan nilai 25h MOV R2,#34h ;Isi R2 dengan nilai 34h ADD A,R2 ;Tambahakan keduanya ;Jadi A = A + R2 Menjalankan program di atas akan menghasilkan A = 59h (25h + 34h = 59h) dan nilai pada R2 tidak berubah setelah instruksi ADD, yakni 34h. Sekali lagi operand source tidak akan berubah. Program di bawah ini adalah contoh program yang lebih kompleks. MOV MOV MOV ADD R5,#25h ;Isi R7 dengan nilai 25h R7,#34h ;Isi R5 dengan nilai 34h A,#0 ;Clear isi A menjadi 0 A,R5 ;Tambahakan A dengan isi R5 ;Jadi A = A + R5 ADD A,R7 ;Tambahakan A dengan isi R7 ;Jadi A = A + R7 Program di atas menghasilkan nilai 59h yang terdapat pada A. Ada banyak jalan menuju Roma, namun sedapat mungkin cari jalan yang paling singkat dan cepat. Ini adalah cara lebih cepat. MOV A,#25h ADD A,#34h ;Isi A dengan nilai 25h ;Tambahakan A dengan 34h

Sekali lagi dapat kita lihat dari berbagai contoh di atas operand tujuan selalu adalah A. Jika kita memaksa menuliskan kode seperti "ADD R2,A" tentu akan menghasilkan error. 8051 memang hanya mendukung operasi arimatika dan logika yang hanya menggunakan A sebagai akumulator, dan dengan kata lain operasi tersebut dibatasi selebar 8-bit. Namun walaupun demikian hal itu sudah lebih dari cukup untuk membuat program untuk berbagai aplikasi canggih, misalnya robot. Kita tahu bahwa 8051 juga memiliki 2 buah register 16-bit, walaupun dirancang bukan untuk keperluan manipulasi data. Namun jika anda bertanya apakah CPU 8051 dapat memanipulasi data yang lebih besar dari 8-bit?? Tentu saja, tidak ada hal yang tidak mungkin. Seperti yang sudah kita ketahui sebelumnya bahwa komputer 8-bit, idealnya hanya memproses data sampai selebar 8-bit. Dalam kasus tertentu beberapa perintah dalam 8051 dapat diurutkan untuk dapat menangani data yang lebih besar, seperti data 16-bit, 24-bit, maupun 32-bit. Semua bisa dilakukan. Tentu dengan memecah data tersebut dalam beberapa data 8-bit,dan kemudian memprosesnya satu-persatu kemudian menyatukan kembali data sehingga seperti hasil yang kita inginkan. Dalam prakteknya hal itu bisa dilakukan dengan membuat kode-kode yang rumit dan teliti.

Struktur dari bahasa assembly Program bahasa assembly terdiri dari beberapa bagian. Setiap instruksi diungkapkan dalam satu baris kode. Setiap instruksi terdiri dari mnumonic, dan kadang ditambahkan 1 atau 2 operand. Operand adalah data yang hendak dimanipulasi. Dan mnumonic itulah yang meninstruksi-kan CPU untuk melakukan sesuatu terhadap operand.

Program 2.1 Contoh program dalam bahasa Assembly ORG 0 ;Mulai program dari alamat 0000 MOV R5,#25h ;Isikan 25h pada R5 MOV R7,#34h ;Isikan 34h pada R7 MOV A,#0 ;buat A = 0 ADD A,R5 ;Tambahkan isi R5 ke dalam A ;sehingga A = A + R5 ADD A,R7 ;Tambahkan isi R7 ke dalam A ;sehingga A = A + R5 ADD A,#12h ;Tambahkan 12h ke dalam A TUNGGU: SJMP TUNGGU berputar di sini END ;program selesai dan

Program dalam bahasa assembly yang dicontohkan di atas adalah statement yang berurutan, di mana terdiri dari instruksi misalnya ADD dan MOV, dan beberapa statement lain, yang disebut dengan Directive. Setiap instruksi, adalah memerintahkan CPU untuk melakukan sesuatu hal, sedang directive ( juga disebut dengan psuedo-instruction) memberikan arahan bagi assembler cara menterjemahkan kode di belakang ungkapan directive tersebut. Ambil contoh, intstruksi MOV dan ADD adalah sebuah perintah, sedang ORG dan END adalah directive (petunjuk arahan) bagi assembler. ORG dalam contoh diatas meminta kepada Assembler bahwa opcode

selanjutnya agar ditempat dalam memory lokasi 0, sementara END adalah untuk memberitahukan assembler akhir dari program, dan mengabaikan setiap text di bahwa END. Pada prinsipnya instruksi bahasa assembly terdiri dari 4 bagian : [label] mnumonic [operand] [;komentar] tanda kurung diatas (bracket) adalah menunjukkan bagiannnya, agar anda bisa lebih jelas, dan bukan dimasukkan dalam kode yang sebenarnya. Adapun penjelasannya adalah sebagai berikut ini : 1. Bagian Label adalah sebuah identifier yang merujuk padaa lokasi opcode. Dengan kata lain nilai dari Label ini adalah relatif, dan ditentukan saat proses kompilasi. Berbeda dengan identifier lain yang nilainya harus ditentukan dengan expresi EQU, DATA, dll dengan diberikan nilai yang tetap (Konstanta). Karena sifat dinamisnya Instruksi JUMP yang merujuk pada Label, lokasi jump akan dihitung kembali agar menghasilkan lokasi Jump yang tepat, pada lokasi milik Label. Deklarasi Label adalah mirip dengan deklarasi identifier lain dan diakhiri dengan karakter titik-dua. Identifier hanya bisa dibentuk dengan karakter pertama adalah karakter Alphabet, dan karakter selanjutnya boleh juga numerik, dan karakter "_" serta "?". Panjang Label ini juga tidak boleh melebihi 255 karakter. 2. Bagian menumonic dan bagian operand dalam bahasa assembly adalah bagian utama dari kode program. Dan operand adalah spesifik atas mnumonic, yang mengisyaratkan tugas tertentu (Seperti yang sudah diatur oleh pabrik pembuat Chip dalam datasheet-nya). Ungkapan (statement) dalam bahasa assembly misalnya adalah : ADD A,B MOV A,#67 ADD dan MOV adalah mnumonic dimana akan menghasilkan opcode. Sedang "A,B" dan A,#67" adalah operand. Di luar kedua bagian ini, yakni mnumonic dan operand adalah disebut sebagai instruksi-psuedo, atau directive. Ingat bahwa sebuah directive tidak akan menghasilkan kode mesin (opcode), dan mereka digunakan oleh assembler saat memutuskan bagaimana caranya untuk menterjemahkan mnumonic dan operand yang ada di belakang directive tersebut ke dalam kode mesin yang benar sesuai dengan kemauan kita. Dalam program 2.1 perintah ORG (original) dan END adalah contoh dari directive (beberapa assembler menggunakan syntax .ORG dan .END). Periksa assembler anda untuk penjelasan lebih jauh. Lebih jauh tentang pseudo akan kita bahas pada bagian 2.5 3. Bagian komentar dimulai dengan karakter semi-colon (titik-koma) yang berarti karakter-karakter setelahnya adalah sebuah komentar. Assembler akan segera mengabaikan karakter-karakter sesudah karakter semi-colon tersebut. Mengingat assembler adalah menterjemahkan baris demi baris

dalam program, maka setiap komentar harus dimulai dari karakter semicolon itu, walaupun dalam baris tersebut tidak terdapat instruksi apapun. 4. Perhatikan label "HERE" dalam program 2.1 adalah bagian Label. Setiap label harus diakhiri dengan simbol colon (titik-dua). Dalam instruksi SJMP (Short Jump), 8051 diberitahu untuk berhenti disitu, atau dengan kata lain berputar-putar terus ditempat yang sama.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->