Senin, 03 Oktober 2011

Santai dengan assembler 8051

 
Berikut ini listing program assembly:
; deklarasi parameter input
M EQU 8
N EQU 9
X EQU 10 ; variabel untuk iterasi
Y EQU 11
NODE EQU 12
OUTPUT EQU 20h ; alamat output array

; R0 sebagai index node
; R1 sebagai alamat output
start:
MOV SP,#80h ; pindahkan stack pointer supaya ada tempat untuk menaruh variabel
; inisialisasi data
MOV M,#4
MOV N,#4
; inisialisasi index output
MOV R1,#OUTPUT
; bikin loop variabel x
MOV Y,#0
LOOP_Y:
MOV X,#0
LOOP_X:
; hitung indeks nomor node (y * m + x)
MOV A,Y
MOV B,M
MUL AB
ADD A,X
; MOV R0,A ; simpan indeks di R0
MOV NODE,A ; simpan nomor node
; MOV @R1,A ; simpan nomor index
; INC R1
; kasus pertama bukan di sisi bawah (Y!=0)
; ada edge dengan tetangga yang di bawahnya
KASUS_1:
MOV A,Y
JZ KASUS_2
; lakukan perhitungan kasus 1
;neighbor = (y - 1) * m + x;
MOV A,Y ; Y => A
DEC A ;
MOV B,M ;
MUL AB ;
ADD A,X ;
; simpan hasil, pakai pointer R1
MOV @R1,NODE ; simpan dulu nomor node nya
INC R1 ; naikkan pointer untuk simpan node number
MOV @R1,A ; simpan nomor tetangganya
INC R1 ; siapkan untuk data berikut
; kasus kedua, bukan di sisi kanan (!(x == (m - 1)))
KASUS_2:
MOV A,M
DEC A
CLR C
SUBB A,X
JZ KASUS_3 ; bukan kasus 2, langsung cek kasus 3
; neighbor = y * m + (x + 1)
MOV A,Y
MOV B,M
MUL AB
ADD A,X
INC A
; simpan hasil , pakai pointer R1
MOV @R1,NODE ; simpan nomor node
INC R1
MOV @R1,A ; simpan neigbor
INC R1
; kasus ketiga, bukan di sisi atas (!(y == (n - 1)))
KASUS_3:
MOV A,N
DEC A
CLR C
SUBB A,Y
JZ KASUS_4
; hitung kasus ketiga: neighbor = (y + 1) * m + x;
MOV A,M
MOV B,X
MUL AB
ADD A,Y
INC A
MOV @R1,NODE
INC R1
MOV @R1,A

KASUS_4: ; kasus keempat, bukan di sisi kiri (x != 0)
MOV A,X
JZ AKHIR_CEK
; hitung kasus keempat: neighbor = y * m + (x - 1);
MOV A,Y
MOV B,M
MUL AB
ADD A,X
DEC A
MOV @R1,NODE
INC R1
MOV @R1,A
AKHIR_CEK:

INC X ; X++
MOV A,M ; cek apakah nilai X sudah sama dengan M
CJNE A,X,LOOP_X

INC Y ; Y++
MOV A,N ; cek apakah nilai Y sudah sama dengan N
CJNE A,Y,LOOP_Y
LOOP:
JMP LOOP
Puyeng ? Iya lah, namanya juga bahasa assembler :) Berikut ini output program, masih dalam skrinsut:

Cara membacanya menyusul :) untuk sementara silakan dibandingkan dengan output program C:
0: 1 4
1: 2 5 0
2: 3 6 1
3: 7 2
4: 0 5 8
5: 1 6 9 4
6: 2 7 10 5
7: 3 11 6
8: 4 9 12
9: 5 10 13 8
10: 6 11 14 9
11: 7 15 10
12: 8 13
13: 9 14 12
14: 10 15 13
15: 11 14

Tidak ada komentar:

Posting Komentar