Professional Documents
Culture Documents
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]
+) 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
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
Thuật toán
o arrayExt
+) la $s1, B: đưa địa chỉ của B vào thanh ghi $s1
**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]