LAB 5: THAO TÁC VỚI MẢNG VÀ CON TRỎ TRONG MIPS
1) Bài tập (chỉ sử dụng con trỏ)
1.1. Xuất ra giá trị lớn nhất và nhỏ nhất của mảng
Hình 5- 1: Lưu đồ thuật toán Xuất ra giá trị lớn nhất và nhỏ nhất của mảng
1
Code
.data
array1: .space 200
size1: .word 200
Max: .asciiz "\n Max: "
Min: .asciiz "\n Min: "
string1: .asciiz "Moi nhap so luong phan tu: "
string2: .asciiz "Nhap gia tri cac phan tu: \n"
.text
li $v0, 4
la $a0, string1
syscall
li $v0, 5
syscall
la $s1, size1
sw $v0, 0($s1)
li $v0, 4
la $a0, string2
syscall
la $a1, array1
lw $a2, size1
add $t1, $a1, $0
add $t2, $a1, $a2
NHAP:
li $v0, 5
syscall
sb $v0, 0($t1)
addi $t1, $t1, 1
slt $t3, $t1, $t2
bne $t3, $0, NHAP
j Tim_Min_Max
Tim_Min_Max:
la $a1, array1
lw $a2, size1
add $t0, $a1, $0
add $t1, $a1, $a2
lb $s0, 0($t0)
lb $s1,0($t0)
FIND:
lb $t3, 0($t0)
slt $t4, $s0, $t3
2
Giải thích
#Khai báo vùng nhớ data
#mảng array có kích thước 200 byte
#
#
#
#
#
#
#v0 = 4 -> in chuỗi
# a0 = string1
#
# v0=5 -> Nhập int
#
# s1 = size1
#
#
# v0=4 -> in chuỗi
# a0=string2
#
#nap dia chi cua mang array1 vao $a1
#nap n vao $a2
#Tao con tro chi vao mang array1[0]
#Tao con tro chi vao mang array1[size1]
#
#
#
#
#Tang con tro len 1 don vi
#Xem con tro co chay den cuoi mang chua
#
#
#
#
#Nap dia chi mang Array1 cho $a1
#nap gia tri size1 cho $a2
#Khoi tao con tro chi vao mang Array[0]
#Khoi tao con tro chi vao mang Array[size1]
#$s0=array1[0] , luu gia tri Max tam
#$s0=array1[0] , luu gia tri Min tam
#
#$t3=array1[0]
#if( $s0<$t3)
beq $t4, $0, ELSE1
add $s0, $t3, $0
j ELSE2
ELSE1:
slt $t4,$s1,$t3
bne $t7,$0,ELSE2
add $s1,$t3,$0
ELSE2:
addi $t0,$t0,1
slt $t3,$t0,$t1
bne $t3,$0,FIND
li $v0,4
la $a0,Max
syscall
li $v0,1
add $a0,$s0,$0
syscall
#
#Gan $s0=$t3
#
#
#if($s1<$t3)
#
#Gan $s1=$t3
#
#tăng con trỏ 1 đơn vị
#xem con trỏ chạy đến cuối mảng chưa
#Neu chua cuoi mang thì -> FIND
#Xuất chuỗi
#
#
# Xuất giá trị lớn nhất
#
#
#
#Xuất chuỗi
#
#
#Xuất giá trị nhỏ nhất
li $v0,4
la $a0,Min
syscall
li $v0,1
add $a0,$s1,$0
syscall
1.2. Tổng tất cả các phần tử của mảng
3
Hình 5- 2: Lưu đồ thuật toan tính tổng tất cả các phần tử của mảng
Code
Giải thích
.data
#Khai báo vùng nhớ data
phantu: .asciiz "Nhap so phan tu: "
#
tong: .asciiz "\nTong: "
#
arr: .word 0:10
# mảng arr[10]
.text
#code
li $v0, 4
# v0 = 4 -> in string
la $a0, phantu
# a0 = phantu
syscall
#
li $v0, 5
#v0 =5 -> nhập int
syscall
#
move $s0, $v0
#index
li $t0, 0
#counter
la $a1, arr
#a1[10]
loop1:
# label loop1
beq $t0, $s0, end_loop1
#t0 = s0-> end_loop1
li $v0, 5
# v0=5-> nhập int
syscall
#
sw $v0, ($a1)
#input a[i]
addi $t0, $t0, 1
#i=i+1
addi $a1, $a1, 4
#a[i+1]
j loop1
#
4
end_loop1:
#
#
#
#sum
#
#
# t3=t3+t2
# i++
# a[i+1]
#
#
#
# v0 =4
# a0 = tong
#
# a0 = t3
#
#
li $t0, 0
la $a1, arr
li $t3, 0
loop2:
beq $t0, $s0, end_loop2
lw $t2, ($a1)
add $t3, $t3, $t2
addi $t0, $t0, 1
addi $a1, $a1, 4
j loop2
end_loop2:
li $v0, 4
la $a0, tong
syscall
move $a0, $t3
li $v0, 1
syscall
1.3. Người sử dụng nhập vào chỉ số của một phần tử nào đó và giá trị của phần tử
đó được in ra cửa sổ
5
Hình 5- 3: in vị trí của phần tử ra cửa sổ
Code
Giải thích
#Khai báo vùng nhớ data
#
#
# mảng arr[10]
#code
# v0 = 4 -> in string
# a0 = phantu
#
#v0 =5 -> nhập int
#
#index
#counter
#a1[10]
.data
phantu: .asciiz "Nhap so phan tu: "
input: "Nhap phan tu can in: "
arr: .word 0:10
.text
li $v0, 4
la $a0, phantu
syscall
li $v0, 5
syscall
move $s0, $v0
li $t0, 0
la $a1, arr
loop1:
beq $t0, $s0, end_loop1
#t0 = s0-> end_loop1
6
li $v0, 5
syscall
sw $v0, ($a1)
addi $t0, $t0, 1
addi $a1, $a1, 4
j loop1
end_loop1:
li $t0, 0
la $a1, arr
# v0=5-> nhập int
#
#input a[i]
#i=i+1
#a[i+1]
#
#
#
#
#
# v0 =4
#
#
# v0=5
#
# s2 = v0-4
# a1 = a1+a2
# Lệnh chuyển dữ liệu từ a1 vào t2
# a0=t2
#
# in kí tự
li $v0, 4
la $a0, input
syscall
li $v0, 5
syscall
mul $a2, $v0, 4
add $a1, $a1, $a2
lw $t2, ($a1)
move $a0, $t2
li $v0, 1
syscall
1.4. Nhập một mảng các số nguyên n phần tử (nhập vào số phần tử và giá trị của
từng phần tử).
Code C
if (i
else A[i] = j;
Code MIPS
add $s4,$s3,$s0
slt $t0,$s0,$s1
beq $t0,$0,ELSE
sw $s0,0($s4)
ELSE:
sw $s1,0($s4)
Giải Thích
#con trỏ $s4 trỏ đến A[i]
#if( $s0 < $s1 )
#neu $s0<$s1 -> ELSE
#A[i]=i
#
#A[i]=j
2) Bài tập bổ sung
2.1. Viết chương trình hợp ngữ nhập mảng gồm N phần tử. Sắp xếp mảng theo thứ
tự giảm dần.
Code
Giải thích
7
.data
#
phantu: .asciiz "Nhap so phan tu n: " #
arr: .word 0:10
#
.text
#
li $v0, 4
# v0=4
la $a0, phantu
# a0=phantu
syscall
#
li $v0, 5
#v0=5
syscall
#
move $s0, $v0
#index
li $t0, 0
#counter
la $a1, arr
#a1[10]
#
loop1:
# input array
li $v0, 5
#
syscall
#
sw $v0, ($a1)
# a1 có v0
#
addi $t0, $t0, 1
#i++
beq $t0, $s0, end_loop1
# so sánh t0 = s0 -> end_loop1
addi $a1, $a1, 4
#a[i+1]
j loop1
#
end_loop1:
#
li $t0,0
#counter
la $a1, arr
#
addi $s1, $s0, -1
#n-1 for soft loop
jal soft
#
loop2:
#
lw $a0, ($a1)
#
li $v0, 1
#
syscall
#
#print space
#
li $a0, 32
#
li $v0, 11
#
syscall
#i++
addi $t0, $t0, 1
#
beq $t0, $s0, end_loop2
#a[i+1]
addi $a1, $a1, 4
#
j loop2
#
end_loop2:
#
li $v0, 10
#
syscall
#
8
soft:
#
#
# counter for max loop
#
#
#
#
#a1 not chage, #a2 change. $a3 = max address
#
# v1<=v0 -> compare
#
#
#
# v1<=k0 -> change
#
#
# a3=a2
#
# t1=s1+1
#t1=s0->end_max
# a2=a2+4
#
#
#
#
#
# increase counter
#t0=t0+1
#t0=s1-> end_soft
#a[i+1]
#
#
#counter
#
#
move $t1, $t0
lw $v0, ($a1)
move $a2, $a1
move $a3, $a1
max:
lw $v1, ($a2)
bgt $v1, $v0, compare
j continue
compare:
lw $k0, ($a3)
bgt $v1, $k0, change
j continue
change:
move $a3, $a2
continue:
addi $t1, $t1, 1
beq $t1, $s0, end_max
addi $a2, $a2, 4
j max
end_max:
lw $k0, ($a3)
sw $k0, ($a1)
sw $v0, ($a3)
addi $t0, $t0, 1
beq $t0, $s1, end_soft
addi $a1, $a1, 4
j soft
end_soft:
li $t0,0
la $a1, arr
jr $ra
2.2. Viết chương trình hợp ngữ nhập vào N và mang gồm N phần tử. In ra mảng
đảo ngược của mảng vừa nhập
Code
Giải thích
9
.data
phantu: .asciiz "N = "
input: .asciiz "\nARR = "
out: .asciiz "\noutput = "
arr: .word 0:10
.text
li $v0, 4
la $a0, phantu
syscall
#Khai báo vùng nhớ data
# nhập n
# mảng arr[i]
# xuất output
# mảng arr 10 phần tử
# code
# v0=4
# a0= phantu
# xuất string
#
#v0=5 -> nhập int
#
#index
#
# v0=4
#a0=input
#
#counter
#a1[10]
#
#
#t0=s0 -> end_loop1
# v0=5
#
#input a[i]
# i=i+1
#a[i+1]
#
#
#
#
#
#
# a1= a1+4
#
#
# t0=s0 -> end_loop2
# load a1 vào a0
# v0=1 -> in int
#
#print space
#
#
li $v0, 5
syscall
move $s0, $v0
li $v0, 4
la $a0, input
syscall
li $t0, 0
la $a1, arr
loop1:
beq $t0, $s0, end_loop1
li $v0, 5
syscall
sw $v0, ($a1)
addi $t0, $t0, 1
addi $a1, $a1, 4
j loop1
end_loop1:
li $t0, 0
li $v0, 4
la $a0, out
syscall
subi $a1, $a1, 4
syscall
loop2:
beq $t0, $s0, end_loop2
lw $a0, ($a1)
li $v0,1
syscall
li $a0, 32
li $v0,11
syscall
10
addi $t0, $t0, 1
subi $a1, $a1, 4
j loop2
end_loop2:
end_program:
#i++
#a[i-1]
#
#
#
11