Nhập vào một ký tự, xuất ra cửa sổ I/O của MARS theo từng yêu cầu sau: ✓ Ký tự liền trước và liền sau của ký tự nhập vào - Ký tự nhập vào chỉ được phép là ba loại: số, chữ thường và chữ
Trang 1Code Giải thích data
.text
main:
li $s0,0
li $s1,1
li $s2,2
li $s3,3
li $s4,4
beq $s0,$s1, True
#false
sub $s2,$s3,$s4
j Fin
True:
add $s2,$s3,$s4
Fin:
li $v0, 10
syscall
#Khai báo vùng nhớ data
#
#Khai báo vùng nhớ chứa mã lệnh
#Code
# i->$s0
# j->$s1
# f->$s2
# g->$s3
# h->$s4
# nếu (i=j) -> True
# false
# f = g – h
# nhảy đến Fin label
# True label
# f = g + h
# Fin label
# lệnh exit data
.text
.globl main
main:
li $s3,0
loop:
beq $t0,$s1,exit
addi $s0,$s0,1
add $t1,$s3,$s0
j loop
exit:
#Khai báo vùng nhớ data
#Khai báo vùng nhớ chứa mã lệnh
#Code
# sum = 0
#
# so sánh i < =N sai thì -> exit
# i=0
# sum = sum + i
# lặp
#
# lệnh exit
3 Bài tập
a Nhập vào một ký tự, xuất ra cửa sổ I/O của MARS theo từng yêu cầu sau:
✓ Ký tự liền trước và liền sau của ký tự nhập vào
- Ký tự nhập vào chỉ được phép là ba loại: số, chữ thường và chữ hoa Nếu ký tự nhập vào rơi vào một trong ba loại, xuất ra cửa sổ đó là loại nào; nếu ký tự nhập không rơi vào một trong
Trang 2ba loại trên, xuất ra thông báo “invalid type”
.data
invalid: asciiz "\ninvalid type"
ktnhap: asciiz "Nhap ky tu: "
kttruoc: asciiz "\nKy tu truoc: "
ktsau: asciiz "\nKy tu sau: "
.text
li $v0, 4
la $a0, ktnhap
syscall
li $v0, 12
syscall
move $s0, $v0
jal ktSo #0-9 = 48 -57
jal ktChuHoa
jal ktChuThuong
or $t3, $t0,$t1
#Khai báo vùng nhớ data
#Khai báo các biến
#
#
#
# Code
#
# $a0 = ktNhap
#
# nhập kí tự
#
# s0 = v0
# nhảy label ktSo từ 0 đến 9 = từ 48 đến 57
# nhảy label ktChuHoa từ A-Z = 65 -90
# nhảy label ktChuThuong từ a-z = 97 – 122
# t3 = t0 | t1
Trang 3or $t3, $t3, $t2
beq $t3,0, false
j print
ktSo:
bge $s0, 48, ktSo_1
j end_ktSo
ktSo_1:
ble $s0, 57, end_ktSo_1
j end_ktSo end_ktSo_1:
li $t0,1 end_ktSo:
jr $ra
ktChuHoa:
bge $s0, 65, ktChuHoa_1
j end_ktChuHoa
ktChuHoa_1:
ble $s0, 90, end_ktChuHoa_1
j end_ktChuHoa end_ktChuHoa_1:
li $t1,1 end_ktChuHoa:
jr $ra
ktChuThuong:
bge $s0, 97, ktChuThuong_1
j end_ktChuThuong
ktChuThuong_1:
ble $s0, 122, end_ktChuThuong_1
j end_ktChuThuong end_ktChuThuong_1:
li $t2,1 end_ktChuThuong:
jr $ra
false:
la $a0, invalid
li $v0, 4
syscall
j end
print:
la $a0, kttruoc
# t3 = t3 | t2
# Nếu t3=0 -> label false
# nhảy đến print
# label ktSo
#
# s0 >= 48 -> ktSo_1
# không thỏa điều kiện trên -> jump end_ktSo
# label ktSo_1
# s0<=57 -> end_ktSo_1
# không thỏa -> jump end_ktSo
# end_ktSo
#
#
# jump $ra
# label ktChuHoa
#
# s0 >= 65 -> ktChuHoa_1
# không thỏa -> jump end_ ktChuHoa
# label ktChuHoa_1
# s0<=90 -> end_ ktChuHoa_1
# không thỏa -> jump end_ ktChuHoa
# end_ ktChuHoa_1
#
#
# jump $ra
# label ktChuThuong
#
# s0 >= 97 -> ktChuThuong_1
# không thỏa -> jump end_ ktChuThuong
# label ktChuThuong _1
# s0<=122-> end_ ktChuThuong _1
# không thỏa -> jump end_ ktChuThuong
# end_ ktChuThuong _1
#
#
# jump $ra
#label false
# a0 = invalid
# v0 = 4 -> in chuỗi
#
#jump label end
#label print
#a0 = kttruoc
Trang 4li $v0, 4
syscall
addi $a0, $s0, -1
li $v0, 11
syscall
la $a0, ktsau
li $v0, 4
syscall
addi $a0, $s0, 1
li $v0, 11
syscall
end:
# v0=4 -> in chuỗi
#
# a0 = s0 – 1
# in kí tự
#
#a0 = ktsau
# v0=4 -> in chuỗi
#
# a0 = s0 + 1
# in kí tự
Bt bổ sung
a.Con trỏ là gì? Chức năng của con trỏ? Mảng là gì? Chức năng của mảng? Con trỏ là gì?
- Con trỏ là một công cụ hiệu quả giúp tăng hiệu năng của chương trình và thực tế nhiều nhiệm vụ không thể thực hiện được nếu như không sử dụng con trỏ Chức năng của con trỏ?
- Con trỏ được dùng để trỏ tới tới địa chỉ trên bộ nhớ nơi được dùng để lưu trữ giá trị của biến Một biến sau khi khai báo nó sẽ có 4 đặc tính như sau: Tên biến Giá trị hiện tại của biến Địa chỉ trên bộ nhớ nơi lưu trữ giá trị của biến Kiểu dữ liệu Mảng là gì? Mảng (Array) là một trong các cấu trúc dữ liệu quan trọng nhất Mảng có thể lưu giữ một số phần tử cố định và các phần tử này nền có cùng kiểu Hầu hết các cấu trúc dữ liệu đều sử dụng mảng để triển khai giải thuật Chức năng của mảng? Mảng được dùng để hiện thực các vector và các ma trận cũng như các loại bảng chữ nhật Nhiều cơ sở dữ liệu từ nhỏ đến lớn chứa (hoặc bao gồm) các mảng một chiều mà các phần tử là các bản ghi Mảng cũng được dùng để hiện thực các cấu trúc dữ liệu khác, như đống, bảng băm, hàng đợi hai đầu, hàng đợi, ngăn xếp, xâu và VList
b Thủ tục là gì? Trình bày luồng hoạt động của một thủ tục trong MIPS MIPS hỗ trợ một số thanh ghi để lưu trữ các dữ liệu phục vụ cho thủ tục • Đối số $a0, $a1, $a2, $a3 • Kết quả trả về $v0, $v1 • Biến cục bộ $s0, $s1, , $s7 • Địa chỉ quay về $ra Cấu trúc của một thủ tục: Đầu thủ tục entry_label: addi $sp,$sp, -framesize # khai báo kích thước cho stack sw $ra, framesize-4($sp) # cất địa chỉ trở về của thủ tục trong $ra vào ngăn xếp
Trang 5(dùng khi gọi hàm lồng nhau) Lưu tạm các thanh ghi khác (nếu cần) Thân thủ tục (có thể gọi các thủ tục khác ) Cuối thủ tục Phục hồi các thanh ghi khác (nếu cần) lw $ra, framesize-4($sp) # lấy địa chỉ trở về ra $ra addi $sp,$sp, framesize jr $ra Gọi thủ tục: jal entry_label
c Ngăn xếp(stack là gì)? Trình bày cấu trúc của ngăn xếp và kể tên ứng dụng của ngăn xếp ? Ngăn xếp(stack là gì)?
- Stack là một kiểu danh sách tuyến tính đặc biệt mà phép bổ sung và phép loại bỏ luôn luôn được thực hiện ở một đầu (gọi là đỉnh) Hay còn có một định nghĩa khác: Trình bày cấu trúc của ngăn xếp và kể tên ứng dụng của ngăn xếp ? Ngăn xếp Stack là một cấu trúc
dữ liệu trừu tượng làm việc theo nguyên lý vào sau ra trước LIFO (last in first out) Xử lý gọi hàm trong C/C++ - Trong máy tính, sử dụng để tính giá trị biểu thức, xử lý ngắt - Trong các chương trình biên dịch - Trong trình duyệt web, trình soạn thảo văn bản - Định giá biểu thức + Biểu thức trung tố: toán tử hai ngôi đứng giưã hai toán hạng, toán tử một ngôi đứng trước toán hạng + Biểu thức hậu tố : toán tử đứng sau toán hạng + Biểu thức tiền tố : toán tử đứng trước toán hạng
D,
Trang 6Code Giải thích data
input_num: asciiz"a = "
IsPrime: asciiz " la so nguyen to"
IsNotPrime: asciiz " khong la so
nguyen to"
.text
li $v0,4
la $a0,input_num
syscall
#Khai báo vùng nhớ data
#Khai báo input
#
#
#
#
# $v0 = 4 -> in
#
#
#
Trang 7li $v0, 5
syscall
move $t0, $v0
ble $t0, 1, isNotPrime
addi $t1, $zero, 2
Loop:
beq $t1, $t0, isPrime
div $t0, $t1
mfhi $s0
beq $s0, $zero, isNotPrime
addi $t1, $t1, 1
j Loop
isNotPrime:
li $v0, 1
add $a0, $zero, $t0
syscall
li $v0, 4
la $a0, IsNotPrime
syscall
j exit
isPrime:
li $v0, 1
add $a0, $zero, $t0
syscall
li $v0, 4
la $a0, IsPrime
syscall
exit:
# $v0 = 5 -> Nhập
# input number
# dịch $v0 sang $t0
#
# $t1 <= 1 nếu đúng -> isNotPrime
# $t1 = 2
#
#
# t1<=t0
#
# chia dư
# s0<=0
# i=i+1
# lặp
#
# $v0 = 1 -> in số nguyên
#
#
# $v0 = 4 - > in địa chỉ
#
#
#
#
# $v0 = 1 -> in số nguyên
#
#
# $v0 = 4 - > in địa chỉ
#
#
f,
Trang 8Code Giải thích data
.text
li $v0, 5
syscall
move $s0, $v0
sub $s0, $s0, 2
li $s1, 0
li $a1,1
li $a2,1
li $a0, 1
li $v0, 1
syscall
li $a0, 32
li $v0, 11
syscall
li $a0, 1
li $v0, 1
#Khai báo vùng nhớ data
#Code
# v0 = 5 -> nhập
#
# s0 = v0
# s0 = s0-2
#loop counter
#
#
#
#
#
#print space
#
# in kí tự
#
#
#
#
Trang 9syscall
jal while
j end
while:
beq $s1, $s0, end_loop
li $a0, 32
li $v0, 11
syscall
add $a1, $a1, $a2
move $a0, $a1
li $v0, 1
syscall
#swap
move $a3, $a1
move $a1, $a2
move $a2, $a3
addi $s1, $s1, 1
j while
end_loop:
jr $ra
end:
#
#
#
#
#
#
#
# a1=1, a2=1,a3 (a3=temp)
#print space
#
#
#
#
#
#
#
#
#swap
#
#
#
#
# counter +1
#
#
#
#
#