Nguyễn Hoàng Duy Lab5

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 6

Nguyễn Hoàng Duy

MSSV: 22520327
IT012.O14.2

BÁO CÁO LAB 05

Bài 1: Thao tác với mảng


Mảng với n phần tử là một chuỗi n phần tử liên tiếp nhau trong bộ nhớ. Thao tác với
mảng trong MIPS là thao tác trực tiếp với byte/word trong bộ nhớ.
▪ Để cấp phát chuỗi word hoặc byte trong bộ nhớ, có giá trị khởi tao sử dụng
“.word” hoặc “.byte” trong “.data”
▪ Để cấp phát chuỗi byte không có giá trị khởi tạo trước, sử dụng “.space” trong
“.data”
Cho ba mảng với cấp phát dữ liệu trong bộ nhớ như sau:

Mảng array1 có 10 word, kích thước được lưu trong size1; Mảng array2 có 16 byte,
kích thước được lưu trong size2; Mảng array3 có 8 byte, kích thước được lưu trong
size3.
Viết code trong phần “.text” thực hiện riêng từng phần việc:
✓ In ra cửa sổ I/O của MARS tất cả các phần tử của mảng array1 và array2

.data
space: .asciiz " "
array1: .word 5, 6, 7, 8, 1, 2, 3, 9, 10, 4
size1: .word 10
array2: .byte 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
size2: .word 16
array3: .space 8
size3: .word
endl: .asciiz "\n"
.text

li $t0, 0
la $t1, array1
lw $s0, size1

#mảng 1
loop1:
sll $t2, $t0, 2
add $t3, $t1, $t2
lw $a0, 0($t3)
li $v0, 1
syscall
addi $t0, $t0, 1
la $a0, space
li $v0, 4
syscall
blt $t0, $s0, loop1

#xuống dòng
li $v0, 4
la $a0, endl
syscall
li $t0, 0
la $t1, array2
lw $s0, size2

#mảng 2
loop2:
add $t3, $t1, $t0
lb $a0, 0($t3)
li $v0, 1
syscall
addi $t0,$t0, 1
li $v0, 4
la $a0, space
syscall
blt $t0, $s0, loop2
end:

✓ Gán các giá trị cho mảng array3 sao cho array3[i] = array2[i] + array2[size2 - 1 – i]

.data
space: .asciiz " "
mang1: .word 5, 6, 7, 8, 1, 2, 3, 9, 10, 4
size1: .word 10
mang2: .byte 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
size2: .word 16
mang3: .space 8
size3: .word 8
sPrint1: .asciiz "Nhap vao mang can truy xuat: "
sPrint2: .asciiz "Nhap vi tri cua phan tu can truy xuat: "
sPrint3: .asciiz "Phan tu can truy xuat la: "

.text

lw $s2, size2 #$s2 lưu giá trị mang2


lw $s3, size3
la $t2, array2 #$t2 là địa chỉ đầu của mang2
la $t3, array3
li $t1, 0 #$t1 là biến i
addi $s4, $s2, -1 #$s4 lưu giá trị mang2 – 1

loop:
add $s0, $t1, $t2 #mang2[i]
sub $s5, $s4, $t1 #[size2 - 1 - i]
add $t0, $s5, $t2 #mang2[size2 - i - 1]
lb $t4, 0($s0)
lb $t5, 0($t0)
add $t6, $t4, $t5
add $t7, $t1, $t3
sb $t6, 0($t7)
addi $t1, $t1, 1
ble $t1, $s3, loop

li $t1, 0
loopPrint:
add $t2, $t1, $t3
lb $a0, 0($t2)
li $v0, 1
syscall
la $a0, space
li $v0, 4
syscall
addi $t1, $t1, 1
blt $t1, 8, loopPrint

✓ Người sử dụng nhập vào mảng thứ mấy và chỉ số phần tử cần lấy trong mảng
đó, chương trình xuất ra phần tử tương ứng.
.data
space: .asciiz " "
array1: .word 5, 6, 7, 8, 1, 2, 3, 9, 10, 4
size1: .word 10
array2: .byte 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
size2: .word 16
array3: .space 8
size3: .word 8
sPrint1: .asciiz "Nhap vao mang can truy xuat: "
sPrint2: .asciiz "Nhap vi tri cua phan tu can truy xuat: "
sPrint3: .asciiz "Phan tu can truy xuat la: "
.text
lw $s2, size2 #$s2 luu gia tri array2
lw $s3, size3
la $t2, array2 #$t2 la dia chi dau cua array2
la $t3, array3
li $t1, 0 #$t1 la bien i
addi $s4, $s2, -1 #$s4 luu gia tri array2 - 1
loop:
add $s0, $t1, $t2 #array2[i]
sub $s5, $s4, $t1 #[size2 - 1 - i]
add $t0, $s5, $t2 #array2[size2 - i - 1]

lb $t4, 0($s0)
lb $t5, 0($t0)
add $t6, $t4, $t5

add $t7, $t1, $t3


sb $t6, 0($t7)

addi $t1, $t1, 1


ble $t1, $s3, loop
li $t1, 0
# loopPrint:
# add $t2, $t1, $t3
# lb $a0, 0($t2)
# li $v0, 1
# syscall
# la $a0, space
# li $v0, 4
# syscall
# addi $t1, $t1, 1
# blt $t1, 8, loopPrint

la $t1, array1
la $t2, array2
la $t3, array3

lw $s1, size1
lb $s2, size2
lb $s3, size3

la $a0, sPrint1
li $v0, 4
syscall

li $v0, 5
syscall

addi $t4, $v0, 0 #Let $t4 got the input value

beq $t4, 1, Case1


beq $t4, 2, Case2
beq $t4, 3, Case3

Case1:
la $a0, sPrint2
li $v0, 4
syscall

li $v0, 5
syscall
addi $t4, $v0, 0

la $a0, sPrint3
li $v0, 4
syscall

sll $t4, $t4, 2 #$t4 là chỉ số; shift left logic $t4 2 để lấy chỉ số
add $t4, $t4, $t1 #Lấy giá trị bằng cách cộng $t4 với vị trí đầu trong mảng
lw $a0, ($t4)
li $v0, 1
syscall
j end

Case2:
la $a0, sPrint2
li $v0, 4
syscall

li $v0, 5
syscall
addi $t4, $v0, 0

la $a0, sPrint3
li $v0, 4

syscall
add $t4, $t4, $t2

lb $a0, ($t4)
li $v0, 1
syscall

j end

Case3:
la $a0, sPrint2
li $v0, 4
syscall

li $v0, 5
syscall
addi $t4, $v0, 0

la $a0, sPrint3
li $v0, 4
syscall

add $t4, $t4, $t3


lb $a0, ($t4)
li $v0, 1
syscall

j end
end:
2. Thao tác với con trỏ
Con trỏ là một biến lưu địa chỉ của một biến khác. Thao tác với con trỏ trong MIPS là
thao tác trực tiếp với địa chỉ bộ nhớ.
Thực hiện lại các yêu cầu của nội dung 1 với con trỏ

In ra cửa sổ I/O của MARS tất cả các phần tử của mảng array1 và array2:
.data

array1: .word 5, 6, 7, 8, 1, 2, 3, 9, 10, 4


size1: .word 10
array2: .byte 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
size2: .word 16
array3: .space 8
size3: .word 8
space1: .asciiz " "
endl: .asciiz "\n"
sPrint1: .asciiz "Mang 1 : "
sPrint2: .asciiz "Mang 2 : "
.text
lw $s0, size1
la $s1, array1
add $t0, $zero, $s1

You might also like