Home > programming > membuat Program Pengecek Palindrome dengan Assembler

membuat Program Pengecek Palindrome dengan Assembler

Assembly merupakan bahasa pemrograman tingkat rendah yang sangat dekat dengan kode-kode mesin. Assembly pertama kali dikembangkan pada tahun 1950 sebagai bahasa pemrograman generasi kedua. Pada masa itu bahasa ini merupakan bahasa yang canggih karena programmer tidak perlu lagi mengingat alamat memori dalam memprogram. Sekarang Assembly berguna sebagai perantara bahasa-bahasa tingkat tinggi seperti C, C++, Java dan lain sebagainya. Assembly digunakan dalam pembuatan embedded system. Assembler berguna untuk  mentranslate perintah-perintah Assembly ke dalam kode-kode mesin.  Syntax Assembly agak bervariatif bergantung dengan organisasi dan arsitektur komputer. Kali ini kita belajar assemply MIPS, dengan menggunakan simulatornya SPIM.

download pcSPIM di sini

Program yang akan kita buat adalah program pengecek palindrom. Program akan meminta masukan kalimat yang diakhiri tanda “#” kemudian menyatakan apakah kalimat tersebut merupakan palindrom. Palindrom merupakan kalimat yang dibaca sama dari depan maupun belakang, contohnya: “malam”, “kasur rusak”, “kodok”, dan sebagainya.

 

#PROGRAM IsPalindrom

#program meminta masukkan kalimat dengan diakhiri tanda “#”

#program memberitahu apakah kalimat tersebut merupakan palindrom

.data #kamus

str1: .asciiz “masukkan sebuah kalimat dan akhiri dengan #: “

str2: .asciiz “kalimat tersebut adalah sebuah palindrom”

str3: .asciiz “kalimat tersebut bukan sebuah palindrom”

kalimat: .space 64


.text #algoritma

main:

li $v0, 4

la $a0, str1

syscall #menampilkan str1 ke layar


li $v0, 8

la $a0, kalimat #menyiapkan buffer

li $a1, 64 #menyiapkan panjang tempat

syscall #meminta masukkan kalimat


move $s0, $a0 #menyimpan address huruf pertama kalimat ke $s0

move $s1, $a0 #dan juga $s1, yang akan

#digunakan sebagai pencacah

loop:

lb $s2, ($s1) #meload isi byte di $s1 dan memasukkannya ke $s2

addi $s1, 1 #mencacah $s1

bne $s2, 35, loop #loop berhenti jika bertemu tanda “#”

addi $s1, -2 #mengurangi $s1 dengan 2, ini adalah

#address huruf terakhir kalimat


li $s4, 1 #inisiasi $s4 dengan 1, berarti true

putar: 

lb $s2, ($s0) #mengeluarkan isi byte $s0 dan $s1

lb $s3, ($s1)

bne $s2, $s3, ngenol #membandingkannya, jika tidak sama

  #$s4 menjadi 0/false

addi $s0, 1 #mencacah $s0 naik, $s1 turun

addi $s1, -1

ble $s0, $s1, putar #kembali ke putar hingga $s0 lebih besar dari $s1


li $v0, 4

la $a0, str2

syscall #$s4=1, menampilkan str2

j metu


ngenol: li $s4, 0

li $v0, 4

la $a0, str3

syscall #$s4=0, menampilkan str3


metu: li $v0,10

 syscall

Sedikit Penjelasan

tanda # berarti awal komentar. Suatu komentar dapat dibaca oleh manusia tetapi diabaikan oleh komputer. .data menandakan awal kamus atau variabel-variabel dan konstanta yang akan digunakan dalam kode program. .text menandakan awal algoritma / instruksi-instruksi dalam program.

str2: .asciiz “kalimat tersebut adalah sebuah palindrom” berarti kita mengassign “kalimat tersebut adalah…”  yang bertipe ascii ke dalam variabel str2.

 

li $v0, 4

la $a0, str1

syscall 

berguna untuk menampilkan str1 ke layar. li$v0,4 menyediakan instruksi print string ke dalam alamat $v0. la $a0, str1 menyediakan string yang akan diprint ke dalam alamat $a0. syscall mengeksekusi instruksi dalam $v0.

bne $s2, 35, loop berarti branch if not equal, jika $s2 tidak sama dengan 35, maka program kembali ke instruksi loop:

untuk penjelasan-penjelasan yang lebih lengkap anda dapat langsung membaca komentar-komentar pada program di atas.

 

 

 

 

  1. Kamal Mahmudi
    March 7, 2009 at 10:44 pm

    wakaka… labelnya bahasa planet

  2. Kamal Mahmudi
    March 8, 2009 at 10:54 am

    wah thanks sgt membantu… punyaku ga jalan soalnya
    mw tanya:
    1. bne $s2, 35, loop
    tanda 35 tuh kan kode ascii pagar, apa klo mau ngecek dengan karakter yg kita mau cukup angka 35 cukup diganti dengan kode ascii karakter tersebut?
    2. addi $s1, -2
    tipe karakter ngabisin space 2 ya?
    3. addi $s1, -1
    klo tipe karakter ngabisin space 2, kenapa pas pengecekan -1 ga -2?
    4. j end
    apa bedanya dengan b end?

  3. wonggoblog
    March 11, 2009 at 10:44 pm

    @kamal
    planet komputer, sebelahnya jupiter
    1. pernah saya coba bne $s2, #, loop tapi gak jalan. ya jelas lah, habis tanda # bakal jadi komen. diisi karakter lain juga g bisa. harus integer atau register. ngeceknya bikin kode pake C aja, hehe…
    2. tipe karakter cuma ngabisin 1 byte. pake -2 karena setiap habis load byte, index $s1 geser 1 (addi $s1, 1). jadi $s0 tidak lagi menunjukkan karakter yang diload, tapi karakter setelahnya (nabung dulu 1 kali geser ke belakang). nah, geser yang satu lagi gara-gara, yang dideteksi terakhir adalah #, padahal kita penginnya karakter terakhir sebelum #. Jadilah kita menggeser 2 kali (addi $s1, -2)
    3. saya rasa sudah terjawab
    4. saya belum menemukan perbedaan antara instruksi branch b dengan jump j
    Cem jago aja saiah. hehehe… kalo ada yang salah mohon dikoreksi

  4. Kamal Mahmudi
    March 12, 2009 at 1:11 am

    yg lainnya dah jelas
    trus awa br sadar yg nomor 2 kamu nambahin 1 ke s1 pas dah ngeload makanya kurangin 2, kirain sebelum ngeload ato sesudah pengecekan tanda pagar..

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: