You are on page 1of 9

Thực hành Kiến trúc máy tính – Giữa kỳ

Họ và tên: Nguyễn Đình Dương


MSSV: 20205201
Ex6:
- Chương trình
 Nhập dữ liệu

 Thuật toán
 In kết quả
- Kết quả

- Giải thích
 Nhập dữ liệu
o Khai báo dữ liệu mảng Ai và n phần tử sau chỉ thị .data
Ai: .word 20 -52 -01 -20 03 73 #mảng số Ai nguyên gồm [20; -52; -1;
-20; 03; 73]

n: .word 6 #số lượng phần tử n có giá trị khởi tạo bằng 6


o Truyền dữ liệu vào thanh ghi
+) lw $s1, n
Lệnh load store dùng để đọc word dữ liệu 32-bit từ bộ nhớ của n vào
thanh ghi $s1

+) add $s1, $s1, $s1


Lệnh cộng giữa 2 thanh ghi $s1 và $s1 và lưu vào thanh ghi $s1. Sau 2
lần thực hiện lệnh trên thanh ghi $s1 mới bằng 4 lần thanh ghi $s1 ban
đầu (=4n)

+) Lệnh la $s2, Ai
Lệnh add $t1, $s2, $t0
Lệnh lw $t2, 0($t1)
Lệnh la dùng để đưa địa chỉ của biến Ai (A[0]) vào thanh ghi $s2
Để lấy các phần tử trong chuỗi thực hiện lệnh add thực hiện cộng hai
thanh ghi $s2 và $t0 lưu vào thanh ghi $t1 (hay là địa chỉ của phần tử
A[0+4i])
Lệnh lw để lấy ra giá trị từ địa chỉ của A[0+4i] lưu vào thanh ghi $t2

+) xor $t0, $zero, $zero


Khởi tạo i = 0

add $s5, $s5, 0x80000000


Khởi tạo giá trị max bằng giá trị nguyên bé nhất 32bit bằng −231

 Thuật toán
Hàm Check sẽ thực hiện phần giả code bên trên
+) beq $t0, $zero, end_Check
Phép so sánh xem nếu thanh ghi $t0 bằng thanh ghi $zero (i = 0) sẽ rẽ
nhánh đến nhãn end_Check để kết thúc phần kiểm tra
+) mul $t4, $t3, $t2
Phép nhân 2 số hạng cạnh nhau để nhận kết quả lưu vào thanh ghi $t4
+) slt $t5, $t4, $s5
Lệnh so sánh hai thanh ghi $t4 (S mới) và $s5 (giá trị max) trả về 1 nếu
( S < max), ngược lại trả về 0
+) bne $t5, $zero, end_Check
Lệnh rẽ nhánh kết thúc nếu thanh ghi $t5 != 0 (S < max)
+) add $s5, $t4, $zero
add $s3, $t2, $zero
add $s4, $t3, $zero
Nếu không rẽ nhánh các lệnh trên thực hiện gán các giá trị mới vào các
thanh ghi
+) addi $t0, $t0, 4
Tăng giá trị của i lên 4 để thực hiện vòng lặp tiếp theo và lấy phần tử kế
tiếp của Ai
 In kết quả
In kết quả với hệ thống SYSCALL bằng print decimal integer ($v0 = 1)
và print string ($v0 = 4)

Ex7:
- Chương trình
 Nhập dữ liệu

 Thuật toán
- Kết quả

- Giải thích
 Nhập dữ liệu
o Nhập dữ liệu mảng A
Khai báo dữ liệu mảng Ai sau chỉ thị .data
A: .word -1, 150, 190, 170, -1, -1, 160, 180, -1, -1, -1, 165
Mảng số nguyên A

la $s0, A: đưa địa chỉ của A vào thanh ghi $s0

o Lưu giá trị n là số lượng phần tử của mảng


addi $s2, $s2, 12: Cộng thanh ghi $s2 với giá trị 12

 Thuật toán
o arrayExt
+) la $s1, B: đưa địa chỉ của B vào thanh ghi $s1

add $t0, $s0, 0


add $t1, $s1, 0
Tạo con trỏ tới A[0] và B[0] lưu lần lượt vào hai thanh ghi $t0 và $t1

**Vòng lặp loop_ae


+) beq $t2, $s2, end_loop_ae
Kiểm tra nếu giá trị thanh ghi $t2 bằng thanh ghi $s2 (i = n) sẽ kết
thúc vòng lặp
+) lw $t3, 0($t0)
Lệnh lw để đọc giá trị của bộ nhớ địa chỉ của A đưa vào thanh ghi $t3
+) bltz $t3, skip_ae
Nếu giá trị thanh ghi (A[i]) bé hơn 0 thì sẽ rẽ nhánh đến lệnh ở
skip_ae ngược lại các giá trị hợp lệ sẽ được lưu vào mảng B như sau
+) sw $t3, 0($t1)
Đưa dữ liệu từ thanh ghi $t3 ra bộ nhớ địa chỉ của thanh ghi $t1
+) add $t1, $t1, 4
addi $s3, $s3, 1
Sau khi đưa dữ liệu sẽ trỏ con trỏ tới phần tử tiếp theo nên tăng giá trị
của địa chỉ lên 4 và số lượng phần tử của mảng B lên 1

**Lệnh skip_ae
+) addi $t0, $t0, 4; addi $t2, $t2, 1
Tăng giá trị mảng A với địa chỉ lên 4 và số lượng phần tử đếm lên 1
o bubble sort
Ở đây chúng ta sẽ sắp xếp lại các giá trị hợp lệ đã lưu vào mảng B
+) la $a0, B
la $a1, ($t1)
addiu $a1, $a1, -4
Lệnh la để lấy giá trị địa chỉ mảng B bắt đầu từ A[0] lưu vào thanh ghi
$a0 và phần tử cuối lưu vào thanh ghi $a1

**sort
+) beq $a0, $a1, done
Kiểm tra xem nếu giá trị địa chỉ đầu trùng giá trị địa chỉ cuối thì rẽ
nhánh đến lệnh done hoàn thành sắp xếp
+) la $v0, B
Đưa địa chỉ của B[j] vào thanh ghi $v0

**loop
+) beq $v0, $a1, end_of_j
Nếu mảng chỉ có 1 phần tử thì sẽ không sắp xếp
+) lw $v1, 0($v0)
lw $a2, 4($v0)
Lệnh lw để đọc dữ liệu B[j] và B[j+1] từ bộ nhớ lưu vào thanh ghi
+) slt $t0, $a2, $v1
bne $t0, $0, swap
Lệnh slt thực hiện so sánh xem nếu thanh ghi $a2 < $v1 (B[j+1] <
B[j]) thì thanh ghi $t0 trả về 1 và ngược lại bằng 0
Lệnh bne thực hiện nếu thanh ghi $t0 khác 0 rẽ nhánh đến lệnh swap
để sắp xếp
**swap
sw $a2, 0($v0)
sw $v1, 4($v0)
Lệnh sw $a2, 0($v0) để lưu giá trị B[j+i] vào vị trí B[j] trong bộ nhớ
khi bé hơn
Lệnh sw $v1, 4($v0) để lưu giá trị của B[j] vào vị trí B[j+1]

Sau khi sắp xếp xong mảng B


o arrayReturn
Thuật toán sẽ kiểm tra các vị trí mảng A nếu lớn hơn hoặc bằng 0 thì
thực hiện đổi chỗ lại tương ứng thứ tự với phần tử trong mảng B đã
được sắp xếp
+) addi $t0, $s0, 0
addi $t1, $s1, 0
add $t2, $0, $0
Khởi tạo lại giá trị của con trỏ tới A[0] và B[0] lưu vào thanh ghi $t0
và $t1
Thiết lập lại biến đếm i = 0 lưu vào thanh ghi $t2

+) beq $t2, $s2, end_loop_ar


Kiểm tra nếu giá trị hai thanh ghi $t2, $s2 bằng nhau (i = n) thì kết
thúc vòng lặp
+) lw $t3, ($t0)
bltz $t3, skip_ar
Lệnh lw để lưu giá trị của A[i] vào thanh ghi $t3 và lệnh bltz kiểm tra
xem nếu A[i] < 0 sẽ nhảy đến lệnh skip_ar
+) lw $t3, ($t1)
sw $t3, 0($t0)
add $t1, $t1, 4
Nếu giá trị A[i] > 0 sẽ thực hiện đổi lại giá trị của A[i] tương ứng với
thứ tự B[index] đã được sắp xếp

You might also like