www.societyofrobots.com |
"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 :-)
mas, kalo cara perhitungan 1 kali 1 sama dengan 1 d assembly gman???
ReplyDeleteterimakasih ...
Pertanyaan yang bagus mas dan terimakasih untuk kunjungannya.
DeleteDi 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