Professional Documents
Culture Documents
Mssv Họ và tên
Đề bài: Viết chương trình assembly thực hiện đọc giá trị N từ
SW[17:0] và kiểm tra xem dãy bit 5'b01101 xuất hiện bao nhiêu
lần trên chuỗi N và ghi kết quả (số lần xuất hiện của chuỗi) vào
Red LEDs.
1. Code Assembly:
.text
.equ RED_LEDS, 0x10000000
.equ SW, 0x10000040
.global main
main:
movia r9, RED_LEDS
movia r10, SW
movi r4, 0
movi r3, 0xD
movi r6, 0
movi r8, 0xD
movi r7, 0
LOOP:
ldwio r16, 0(r10
srl r11,r16,r6
andi r2, r11, 0x1F
cmpeq r4, r2,r3
add r7, r7, r4
stwio r7, 0(r9)
beq r6, r8,STOP
addi r6, r6, 0x1
br LOOP
STOP:
br STOP
.end
2. Giải thích tổng quan chương trình code:
- Tách giá trị từ SW bằng cách dịch đi khi biến đếm lên
phát hiện chuỗi
- Tách lấy 5 bit để phù hợp kích thước chuỗi đề bài cho
để so sánh sau đố đẩy vào thanh ghi
- Nếu phát hiện xuất hiện chuỗi, biến thực hiện đếm lên
- Xuất kết quả LED
3. Giải thích chi tiết chương trình code
#-------------------------------------------------------------------Lệnh CPU đọc để thực hiện
#phần chứa lệnh
.text
main:
#Gán r9 = RED_LEDS
#r9 = addr(RED_LEDS) = 0x10000000
movia r9, RED_LEDS
#Gán r10 = SW
#r10 = addr(SW) = 0x10000040
movia r10, SW
# Di chuyển 0 vào r4 → r4 = 0
#r4: biến lưu số lần xuất hiện chuỗi 5’b01101
movi r4, 0
# Di chuyển 0xD vào r3 → r3 = 0xD
#r3: biến lưu dãy bit đề bài: 5’b01101
movi r3, 0xD
# Di chuyển 0 vào r6 → r6 = 0
#biến tạm để đếm lên từ 0 → 13
movi r6, 0
# Di chuyển 0 vào r7 → r7 = 0
#biến lưu kết quả cuối cùng → xuất ra RED_LEDS
movi r7, 0
LOOP:
#ldwio: load word input output → r16 = giá trị của SW
ldwio r16, 0(r10)
#Tính toán bit lôgic AND của r11 và 11111 và lưu trữ kết quả trong r2
andi r2, r11, 0x1F
#so sánh giá trị 5 bit mask với dãy bit đề bài, đúng thì r4 = 1
cmpeq r4, r2, r3
#lưu số lần so sánh đúng vào r7
add r7, r7, r4
#stwio: store word input output → lưu giá trị của r7 vào giá trị của
RED_LEDS
# store kết quả vào RED_LEDS
stwio r7, 0(r9)
STOP: