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... Tổng tất cả các phần tử của mảng... Người sử dụng nhập vào chỉ
Trang 1LAB 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
Trang 2Code Giải thích 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
#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)
Trang 3beq $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
li $v0,4
la $a0,Min
syscall
li $v0,1
add $a0,$s1,$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
1.2 Tổng tất cả các phần tử của mảng
Trang 4Code Giải thích data
phantu: asciiz "Nhap so phan tu: "
tong: asciiz "\nTong: "
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
li $v0, 5 syscall
sw $v0, ($a1) addi $t0, $t0, 1 addi $a1, $a1, 4
j loop1
#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]
# label loop1
#t0 = s0-> end_loop1
# v0=5-> nhập int
#
#input a[i]
#i=i+1
#a[i+1]
# 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
Trang 5li $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
#
#
#
#sum
#
#
# t3=t3+t2
# i++
# a[i+1]
#
#
#
# v0 =4
# a0 = tong
#
# a0 = t3
#
#
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ổ
Trang 6Code Giải thích 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
#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]
#t0 = s0-> end_loop1 Hình 5- 3: in vị trí của phần tử ra cửa sổ
Trang 7li $v0, 5 syscall
sw $v0, ($a1) addi $t0, $t0, 1 addi $a1, $a1, 4
j loop1
end_loop1:
li $t0, 0
la $a1, arr
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
# 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ự
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 Code MIPS Giải Thích
if (i<j) A[i]= i;
else A[i] = j; add $s4,$s3,$s0 slt $t0,$s0,$s1
beq $t0,$0,ELSE
sw $s0,0($s4) ELSE:
sw $s1,0($s4)
#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.
Trang 8phantu: asciiz "Nhap so phan tu n: "
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:
li $v0, 5
syscall
sw $v0, ($a1)
addi $t0, $t0, 1
beq $t0, $s0, end_loop1
addi $a1, $a1, 4
j loop1
end_loop1:
li $t0,0
la $a1, arr
addi $s1, $s0, -1
jal soft
loop2:
lw $a0, ($a1)
li $v0, 1
syscall
li $a0, 32
li $v0, 11
syscall
addi $t0, $t0, 1
beq $t0, $s0, end_loop2
addi $a1, $a1, 4
j loop2
end_loop2:
li $v0, 10
syscall
#
#
#
#
# v0=4
# a0=phantu
#
#v0=5
#
#index
#counter
#a1[10]
#
# input array
#
#
# a1 có v0
#
#i++
# so sánh t0 = s0 -> end_loop1
#a[i+1]
#
#
#counter
#
#n-1 for soft loop
#
#
#
#
#
#print space
#
#
#
#i++
#
#a[i+1]
#
#
#
#
#
Trang 9soft:
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
#
#
# 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
#
#
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
Trang 10phantu: asciiz "N = "
input: asciiz "\nARR = "
out: asciiz "\noutput = "
arr: word 0:10
.text
li $v0, 4
la $a0, phantu
syscall
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
#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
#
#
Trang 11addi $t0, $t0, 1 subi $a1, $a1, 4
j loop2
end_loop2:
end_program:
#i++
#a[i-1]
#
#
#