Tuesday, April 17, 2012

Pemikiran Sederhana Kalau Dikelola Secara Tepat Hasilnya Bisa Wah!

www.societyofrobots.com
Juragan sinyal ingin sharing pengalaman juragan sendiri mengenai suatu penyelesaian masalah. Suatu ketika ada seorang kawan datang dengan membawa tugas pemrograman dari kampusnya. "Lik (paklik maklum orang desa, red) bisa bantu bikin program untuk mendeteksi hasil perkalian jika melebihi jumlah maksimal gak? tanyanya. "Maksudnya gimana Om?" sambung juragan. "Yah pokoknya apabila A dikali B jika hasilnya melebihi nilai tertentu program mikrokontroler harus mengaktifkan indikator" timpalnya.
"Bisa gan" jawab juragan tegas, "Tapi gak pakai bahasa assembler ya, pakai bahasa permrograman tingkat tinggi aja yang sudah ada fungsi perkaliannya".Sang kawan menolak karena tugas dari dosennya minta menggunakan bahasa yang dasar yaitu assembler.
Ya OK lah kalau begitu kata juragan dalam hati. Juragan yakin bisa karena dulu pas kuliah pernah diajar namanya Carry atau indikator dalam mikrokontroler yang berfungsi membaca kondisi jika hasil operator tambah panjangnya melebihi 8 bit, lagian kan kalkulator juga menggunakan IC mikrokontroler, gak masalah tuh buat ngitung perkalian.

Pas baca-baca register mikrokontroler baru deh juragan nyadar selama ini juragan tidak pernah menggunakan intruksi operator perkalian dalam assembler dan sepertinya intruksi ini memang tidak diajarkan, atau mungkin memang tidak ada intruksi perkalian atau pembagian dalam assembler ya. Kalau pakai bahasa tingkat tinggi mah juragan sering pakai operator perkalian dan pembagian. Baru kali ini ada sesuatu yang ngganjel di hati tapi tetap optimis donk masalah gitu bisa selesai. IMHO logikanya fungsi apa saja yang bisa dilakukan oleh bahasa tingkat tinggi harusnya juga bisa diselesaikan menggunakan bahasa tingkat rendah semacam assembler meskipun melibatkan banyak intruksi, lha wong bahasa tingkat tinggi dikembangkan juga dari bahasa tingkat rendah.

Waktu mengketik program di rang tengah, sayup-sayup terdengar juragan junior lagi PR matematika dari tempat les. "Enam kali tiga sama dengan enam ditambah enam sama dengan dua belas, dua belas ditambah enam sama dengan delapan belas. Jadi enam dikali tiga sama dengan delapan belas" dengarku.
Lho kok sama dengan problemku?
"Dek coba kesini. Delapan kali empat berapa coba?" selidikku. Eh dijawab "Ya tambah aja sendiri delapan tambah delapan diulang sampai empat kali" jawabnya singkat karena sedang merasa diuji :D.
Oow.. .. problemku bisa diselesaikan oleh anak dibawah 5 tahun hehehe. Ternyata problemku gak serumit belajar teknik & pemrograman yang njlimet, cukup melakukan penambahan sebanyak bilangan pengali saja.
Akhirnya ngelanjutin bikin program pakai "algoritma" yang dibuat juragan junior dan menambahkan intruksi untuk mendeteksi Carry!! Selesai deh. Credit to Nova :D


Lesson learning yang juragan dapatkan adalah dalam kehidupan ini masalah bisa coba diselesaikan dengan cara yang simple dulu sebelum menggunakan cara yang lebih rumit.
Bonus lesson learning kedua adalah jangan meremehkan kemampuan orang lain walau masih anak kecil, kadang ide-ide yang hebat bisa keluar dari imajinasi mereka :-)

2 comments:

  1. mas, kalo cara perhitungan 1 kali 1 sama dengan 1 d assembly gman???
    terimakasih ...

    ReplyDelete
    Replies
    1. Pertanyaan yang bagus mas dan terimakasih untuk kunjungannya.
      Di atas adalah metoda untuk mendeteksi carry.
      Tapi kalau casenya untuk menghitung jumlah perkalian maka bisa dideteksi dulu jumlah pengalinya (special case pengali = 0 & 1).
      Jadi sebelum bilangan ditambahkan sebanyak jumlah pengali harus dideteksi dulu apakah pengali adalah 0, atau 1 atau selain 0 & 1. Kalau pengali = 0 maka hasil akhir cukup diisi 0 saja. Sedangkan kalau pengali = 1 maka bilangan tidak perlu ditambah lagi.

      Berikut list program yg merupakan modifikasi dari versi diatas.

      org 00h
      bilangan equ 200
      pengali equ 201
      ;-----------------
      ; simulasi input
      ;-----------------
      mov bilangan,#00d
      mov pengali,#00d
      mov A,#00d ; reset bilangan A
      mov P1,#255d ; INDICATOR CARRY OFF
      mov P2,bilangan
      mov P3,pengali
      ;program utama
      ;cek pengali=0
      mov A,pengali
      CJNE A,#00d, check_1
      mov A,#00d ; pengali=0
      JMP keluar
      check_1: mov A,pengali
      ;cek pengali=1
      CJNE A,#01d, ulang ; pengali<>1
      jmp goto_1
      ulang: mov A,bilangan
      ulang_lagi: JC OVER
      DJNZ pengali, tambah
      jmp keluar
      tambah: ADD A, bilangan
      jmp ulang_lagi
      goto_1: mov A,bilangan
      jmp keluar
      OVER: mov P1,#00 ; LCD nyala
      keluar: mov P0,A
      end

      Delete