You are on page 1of 4

BÁO CÁO TH CẤU TRÚC MÁY TÍNH

BÀI 3: KHẢO SÁT BẢNG LỆNH ASSEMBLY TRÊN


CPU NIOS II

Mssv Họ và tên

18200103 Nguyễn Phùng Hiếu

Đề 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

#Gán nhãn RED_LEDS = địa chỉ Red LED


#Gán giá trị vào RED_LEDS. Và xem giá trị này là địa chỉ → gán
addr
.equ RED_LEDS, 0x10000010
#Gán nhãn SW = địa chỉ Switch
#Gán địa chỉ Switches cho nhãn SW
.equ SW, 0x10000040

#.global: Khai báo hàm toàn cục main


#Các file khác có thể gọi tới hàm main bên dưới
.global main

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 0xD vào r8 → r8 = 0xD


#Biến đếm số lần lặp: 18 bit (SW) – 5 bit (Mask) = 13 lần
movi r8, 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)

#Gía trị SW dịch phải r6 bit lưu vào r11


srl r11, r16, r6

#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)

#Lấy r6 so sánh với r8 để kiểm tra xem r6 có bằng r8 không


#Nếu đúng thì sẽ nhảy đến nhãn STOP
#Nếu sai thì sẽ thực hiện lệnh bên dưới
beq r6, r8, STOP

#tăng r6 lên 1 để dịch bit tiếp theo vào mask


addi r6, r6, 0x1

#Lệnh này sẽ nhảy đến nhãn LOOP


br LOOP

STOP:

#Lệnh này sẽ nhảy đến nhãn STOP


br STOP

#Kết thúc chương trình


.end

You might also like