Bagi Anda yang saat ini sedang mengalami kesulitan bagaimana membuat program untuk mengurutkan data yang sudah tersimpan di dalam memori RAM, Anda sedang berada di artikel yang tepat, karena kali ini saya membahas sebuah program (relatif) kecil dalam bahasa Assembly untuk Mikrokontroler AT89 atau kompatibel 8051 untuk mengurutkan data.
Okey, mari kita mulai dengan beberapa deklarasi di awal program….
ORG 00H SIZE EQU 10 ARRAY EQU 50H ;Data starting address FLAG BIT 00H ;Exchange logo
Program diawali dengan menentukan alamat awal program yaitu mulai 0x00 (dengan instruksi ORG), kemudian diikuti dengan deklarasi beberapa variabel, yaitu SIZE yang merupakan jumlah data yang akan diurutkan, ARRAY yang merupakan alamat awal data dan sebuah variabel bit FLAG yang akan digunakan sebagai tanda untuk pertukaran data (data exchange).
SORT: MOV R0,#ARRAY ;The first address entered into R0 MOV R7,#SIZE-1 ;By a number of data input to R7 CLR FLAG ;Exchange of zero mark COON: MOV A,@R0 ;Will first address the contents of the read A MOV R2,A ;Write data to the R2, INC R0 ;The first address plus one MOV B,@R0 ;Will first address the contents of the read B CJNE A,B,NOTEQUAL ;Not equal, jump SJMP NEXT
Selanjutnya, program diawali dengan melakukan inisialisasi proses pengurutan. Register R0 digunakan untuk menyimpan alama awal data (melalui variabel ARRAY). Register R7 digunakan untuk menyimpan jumlah data yang akan diurutkan, kemudian variabel FLAG dibuat berisi 0 (logika LOW).
Kita baca dulu data satu persatu, mulai dari lokasi RAM yang ditunjuk oleh R0 (@R0) disimpan ke dalam akumulator A dan register R2, kemudian dilanjutkan dengan berikutnya (nilai R0 dinaikkan satu dengan instruksi INC), simpan ke register B dan dibandingkan (menggunakan CJNE). JIka A tidak sama dengan B, artinya bahwa dua data yang berturutan adalah tidak sama, lakukan lompatan ke label NOTEEQUAL untuk pemrosesan lebih lanjut (dijelaskan di paragraf berikut), jika sama lanjutkan dengan data berikutnya (SJMP NEXT), artinya tidak perlu dilakukan penukaran data.
NOTEQUAL: JC NEXT ;After the former small-large, non-exchange SETB FLAG ;After the front of a small, home exchange logo XCH A,@R0 ;Exchange DEC R0 ;R0 by a XCH A,@R0 INC R0 NEXT: DJNZ R7,COON ;R7 does not equal 0 go to GOON (ie no exchange end) JB FLAG,SORT ;FLAG=1 to SORT to clear FLAG SJMP $ END
Jika dua data yang saling berturutan tidak sama maka harus dilakukan penukaran data. Jika data pertama lebih kecil dari data kedua, tidak perlu dilakukan penukaran data (algoritma yang sedang kita bahas ini adalah mengurutkan dari data kecil ke data besar atau ascending). sehingga langsung lompat ke NEXT (menggunakan JC), yang akan melanjutkan ke data berikutnya dan data yang diproses berkurang satu (menggunakan DJNZ untuk mengurangi R7 dan jika belum berisi NOL lompat ke COON untuk melanjutkan data berikutnya).
Lantas apa yang terjadi jika harus dilakukan penukaran data? Langsung saja FLAG dibuat berisi 1 (HIGH), lakukan penukaran data menggunakan instruksi XCH antara isi akumulator A dan RAM yang berlokasi di alamat yang ditunjukkan R0, demikian seterusnya sehingga masuk ke label NEXT untuk melanjutkan ke data berikutnya. Jika semua data sudah diproses, cek apakah FLAG=1? JIka benar maka ulangi lagi dari awal (label SORT).
Demikian penjelasan saya, semoga bermanfaat.