You are on page 1of 15

BÀI TẬP: LC-3

VD: Âm – Dương:
.ORIG X3010 ; chuong trinh bat dau o o nho x3010 -> co the thay dia
chi o nho khac tuy theo de bai

AND R0, R0, #0 ;


AND R5, R5, #0 ;
AND R6, R6, #0 ; xoa cac thanh ghi de lam bien dem
ADD R0, R0, #10 ; co 10 gia tri can kiem -> bien dem R0 bat dau tu
10 -> co the thay bay so khac tuy theo de bai
LD R1, MEM ; dua dia chi o nho dau tien vao R1

LOOP LDR R2, R1, #0 ; lay gia tri luu trong dia chi o nho dang chua
trong R1 vao R2
BRP POS ; neu la so duong thi toi label "POS"
BRN NEG ; neu la so am thi toi label "NEG"
BRZ NEXT

POS ADD R5, R5, #1 ; bien dem so duong R5 tang them 1


BR NEXT ; re nhanh ko dieu kien den "NEXT"

NEG ADD R6, R6, #1 ; bien dem so am tang them 1


BR NEXT ; -> "NEXT"

NEXT ADD R1, R1, #1 ; dia chi o nho luu trong R1 tang them 1
ADD R0, R0, #-1 ; bien dem R0 giam di 1
BRP LOOP ; neu chua du 10 gia tri thi quay lai "LOOP"

; sau khi R0 -> 0 ket thuc vong lap "LOOP"


; so duong da co the nhin thay tren thanh ghi R5
; so am da co the nhin thay tren thanh ghi R6
; nhom lenh ben duoi la de xuat ket qua ra man hinh

LD R0, ASCII ; "ASCII" -> R0


ADD R0, R0, R5 ; dua R5 ve ma Ascii de xuat
TRAP X21 ; xuat
LEA R0, MESG ;
TRAP X22 ; xuat chuoi trong "MESG"

LD R0, DOWN ;
TRAP X21 ; xuat ky tu xuong dong

LD R0, ASCII ; "ASCII" -> R0


ADD R0, R0, R6 ; dua R6 ve ma Ascii de xuat
TRAP X21 ; xuat
LEA R0, MESG2 ;
TRAP X22 ; xuat chuoi trong "MESG2"
HALT ; lenh ket thuc chuong trinh

MEM .FILL X3000 ; dia chi o nho dau tien la x3000 -> co the thay
thanh dia chi o nho khac tu theo de bai
ASCII .FILL X30 ; hang so dua he thap phan ve ma Ascii
DOWN .FILL X0D ; ma Ascii ky tu xuong dong
MESG .STRINGZ " SO DUONG" ;
MESG2 .STRINGZ " SO AM" ; chuoi

.END ; khong con lenh nao sau lenh nay


VD: CHẴN – LẺ

.ORIG X3000

AND R0, R0, #0 ;


AND R5, R5, #0 ;
AND R6, R6, #0 ; xoa cac thanh ghi de lam bien dem
ADD R0, R0, #6 ; co 6 gia tri can kiem -> bien dem R0 bat dau tu 6
LD R1, MEM ; dua dia chi o nho dau tien vao R1

LOOP LDR R2, R1, #0 ; lay gia tri luu trong dia chi o nho dang chua
trong R1 vao R2
BRZ CHAN ; neu la so 0 thi toi label "CHAN"
BRN NEG ; neu la so am thi toi label "NEG"

POS ADD R2, R2, #-2 ; vong lap cho so duong -> tru di 2 don vi
BRN LE ; neu xuat hien ket qua am -> di toi label "LE"
BRZ CHAN ; neu xuat hien ket qua 0 -> di toi label "CHAN"
BR POS ; lap lai vong lap "POS" neu ket qua duong

NEG ADD R2, R2, #2 ; vong lap cho so am -> cong them 2 don vi
BRP LE ; neu xuat hien ket qua duong -> di toi label "LE"
BRZ CHAN ; neu xuat hien ket qua 0 -> di toi label "CHAN"
BR NEG ; lap lai vong lap "NEG" neu ket qua am

LE ADD R5, R5, #1 ; bien dem so le tang len 1 don vi


BR NEXT ; toi label "NEXT"

CHAN ADD R6, R6, #1 ; bien dem so chan tang len 1 don vi
BR NEXT ;

NEXT ADD R1, R1, #1 ; dia chi o nho luu trong R1 tang them 1
ADD R0, R0, #-1 ; bien dem R0 giam di 1
BRP LOOP ; neu chua du 6 gia tri thi quay lai "LOOP"

LD R0, ASCII ; "ASCII" -> R0


ADD R0, R0, R6 ; dua R5 ve ma Ascii de xuat
TRAP X21 ; xuat
LEA R0, MESG ;
TRAP X22 ; xuat chuoi trong "MESG"

LD R0, DOWN ;
TRAP X21 ; xuat ky tu xuong dong

LD R0, ASCII ;
ADD R0, R0, R5 ; dua R6 ve ma Ascii de xuat
TRAP X21 ; xuat
LEA R0, MESG2 ;
TRAP X22 ; xuat chuoi trong "MESG2"
HALT ; lenh ket thuc chuong trinh

MEM .FILL X3070 ; dia chi o nho dau tien la x3070


ASCII .FILL X30 ; hang so dua he thap phan ve ma Ascii
DOWN .FILL X0D ; ma Ascii ky tu xuong dong
MESG .STRINGZ " SO CHAN" ;
MESG2 .STRINGZ " SO LE" ; chuoi

.END ; khong con lenh nao sau lenh nay


VD: ĐẾM BIT

.ORIG X3000

; bang ma ASCII co ky tu lon nhat [DEL] - #127 - x7F - 0111 1111 -> chi can dung 8 bit
de bieu dien

LD R5, ASCII ; ASCII -> R5


LD R3, VAR ; VAR -> R3, bien dem nguoc so bit 0
LD R6, VAR ; VAR -> R6, bien quet du so bit (o day la 8)
AND R4, R4, #0 ;
ADD R4, R4, #1 ; R4 lam bit dong, R4 bat dau tu 0000 0001 ->
0000 0010 -> 0000 0100 -> ...

TRAP X23 ;
ADD R1, R0, #0 ; luu ky tu vua nhap vao R1

LOOPT AND R2, R1, R4 ; vong lap to: AND tung bit cua ky tu de kiem
bit 1
BRZ SUB ; AND ra 0 -> SUB
LOOPN ADD R4, R4, R4 ; day bit 1 len vi tri tiep theo
ADD R6, R6, #-1 ; bien quet giam di 1 don vi
BRZ KET ; bien quet ve 0 -> KET
BR LOOPT ; -> LOOPT

SUB ADD R3, R3, #-1 ; bien dem R3 tru 1 vi xuat hien bit 0
BR LOOPN ; -> LOOPN

KET ADD R0, R3, R5 ; dua he thap phan ve ma Ascii de xuat


TRAP X21 ; xuat
HALT ; ket thuc chuong trinh

ASCII .FILL X30 ; hang so dua ve ma Ascii


VAR .FILL #8 ; gia tri 8 (co the thay doi)

.END ; khong con lenh nao sau lenh nay


VD: DỊCH BIT

.ORIG X3001 ; vi tri bat dau chuong trinh -> chay chuong trinh tu day
AND R5, R5, #0 ; xoa R5 dem bit

TRAP X23 ; nhap ky tu


ADD R1, R0, #0 ; luu -> R1 de kiem tra chan - le
BRZ K_THUC ; neu ky tu "" (nul) -> K_THUC

K_TRA ADD R1, R1, #-2 ; vong lap kiem tra chan - le
BRN D_TRAI ; neu xuat hien ket qua am -> le -> di toi label "D_TRAI"
BRZ D_PHAI ; neu xuat hien ket qua 0 -> chan -> di toi label
"D_PHAI"
BR K_TRA ; lap lai vong lap "K_TRA" neu ket qua duong

; dich bit sang trai -> thuc hien phep nhan voi 2 -> dich 2 bit -> nhan 4
D_TRAI ADD R0, R0, R0 ; nhan doi 1 lan -> sang trai 1 bit
ADD R5, R0, R0 ; nhan doi 2 lan -> sang trai 2 bit -> R5
BR K_THUC ;

; dich bit sang phai -> thuc hien phep chia voi 2 -> dich 2 bit -> chia 4
D_PHAI ADD R0, R0, #-4 ; tru di 4
BRN K_THUC ; am -> K_THUC
ADD R5, R5, #1 ; R3 tang them 1
BR D_PHAI ; -> D_PHAI

K_THUC STI R5, ANS ; luu ket qua vao dia chi o nho luu trong ANS
HALT ; ket thuc chuong trinh

ANS .FILL x3000 ; dia chi o nho luu giu lieu -> hien tai la x3000

.END ; khong con lenh nao sau lenh nay


VD: ĐẾM LỚN HƠN

.ORIG X3020

AND R4, R4, #0


LD R1, MEM
LD R2, VAL
LD R5, ASCII
LDI R3, G_TRI_X
NOT R3, R3
ADD R3, R3, #1

LOOP LDR R0, R1, #0


ADD R0, R0, R3
BRP DEM ; duong -> DEM, bai dem nho hon thi doi lai thanh
BRN
NEXT ADD R1, R1, #1
ADD R2, R2, #-1
BRZ FIN
BR LOOP

DEM ADD R4, R4, #1


BR NEXT

FIN ADD R6, R4, #-10 ; kiem tra co hang chuc khong
BRZP H_CHUC
ADD R0, R4, R5 ; lay lai ket qua luu vao R0 -> ma Ascii
TRAP X21 ; xuat
HALT

H_CHUC LD R0, NUM_1


TRAP X21
ADD R0, R6, R5 ; dua R6 ve ma Ascii -> hang don vi
TRAP X21 ; xuat
HALT

ASCII .FILL X30


MEM .FILL X3000 ; dia chi o dau tien
G_TRI_X .FILL X3010 ; dia chi cua x laf x3010
VAL .FILL #17 ; tu 3000 -> 300F co 17 gia tri
NUM_1 .FILL #49
.END ; khong con lenh nao sau lenh nay
VD: IN HOA

.ORIG X3050
AND R1, R1, #0 ; xoa thanh ghi R1
LEA R0, MESG ; dua chuoi "MESG" vao thanh ghi R0
PUTS ; xuat chuoi
LEA R1, MEM ; dua dia chi (o dia chi dau tien) cua "MEM" vao R1

LOOP GETC ; lenh lay ky tu -> R0 -> ky tu duoc go vao khong


co hien len Console
PUTC ; xuat lai len Console de thay ky tu duoc go

LD R3, ENTER ; dua "ENTER" vao R3


ADD R3, R3, R0 ; tong voi R3 de kiem tra ky tu go vao co
phai Enter - "xuong dong " khong
BRZ KETTHUC ; neu la enter thi di den label "KET THUC"

LD R2, KT ; dua "KT" vao R2


ADD R2, R0, R2 ; cong ky tu voi R2
BRZP CAP ; neu ky tu la chu thuong -> den label "CAP"

NEXT STR R0, R1, #0 ; luu gia tri trong R0 vao o dia chi luu
trong R1
ADD R1, R1, #1 ; tang o dia chi them mot
BR LOOP ; quay lai vong lap "LOOP"

CAP LD R2, IN_HOA ; dua "IN_HOA" vao R2


ADD R0, R0, R2 ; cong R2 voi R0 de duoc ma Ascii cua ky tu
in hoa
BR NEXT ; re nhanh vo dieu kien den label "NEXT"

KETTHUC
LEA R0, MESG2 ;
PUTS ; xuat chuoi "MESG2"
LEA R0, MEM ; dua "MEM" vao R0
PUTS ; xuat

HALT ; lenh ket thuc chuong trinh

MEM .BLKW 100 ; danh ra mot khoang memory cho chuoi duoc nhap
MESG .STRINGZ "Nhap chuoi: " ; chuoi "MESG"
MESG2 .STRINGZ "Ket qua: " ; chuoi "MESG2"
ENTER .FILL XFFF6 ; gia tri am cua phim "ENTER" dung de kiem tra
IN_HOA .FILL #-32 ; hang so dua chu thuong thanh chu in hoa
KT .FILL #-97 ; hang so kiem tra vi tri chu in thuong trong bang
ma Ascii

.END ; khong con lenh nao sau lenh nay


VD: MAX MIN

.ORIG x3010

AND R0, R0, #0 ; xoa thanh ghi R0


ADD R0, R0, #10 ; gan R0 = 10 -> R0 lam bien dem o nho

LD R1, o_nho ; dia chi o nho dau tien luu vao R1, R1 -> lam dia
chi dong
LDI R5, o_nho ; lay gia tri dau tien lam min -> luu R5
LDI R6, o_nho ; lay gia tri dau tien lam max -> luu R6

LOOP LDR R3, R1, #0 ; lay gia tri luu trong dia chi o nho dang
chua trong R1 vao R3
NOT R4, R3 ; lay bu 1 -> R4
ADD R4, R4, #1 ; lay bu 2 -> R4
ADD R7, R4, R5 ; kiem tra co be hon MIN khong
BRP MIN ; be hon (duong) -> MIN
ADD R7, R4, R6 ; kiem tra co lon hon MAX khong
BRN MAX ; lon hon (am) -> MAX
BR NEXT ; re nhanh vo dieu kien -> NEXT

MIN ADD R5, R3, #0 ; thay MIN moi vao R5


BR NEXT ;

MAX ADD R6, R3, #0 ; thay MAX moi vao R6

NEXT ADD R1, R1, #1 ; bien dia chi o nho tang them 1
ADD R0, R0, #-1 ; bien dem o nho giam 1
BRP LOOP ; neu bien dem o nho chua ve 0 -> quay lai vong lap

STI R5, GT_MIN ; luu gia tri R5 vao o nho cua label "GT_MIN"
STI R6, GT_MAX ; luu gia tri R6 vao o nho cua label "GT_MAX"
HALT ; lenh ket thuc chuong trinh

o_nho .FILL x3000 ; dia chi o nho dau tien ;


GT_MIN .FILL x300A ; dia chi luu
GT_MAX .FILL x300B ; dia chi luu

.END ; khong con lenh nao sau lenh nay


VD: NHÂN

.ORIG X3000 ; chuong trinh bat dau o nho x3000

AND R3, R3, #0 ; lenh xoa thanh ghi


ADD R4, R3, #1 ; R4 bat dau tu 1 -> de tao chu so hang chuc
LD R5, ASCII ; "ASCII" -> R5
LD R6, NEGASCII ; "NEGASCII" -> R6

TRAP X23 ; lenh de nhap so thu nhat -> R1


ADD R1, R6, R0 ; cong voi R6 de dua ve he thap phan

TRAP X23 ; lenh de nhap so thu hai -> R2


ADD R2, R6, R0 ;
BRZ NEXT1 ; neu R2 = 0 -> "NEXT1"
ADD R0, R1, #0 ;
BRZ NEXT1 ; neu R1 = 0 -> "NEXT1"

LOOP ADD R3, R1, R3 ; cong so thu nhat (R1) vao R3 -> phep nhan
duoc tinh bang so lan cong
ADD R2, R2, #-1 ; so thu hai tru di mot lan
BRz NEXT2 ; neu so thu 2 ve 0 (R2 = 0) -> "NEXT2"
BR LOOP ; re nhanh khong dieu kien de tro lai vong
lap

NEXT1 LEA R0, MESG ;


TRAP X22 ; nhom lenh xuat chuoi "MESG"
HALT ; lenh ket thuc chuong trinh

NEXT2 ADD R2, R3, #-10 ; hieu voi 10 de kiem tra tich co be hon 1o ko
BRN FIN1 ; am -> xuat ket qua luon -> "FIN1"

LO0P2 ADD R2, R2, #-10 ; hieu voi 10 de dem co bao nhieu o hang chuc
BRN FIN2 ; dem du -> thoat vong lap
ADD R4, R4, #1 ; chu so hang chuc + them 1
BR LO0P2 ; lap lai LOOP2

FIN1 LEA R0, MESG1 ;


TRAP X22 ; nhom lenh xuat chuoi "MESG1"
ADD R0, R3, R5 ; ket qua = R3 -> doi sang ma Ascii
TRAP X21 ; xuat
HALT ; ket thuc chuong trinh

FIN2 LEA R0, MESG1 ;


TRAP X22 ; nhom lenh xuat chuoi "MESG1"
ADD R0, R5, R4 ; dua R4 ve ma Ascii
TRAP X21 ; xuat hang chuc (R4)
ADD R0, R2, #10 ; R2 cong 10 -> hang don vi
ADD R0, R0, R5 ; R2 -> ma Ascii
TRAP X21 ; xuat hang don vi
HALT ; ket thuc chuong trinh

ASCII .FILL X30 ; hang so dua he thap phan -> ma Ascii


NEGASCII .FILL xFFD0 ; hang so dua ma Ascii -> he thap phan
MESG .STRINGZ "Tich 2 so la: 0" ;
MESG1 .STRINGZ "Tich 2 so la: " ; chuoi

.END ; khong con lenh nao sau lenh nay


VD: SORT

; Implementing bubble sort algorithm


; R0 File item
; R1 File item
; R2 Work variable
; R3 File pointer
; R4 Outer loop counter
; R5 Inner loop counter

.ORIG x3000

; Count the number of items to be sorted and store the value in R7

AND R2, R2, #0 ; Initialize R2 <- 0 (counter)


LD R3, FILE ; Put file pointer into R3
COUNT LDR R0, R3, #0 ; Put next file item into R0
BRZ END_COUNT ; Loop until file item is 0
ADD R3, R3, #1 ; Increment file pointer
ADD R2, R2, #1 ; Increment counter
BRNZP COUNT ; Counter loop
END_COUNT ADD R4, R2, #0 ; Store total items in R4 (outer loop count)
BRZ SORTED ; Empty file

; Do the bubble sort

OUTERLOOP ADD R4, R4, #-1 ; loop n - 1 times


BRNZ SORTED ; Looping complete, exit
ADD R5, R4, #0 ; Initialize inner loop counter to outer
LD R3, FILE ; Set file pointer to beginning of file
INNERLOOP LDR R0, R3, #0 ; Get item at file pointer
LDR R1, R3, #1 ; Get next item
NOT R2, R1 ; Negate ...
ADD R2, R2, #1 ; ... next item
ADD R2, R0, R2 ; swap = item - next item
BRNZ SWAPPED ; Don't swap if in order (item <= next item)
STR R1, R3, #0 ; Perform ...
STR R0, R3, #1 ; ... swap
SWAPPED ADD R3, R3, #1 ; Increment file pointer
ADD R5, R5, #-1 ; Decrement inner loop counter
BRP INNERLOOP ; End of inner loop
BRNZP OUTERLOOP ; End of outer loop
SORTED HALT

FILE .FILL x3500 ; File location


.END
VD: TỔNG HIỆU 2

.ORIG X3000
LD R6, ASCII ; lay gia tri luu trong label "ASCII" luu vao R6
LD R5, NEGASCII ; ___________________________ "NEGASCII" luu
vao R5

TRAP X23 ; lenh nhap 1 ky tu -> luu vao R0


ADD R1, R0, X0 ; luu gtri vua nhap vao R1
ADD R1, R0, R5 ; dua gia tri ve he thap phan

TRAP X23
ADD R0, R0, R5 ; dua gtri vua nhap ve he thap phan roi luu
vao R5
ADD R2, R0, R1 ; tong 2 so vua nhap

NOT R0, R0 ; lay bu 1 R0 roi luu lai vao R0


ADD R0, R0, #1 ; lay bu 2 R0
ADD R3, R0, R1 ; hieu 2 so -> luu vao R3

LEA R0, MESG ; lay chuoi MESG luu vao R0


TRAP X22 ; lenh xuat chuoi trong R0

LD R0, HIEU10 ;
ADD R4, R0, R2 ; kiem tra tong co lon hon 10 bang hieu voi
10
BRZP CHUC ; neu ket qua hieu ra duong -> xuong label "CHUC"
ADD R0, R2, R6 ; dua tong trong R2 ve ma Ascii
TRAP X21 ; lenh xuat gia tri trong R0 ra Console

TIEPTUC LD R0, DOWN ;


TRAP X21 ; xuat ky tu xuong dong

LEA R0, MESG2 ;


TRAP X22 ; xuat chuoi MESG2

ADD R0, R3, #0 ; luu R3 vao R0


BRN AM ; neu hieu hai so la am -> xuong label "AM"
ADD R0, R3, R6 ; dua hieu trong R3 ve ma Ascii
TRAP X21 ; xuat

HALT ; lenh ket thuc chuong trinh

; trang 1

CHUC LD R0, KYTU1 ; dua ky tu ma Ascii "1" vao R0


TRAP X21 ; xuat
ADD R0, R4, R6 ; dua hieu 10 trong R4 ve ma Ascii
TRAP X21 ; xuat
BR TIEPTUC ; re nhanh vo dieu kien den "TIEP TUC"

AM LD R0, DAUTRU ;
TRAP X21 ; xuat ky tu dau "-"
ADD R0, R3, #-1 ;
NOT R0, R0 ; lay bu 2 nguoc -> lay gia tri tuyet doi cua hieu
ADD R0, R0, R6 ; dua ve ma Ascii
TRAP X21 ; xuat

HALT ; ket thuc

ASCII .FILL X30 ; hang so dua he thap phan ve ma Ascii


NEGASCII .FILL XFFD0 ; hang so dua ma Ascii ve he thap phan
DOWN .FILL X0D ; ma Ascill cua ky tu xuong dong
HIEU10 .FILL #-10 ;
KYTU1 .FILL X31 ; ky tu ma Ascii "1"
DAUTRU .FILL X2D ; ky tu ma Ascii dau "-"
MESG .STRINGZ "TONG HAI SO LA " ;
MESG2 .STRINGZ "HIEU HAI SO LA " ; chuoi luu trong label

.END ; khong con lenh nao sau lenh nay


; trang 2
VD: TỔNG HIỆU 3

.ORIG X3000 ; K = A+B-c -> max 9+9-0 =18, min 0+0-9=-9

LD R5, ASCII ; ASCII -> R5


LD R6, NEGASCII ; NEGASCII -> R6

TRAP X23 ;
ADD R1, R0, R6 ;
TRAP X23 ;
ADD R2, R0, R6 ;
TRAP X23 ;
ADD R3, R0, R6 ; nhap -> luu cac gia tri -> dua ve he
thap phan

ADD R0, R1, R2 ;K = A+B


NOT R3, R3 ;
ADD R3, R3, #1 ;
ADD R0, R0, R3 ;K = A+B-C
BRN AM ; kiem tra co am khong
ADD R6, R0, #-10 ; kiem tra co hang chuc khong
BRZP H_CHUC
LEA R0, MESG
TRAP X22 ; xuat MESG
ADD R0, R6, #10
ADD R0, R0, R5 ; lay lai ket qua luu vao R0 -> ma
Ascii
TRAP X21 ; xuat
HALT

H_CHUC LEA R0, MESG2


TRAP X22 ; xuat MESG2
ADD R0, R6, R5 ; dua R6 ve ma Ascii -> hang don vi
TRAP X21 ; xuat
HALT

AM ADD R3, R0, #0 ; R0 -> R3


LEA R0, MESG1 ; MESG1 -> R0
TRAP X22 ; xuat
ADD R0, R3, #-1 ;
NOT R0, R0 ; lay nguoc bu 2 -> lay gia tri tuyet doi cua
ket qua am
ADD R0, R0, R5 ; -> ma Ascii
TRAP X21 ; xuat
HALT
ASCII .FILL X30 ; hang so dua he thap phan ve ma Ascii #48
NEGASCII .FILL XFFD0 ; hang so dua ma Ascii ve he thap phan #-48
MESG .STRINGZ "Ket qua la "
MESG1 .STRINGZ "Ket qua la -"
MESG2 .STRINGZ "Ket qua la 1"
.END ; khong con lenh nao sau lenh nay
VD: XUẤT SỐ TRONG Ô NHỚ
.ORIG X3010

; xuat ra man hinh so duoc luu trong o nho x3000


; max cua LC3: 32767
; min cua LC3: -32768

; xoa cac thanh ghi cho dep :v


AND R0, R0, #0
AND R1, R1, #0
AND R2, R2, #0
AND R3, R3, #0
AND R4, R4, #0
AND R5, R5, #0
AND R6, R6, #0

; dua cac hang so vao thanh ghi


LD R3, ASCII
LD R4, NECNGAN
LD R5, NENGAN
LD R6, NETRAM
LDI R1, NUM ; lay gia tri chua trong o nho luu trong NUM -> R1
BRP POS ; duong -> POS
BRN NEG ; am -> NEG
BR NEXT ; o nho chua gia tri 0 thi xuat ra Console
luon

POS LEA R0, MESG2 ;


TRAP X22 ;
BR NEXT1 ; xuat MESG2 -> NEXT1

NEG LEA R0, MESG1 ;


TRAP X22 ; nhom lenh xuat chuoi MESG1
ADD R1, R1, #-1 ;
NOT R1, R1 ; lay bu 2 nguoc cua R1 de duoc gia tri tuyet doi
(duong)
BR NEXT1 ; -> NEXT1

NEXT LEA R0, MESG ;


TRAP X22 ; nhom lenh xuat chuoi MESG
HALT ; ket thuc chuong trinh

NEXT1 AND R0, R0, #0 ; xoa thanh ghi R0 de lam bien dem
ADD R2, R1, R4 ; hieu voi 10000 de kiem tra co hang chuc
ngan khong
BRN NEXT2 ; am -> NEXT2
LO0P1 ADD R0, R0, #1 ; chu so hang chuc ngan + them 1
ADD R2, R2, R4 ; hieu voi 10000 de dem co bao nhieu o hang
chuc ngan
BRN XUAT1 ; am -> XUAT1
BR LO0P1 ; lap lai LOOP1
XUAT1 ADD R0, R3, R0 ; dua R0 ve ma Ascii
TRAP X21 ; xuat gia tri hang chuc ngan (R0)

; nhom lenh them ky tu "0" cho hang ngan neu co ton tai hang chuc ngan
LD R0, CNGAN ; 10000 -> R0
ADD R2, R0, R2 ; lay lai cac gia tri tu hang ngan
AND R0, R0, #0 ; xoa thanh ghi R0 de neu hang ngan = 0 ->
xuat ra 0 (R0)
ADD R2, R2, R5 ; R2 - 1000 -> kiem tra hang ngan co = 0
khong
BRN XUAT2 ; am -> XUAT2 (xuat R0 = 0)
BR LOOP2 ; -> LOOP2 (neu hang ngan co ton tai)

NEXT2 LD R0, CNGAN ; 10000 -> R0


ADD R2, R0, R2 ; lay lai cac gia tri tu hang ngan
AND R0, R0, #0 ; xoa thanh ghi R0 de lam bien dem
ADD R2, R2, R5 ; hieu voi 1000 de kiem tra co hang chuc ngan
khong
BRN NEXT3 ; am -> NEXT3
LOOP2 ADD R0, R0, #1 ; chu so hang ngan + them 1
ADD R2, R2, R5 ; hieu voi 1000 de dem co bao nhieu o hang
ngan
BRN XUAT2 ; am -> XUAT2 (di xuat bien dem R0)
BR LOOP2 ; lap lai LOOP2
XUAT2 ADD R0, R3, R0 ; dua R0 ve ma Ascii
TRAP X21 ; xuat hang ngan (R0)

; nhom lenh them ky tu "0" cho hang tram neu co ton tai hang ngan va hang chuc
ngan
LD R0, NGAN ; 1000 -> R0
ADD R2, R0, R2 ; lay lai cac gia tri tu hang tram
AND R0, R0, #0 ; xoa thanh ghi R0 de neu hang tram = 0 ->
xuat ra 0 (R0)
ADD R2, R2, R6 ; R2 - 100 -> kiem tra hang tram co = 0 khong
BRN XUAT3 ; am -> XUAT3 (xuat R0 = 0)
BR LOOP3 ; -> LOOP3 (neu hang ngan co ton tai)

NEXT3 LD R0, NGAN ;


ADD R2, R0, R2 ;
AND R0, R0, #0 ;
ADD R2, R2, R6 ;
BRN NEXT4 ;
LOOP3 ADD R0, R0, #1 ;
ADD R2, R2, R6 ;
BRN XUAT3 ;
BR LOOP3
XUAT3 ADD R0, R3, R0 ;
TRAP X21 ; tuong tu nhu tren voi hang tram

; nhom lenh them ky tu "0" cho hang tram neu co ton tai hang ngan, hang chuc
ngan va hang tram
LD R0, TRAM ;
ADD R2, R0, R2 ;
AND R0, R0, #0 ;
ADD R2, R2, #-10 ;
BRN XUAT4 ; tuong tu nhu tren
BR LOOP4

NEXT4 LD R0, TRAM ;


ADD R2, R0, R2
AND R0, R0, #0 ;
ADD R2, R2, #-10 ;
BRN NEXT5
LOOP4 ADD R0, R0, #1 ;
ADD R2, R2, #-10 ;
BRN XUAT4 ;
BR LOOP4
XUAT4 ADD R0, R3, R0 ;
TRAP X21 ; tuong tu nhu tren

NEXT5 ADD R0, R2, #10 ; R2 cong 10 -> hang don vi


ADD R0, R0, R3 ; R2 -> ma Ascii
TRAP X21 ; xuat hang don vi

HALT

ASCII .FILL X30 ; hang so chuyen sang ma Ascii


NUM .FILL X3000 ; dia chi o nho can lay data de xuat
CNGAN .FILL X2710 ; #10000
NGAN .FILL X3E8 ; #1000
TRAM .FILL X64 ; #100
NECNGAN .FILL XD8F0 ; #-10000
NENGAN .FILL XFC18 ; #-1000
NETRAM .FILL XFF9C ; #-100
MESG .STRINGZ "o nho x3000 chua gia tri: 0"
MESG1 .STRINGZ "o nho x3000 chua gia tri: -"
MESG2 .STRINGZ "o nho x3000 chua gia tri: "

.END ; khong con lenh nao sau lenh nay

You might also like