Tải bản đầy đủ (.docx) (11 trang)

CE119Lab03IT012Lab05 có đáp án uit

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (149.51 KB, 11 trang )

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 (ielse 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



×