LAB 5: THAO TÁC VỚI MẢNG VÀ CON TRỎ TRONG MIPS 1) Bài tập (chỉ sử dụng trỏ) 1.1 Xuất giá trị lớn nhỏ mảng Hình 5- 1: Lưu đồ thuật tốn Xuất giá trị lớn nhỏ mảng 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, la $a0, string1 syscall li $v0, syscall la $s1, size1 sw $v0, 0($s1) li $v0, la $a0, string2 syscall la $a1, array1 lw $a2, size1 add $t1, $a1, $0 add $t2, $a1, $a2 NHAP: li $v0, syscall sb $v0, 0($t1) addi $t1, $t1, 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 Giải thích #Khai báo vùng nhớ data #mảng array có kích thước 200 byte # # # # # # #v0 = -> 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 tro chi vao mang array1[0] #Tao tro chi vao mang array1[size1] # # # # #Tang tro len don vi #Xem tro co chay den cuoi mang chua # # # # #Nap dia chi mang Array1 cho $a1 #nap gia tri size1 cho $a2 #Khoi tao tro chi vao mang Array[0] #Khoi tao 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 in string la $a0, phantu # a0 = phantu syscall # li $v0, #v0 =5 -> nhập int syscall # move $s0, $v0 #index li $t0, #counter la $a1, arr #a1[10] loop1: # label loop1 beq $t0, $s0, end_loop1 #t0 = s0-> end_loop1 li $v0, # v0=5-> nhập int syscall # sw $v0, ($a1) #input a[i] addi $t0, $t0, #i=i+1 addi $a1, $a1, #a[i+1] j loop1 # end_loop1: # # # #sum # # # t3=t3+t2 # i++ # a[i+1] # # # # v0 =4 # a0 = tong # # a0 = t3 # # li $t0, la $a1, arr li $t3, loop2: beq $t0, $s0, end_loop2 lw $t2, ($a1) add $t3, $t3, $t2 addi $t0, $t0, addi $a1, $a1, j loop2 end_loop2: li $v0, la $a0, tong syscall move $a0, $t3 li $v0, syscall 1.3 Người sử dụng nhập vào số phần tử giá trị phần tử in cửa sổ Hình 5- 3: in vị trí phần tử cửa sổ Code Giải thích #Khai báo vùng nhớ data # # # mảng arr[10] #code # v0 = -> 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, la $a0, phantu syscall li $v0, syscall move $s0, $v0 li $t0, la $a1, arr loop1: beq $t0, $s0, end_loop1 #t0 = s0-> end_loop1 li $v0, syscall sw $v0, ($a1) addi $t0, $t0, addi $a1, $a1, j loop1 end_loop1: li $t0, 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 liệu từ a1 vào t2 # a0=t2 # # in kí tự li $v0, la $a0, input syscall li $v0, syscall mul $a2, $v0, add $a1, $a1, $a2 lw $t2, ($a1) move $a0, $t2 li $v0, syscall 1.4 Nhập mảng số nguyên n phần tử (nhập vào số phần tử giá trị phần tử) Code C if (i end_loop1 addi $a1, $a1, #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, # syscall # #print space # li $a0, 32 # li $v0, 11 # syscall #i++ addi $t0, $t0, # beq $t0, $s0, end_loop2 #a[i+1] addi $a1, $a1, # j loop2 # end_loop2: # li $v0, 10 # syscall # soft: # # # counter for max loop # # # # #a1 not chage, #a2 change $a3 = max address # # v1 compare # # # # v1 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, beq $t1, $s0, end_max addi $a2, $a2, j max end_max: lw $k0, ($a3) sw $k0, ($a1) sw $v0, ($a3) addi $t0, $t0, beq $t0, $s1, end_soft addi $a1, $a1, 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 mang gồm N phần tử In mảng đảo ngược mảng vừa nhập Code Giải thích .data phantu: asciiz "N = " input: asciiz "\nARR = " out: asciiz "\noutput = " arr: word 0:10 text li $v0, 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, syscall move $s0, $v0 li $v0, la $a0, input syscall li $t0, la $a1, arr loop1: beq $t0, $s0, end_loop1 li $v0, syscall sw $v0, ($a1) addi $t0, $t0, addi $a1, $a1, j loop1 end_loop1: li $t0, li $v0, la $a0, out syscall subi $a1, $a1, 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, subi $a1, $a1, j loop2 end_loop2: end_program: #i++ #a[i-1] # # # 11 ... #a1[10] # loop1: # input array li $v0, # syscall # sw $v0, ($a1) # a1 có v0 # addi $t0, $t0, #i++ beq $t0, $s0, end_loop1 # so sánh t0 = s0 -> end_loop1 addi $a1, $a1, #a[i+1] j loop1 # end_loop1:... $s1,0($t0) FIND: lb $t3, 0($t0) slt $t4, $s0, $t3 Giải thích #Khai báo vùng nhớ data #mảng array có kích thước 200 byte # # # # # # #v0 = -> in chuỗi # a0 = string1 # # v0=5 -> Nhập int # # s1