- Ký tự: đặt trong ngoặc nhảy đơn.. ?khai báo dữ liệu .text #viết chương trình sau .text main: #nhãn đề cho người dùng biết nơi bắt đầu chương trình.. #viết chương trình sau đây... đ Nh
Trang 1DAI HOC QUOC GIA TP HO CHI MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THONG TIN KHOA KỸ THUẬT MÁY TÍNH
BAO CAO MON HOC THUC HANH KIEN TRUC MAY TINH
CE119.L12.MTCL.1
SINH VIEN THUC HIEN: NGUYÊN TUẦN ANH - 19520794
TP HÒ CHÍ MINH, 12/2020
Trang 2MUC LUC
1.1.4/ Cau trite ctia 1 churong trinh cccccccccssssssssssssssssssscssssssssssssssssseessessssecsssseessssesssssss 2
mm 7
1.1.1/ Cấu trúc 1Ÿ — else -2-+ccccstttrecvEEEEirvEEEttirvttrtrirrrrrrrrrrrrrrrrrrrrrie 10 1.1.2/ Cau tric switch — case 11 1.1.3/ Cấu trúc vòng lặp for 11 1.2/ Thực hàành 5-5-6 55% se S33 h2 31x 13 13 913 13 14.1 15 E13 g7 ng ch che ươm 11 1.2.1/ Chuyên đoạn code trong bảng theo sau sang MIPS và sử dụng MARS để
kiểm tra lại kết quả: 11
1.3/ Bải tẬp ch HH HH HH 1g HH 111.111.1111 15
Trang 3
1.1.2/ Nhắc lại về khai báo biến,kiểu dữ liệu
1.1.3/ Mang vao con trỏ
1.2/ Thực hàành 5-5-6 55% se S33 h2 31x 13 13 913 13 14.1 15 E13 g7 ng ch che ươm
Trang 4DANH MUC HiNH ANH
Sơ đổ giải thuật Yêu cầu 1
Sơ đổ giải thuật Yêu cầu 2
Sơ đổ giải thuật Yêu cầu 3
Sơ đổ giải thuật 1.3 Lab4 Stack trong trường hợp 5!
Stack trong trường hợp 10!
II
Trang 5Biểu diễn thông tin trong bộ nhớ
Chuyển đoạn code
Chuyển đoạn code 2
Bài tập 1.3.a
Bài tập thực hành Bài tập 1.3.a Lab3 Bài tập 1.3.b Lab3 Code trong Yêu cầu 1 Code trong Yêu cầu 2 Code trong Yêu cầu 3 Code Thực hành với đệ quy
IV
Trang 7Chwong 1 LAM QUEN VOI LAP TRINH HOP NGU
1.1/ Ly thuyét
1.1.1/ Bộ nhớ
- Dữ liệu được định nghĩa | byte(8 bits),1 half(2 bytes),1 word(4 bytes)
- | ki tw la | byte dé lu trữ (acsii)
- | sé nguyén la | word dé lu trir
- | 1énh là | word (32 bits) để lưu trữ
1.1.2/ Biéu dién thong tin
- Ky SỐ:
+ Hệ thập phân: 9,10,
+ Hệ thập lục phân: thêm tiền tố Ox Vd: 0x20
- Ký tự: đặt trong ngoặc nhảy đơn Vd: ‘a’
- Chuỗi: đặt trong cặp nháy kép Vd: “UIT” (kết thúc chuỗi là ki ty null)
1.1.3/ Thanh ghi
- Co 32 thanh ghi da dung (thanh ghi 32 bit)
- Biéu dién: tiền tố $ theo sau là chỉ số hoặc tên của thanh ghi ($0 hoặc $t1)
- Thanh ghi Hi và Lo được dành riêng cho phép nhân và phép chia
+ mfhi, mflo (move from hi/lo)
- Quy ước:
+ $at đành cho assembler, $k0 và $kI đành cho hệ điều hành
+ $øp, $sp, $fp, $ra dành cho các mục đích riêng biệt, không nên sử đụng đề lưu
trữ tạm trong quá trình tính toán và lập trình
Trang 8
1.1.4/ Cau trac cia 1 chương trình
Muốn chú thích trong MIPS dùng #
.data
#khai báo biến
?khai báo dữ liệu
.text
#viết chương trình sau text
main:
#nhãn đề cho người dùng biết nơi bắt đầu chương trình
#viết chương trình sau đây
1.1.5/ Khai báo dữ liệu,biến
<tênbiến> <kiểu dữliệu> <danh sách các giá trỊ>
VD:
stringl: ase1z “UIT” #tạo | chuỗi tên stringl với khoi tao “UIT”
varl: word5 #khai bao | s6 nguyén tén varl chiém 1 word lưu trữ, có giá trị
khoi tao la 5
arrayl: space 10 #tạo 1 mang array! co 10 bytes lién tuc nhau, chưa khởi tạo giá
tri
array2: byte ‘a’, ‘b’ #tao | mang array2 c6 2 phan tt, mdi phan tt chiém | byte,
khoi tao gia tri 1a ‘a’, “bỉ
Trang 9
1.2/ Bài tập thực hành
1.2.1/ Sinh viên tìm hiểu tài liệu “Một số lệnh assembly MIPS cơ bản”
Mô phỏng việc thực thi các lệnh và cho biệt chức năng của các lệnh cơ bản sau: add, addi, addu, addiu, sub, subu, and, andi, or, nor, lw, sw, slt, slti, sltu, sltiu,
2 | Addi | Add immediate - Cộng giá trị trong thanh ghi | Addi $s0, $s1,5
thứ 2 với một hằng số 16bit có dấu, lưu vào
thanh ghi thứ nhất
3 | Addu | Add Unsigned - Cộng giá trị không dấu trong | Addu $s0, $s1, $s2
thanh ghi thứ 2, lưu vào thanh ghi thứ nhất (Không bị tràn bit)
4 | Addiu | Add Immediate Unsigned - Công giá trị không | Addiu $s0O, $s1, -5
dấu trong thanh ghi thứ 2 với hằng số 16bit
có dấu, lưu vào thanh ghi thứ nhất (Không bị tràn bit)
5 Sub | Lấy giá trị của thanh ghi thứ 2 trừ cho giátr] | Sub $sO, $s1, $s2
thanh ghi thứ 3 sau đó lưu giá trị vào thanh
ghi thứ nhất
6 Subu | Sub unsigned - Gía trị không dấu trong thanh | Subu $s0, $s1, $s2
ghi thứ 2 trừ cho giá tri khong dau trong
thanh ghi thứ 3 sau đó lưu giá trị vào thanh
Trang 10
ghi thứ nhất
And And từng bit trong thanh ghi thứ 2 với thanh ghi thứ 3 sau đó lưu lại vào thanh ghi thứ nhất
And $s0, $s1, $s2
Andi And immediate - and từng bit trong thanh ghi thứ 2 với hằng số sau khi đổi ra mã nhịn phân theo thứ tự với nhau sau đó lưu lại vào
Or $s0, $s1, $s2
10 Nor Or từng bit trong thanh ghi thứ 2 với thanh
ghi thứ 3 theo thứ tự với nhau, sau đó not lại rồi lưu vào thanh ghi thứ nhất
Nor $sO, $s1, $s2
11 Lw Load word - Lấy giá trị ở địa chỉ bộ nhớ đã
được chỉ định để lưu vào thanh ghi
Lw $sO 4($s1)
12 Sw Store word - Lấy giá trị trong thanh ghi lưu
vào bộ nhớ với giá trị đã được chỉ định
Sw $s0 4($s1)
13 Slt Set less than - Nếu giá trị trong thanh ghi thứ
2 bé hơn giá trị trong thanh ghi thứ 3 thì giá trị trong thanh ghi thứ nhất bằng 1, ngược lại
thi bang 0
Slt $s0, $51, $s2
14 Slti Set less than immediate - Néu gia trị trong
thanh ghi thir 2 bé hon hang s6 thi gia tri
trong thanh ghi thứ nhất bằng 1, ngược lại
nếu lớn hơn thì bằng 0 Slti $s0, $s1, 5
Trang 11
15 Situ Set less than unsigned - néu gia trị không Sltu $s0, $s1, $s2
dấu trong thanh ghi thứ 2 bé hơn giá trị không dấu trong thanh ghi thứ 3 thì giá trị trong thanh ghi thứ nhất bằng 1, ngược lại
nếu lớn hơn thì bằng 0
16 | Sltiu | Setless than immediate unsigned - nếu giá Sltiu $sO, $s1, -5
trị không dấu trong thanh ghi thứ 2 bé hơn hằng số thì giá trị trong thanh ghi thứ nhất bằng 1, ngược lại nếu lớn hơn thì bằng 0
Iw $t0, var1 Lưu giá trị ở 23 trong bộ nhớ vào trong thanh ghi
Trang 12array 1:.space 12
text start: la $tO, array]
Khai báo mảng array 1 có 12byte
Gan mảng array1 vào thanh ghi $tO Cho $t1 = 5
Lưu giá trị của $t1 vào ô nhớ địa chỉ là giá trị của
$tO Cho $t1 = 13 Lưu giá trị của $t1 vào ô nhớ địa chỉ là 4 cộng giá trị của $t0
Cho $t1 = -7 Lưu giá trị của $t1 vào ô nhớ địa chỉ là 8 công giá trị của $t0
Li $v0,5 syscall
Trang 13
1.3/ Bài tập
1.3.1/ Nhập vào một chuỗi, xuất ra ctra s6 I/O cua MARS theo timg yéu cau sau: a) Khai báo và xuất ra cửa sô I/O 2 chudi co gia trị như sau:
- Chuỗi 1: Chao ban! Ban la sinh vien nam thu may?
- Chuỗi 2: Hihi, minh la sinh vien nam thu l ^-^
(CC
BH
ỶỲ Gan cho string1: "Chao ban! Ban la
sinh vien nam thu may?\n"
Gan cho string 2:"Hihi, minh la sinh
vien nam thu 1 ^-^"
Hình 1.1: Sơ đồ giải thuật 1.3.1a Labl
b) Biểu diễn của 2 chuỗi trên dưới bộ nhớ là gì?
Trang 14
Bang 1.3: Biéu diễn thông tin trong bộ nhớ
al(Khoảng trống)n nis(Khoảng trống) iv(khoảng trống)h n(khoảng trống)ne t(khoang trống)ma m(khoảng trống)uh (khoảng trống)?ya hiH (khoảng xuống dòng) m(khoảng trống),i (khoảng trống)hni s(khoảng trống)al (khoảng trống)hni neiv
man(khoảng trống) uht(khoảng trống)
^(khoảng trống) 1(khoảng trống)
Trang 15
0x00005e2d ^-
©) Xuất ra lại đúng chuỗi đã nhập
Ví dụ:
Nhap: Truong Dai hoc Cong nghe Thong tin
Xuat: Truong Dai hoc Cong nghe Thong tin
Trang 16đ) Nhập vào 2 số nguyên sau đó xuất tổng của 2 số nguyên nảy
Hình 1.2: Sơ đồ giải thuật 1.3.1d Labl
Chương 2 CẤU TRÚC ĐIÊU KHIỂN
1.1/ Lý thuyết
1.1.1/ Câu trúc if— else
Đầu tiên thực hiện việc so sánh điều kiện
+ So sanh bang + So sanh khéng bang + So sánh bé hơn, bé hơn hoặc bằng + So sánh lớn hơn, lớn hơn hoặc bằng
10
Trang 17- Néu diéu kién đúng, thực hiện lệnh và có thể là đoạn lệnh ở bên trong, nếu sai thì tới điều kiện tiếp theo hoặc kết thúc chương trình
1.1.2/ Cấu trúc switch — case
- Kiếm tra điều kiện để đưa vào trường hợp đúng, có thê chuyên thành cấu trúc if, 1Í-else
Trang 18Bang 2.4: Chuyén doan code
if i ==j) bne $30, $s1, else | -So sánh ¡ va j, nêu không băng thi
else add $s2,$t0,$t1 -Thực hiện g +h
Trang 20Bảng 2.5: Chuyển đoạn code 2
slt $a0,$80,$s1 beq $s0,$s1, work beq $a0,$zero,exit add $s2,$s2,$s0 addi $s0,$s0, 1 jloop work:
add $s2,$s2,$s0 addi $s0,$s0, 1 exit:
-Khởi tạo giá trị Sum -Khởi tạo giả trị 1
-So sanhi<N -So sanhi=N thi nhay dén work -So sánh kết quả của ¡<N với 0 băng thi nhảy đến exit
-Sum = Sum +1 -i=itl -Nhay loop -Sum = Sum +1
Trang 22- Ky tu nhap vao là: hoa, thường, SỐ Nhập vào loại nào thì xuất ra loại đó Nêu không phải 3 loại trên thì xuât “invalid type”
Bảng 2.6: Bài tập 1.3a
.data
stringl: ascnz "Nhap ki tu: "
string2: asciiz "\nKi tu truoc:
string3: ascuz "\nKi tu sau: "
string4: asciiz "\ninvalid type"
string5: asciiz "\nLoai so"
string6: asciiz "\nLoai chu"
Chuyên giá trị cho thanh ghi t0 Nếu giá trị của t0 lớn hơn 122
nhảy tới end
Nếu giá trị của t0 nhỏ hơn 97
nhảy tới workl Còn lớn hơn bằng
97 thì nhảy tới hàm chu
Nếu giá trị của t0 lớn hơn bằng 91
nhảy toi end Con nho hon 91 thi nhảy tới work2
Nếu giá trị của t0 nhỏ hơn 65
nhảy tới work3 Còn lớn hơn băng
65 thì nhảy tới hàm chuhoa
16
Trang 23
addi $v0, $zero, 4 #xuat str3
Nếu giá trị của t0 lớn hơn bằng 58
nhảy toi end Con nho hon 58 thi nhay to1 work4
Nếu giá trị của t0 nhỏ hơn 48
nhảy tới end Còn lớn hơn băng
48 nhảy tới hàm so
Trang 24Xuất str4 ra màn hình
18
Trang 25
Xuât "Loai chu thuong”
Hình 2.5: Sơ đồ giải thuật 1.3a Lab2
19
Trang 27Néu sl = s2 thi nhay toi bang
Nếu s1 > s2 thì nhảy tới lon, s1 <
s2 thi tiếp tục chương trình
Trang 29
Hình 2.6: Sơ đồ giải thuật 1.3b Lab2
23
Trang 30Chuong 3 CON TRO VA TRUY XUAT BO NHO
1.1/ Ly thuyét
1.1.1/ Nhắc lại về bộ nhớ
-_ Dữ liệu được định nghĩa | byte(8§ bits),L half2 bytes),L word(4 bytes)
- | ki tw la | byte dé lưu trữ (acsii)
- | s6 nguyén la | word dé lưu trữ
- I lệnh la | word (32 bits) để lưu trữ
1.1.2/ Nhắc lại về khai báo biến,kiểu dữ liệu
<tênbiến> <kiểu dữliệu> <danh sách các giá trỊ>
VD:
stringl: ase1z “UIT” #tạo | chuỗi tên stringl với khoi tao “UIT”
varl: word5 #khai bao | s6 nguyén tén varl chiém 1 word lưu trữ, có giá trị khoi tao la 5
arrayl: space 10 #tạo 1 mang array! co 10 bytes lién tuc nhau, chưa khởi tạo giá tri
array2: byte ‘a’, ‘b’ #tao | mang array2 c6 2 phan tt, mdi phan tt chiém | byte, khoi tao gia tri 1a ‘a’, “bỉ
1.1.3/ Mang vao con tro
- _ Con trỏ thao tác trên địa chỉ của bộ nhở
- Mang thao tac trén chi s6 mang Vd: a[0] a[n]
24
Trang 311.2/ Thực hành
data arrayl: word 5, ố, 7, ð, l, 2, 3, 9, 10, 4
⁄ In ra cửa số I/O của MARS tất cả các phần tử của mảng arrayl và array2
JV Gan các giá trị cho mảng array3 sao cho array3[i] = array2[i] + array2[size2 - 1 - i]
⁄ 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
-Khai báo biên size3: word 8
25
Trang 32
string 1: asciiz "Mang 1: " #76 string2: asciiz "\nMang 2: " #85 str4: asciiz "\nNhap mang thu may:
" #95 str5: asciiz "\nNhap phan tu thu may: " #116
str6: asciiz "\nPhan tu do la: " #140
text
#in array | addi $v0,$zero,4 lui $1,0x00001001 ori $a0,$1,76 syscall
lui $1,0x00001001 addi $t1,$1,0 addi $t2,$1,40 workl:
Iw $a0,0($t1) addi $v0,$0, 1 syscall addi $t1,$t1,4
-Xuất "Mang |: "
-Khởi tạo con trỏ băng địa chỉ đầu tiên
-Chạy vòng lặp đề xuất ra từng phan tt trong array |
26
Trang 33
slt $t3,$t1,$t2 bne $t3,$0,work1
#in array2 addi $v0,$zero,4 lui $1,0x00001001 ori $a0,$1,85 syscall
Ib $a0,0($t1)
slt $t7,$t3,$t4 beq $t7,$0,work2 1
-Xuất "nMang 2: "
-Đưa địa chỉ đâu của array2 vào
$tl -Dua dia cudi cla array2 vao $t2 -Dua dia chi đầu của array3 vô $t3 -Đưa địa chỉ cuôi của atray3 vô
$4 -Gán cô định địa chỉ array2 vô $t8
-So sánh địa chỉ đầu cuối của array3 néu >= thì nhảy xuống work2.1 Ngược lại làm tiếp điều kiện bên dưới
-Gan array3 sao cho array3[i] = array2[i] + array2[size2 - 1 - i]
27
Trang 34
addi $t2,$t2,-1
Ib $t5,0($t2) add $t5,$t5,$a0
sb $t5,0($t3) addi $t3,$t3,1
work?2 1:
addi $t1,$t1,1 addi $v0,$0,1
-Chạy vòng lặp đề xuất ra từng phần tử trong array2
syscall slt $t6,$t1,$t8 bne $t6,$0,work2 Yéu cau 2: | #Nhap
nhập vao addi $v0,$zero,4
#nhap phan tu can lay -Gọi hệ thống cho nhập stt mảng
rôi chuyên vao $s1
28
Trang 35
addi $v0,$0,5 syscall addi $s2,$v0,0
#xuat phan tu addi $v0,$zero,4 lui $1,0x00001001 ori $a0,$1,140 syscall
addi $t0,$0, 1 beq $s1,$t0,elsel addi $t0,$t0,1 beq $s1,$t0,else2 addi $t0, $t0, 1 beq $s1,$t0, else3
-Xuat "\nNhap phan tu thu may: "
-Gọi hệ thông cho nhập phân tử
rôi chuyên vào $s2
-Xuat "\nPhan tu do la: “
-So sanh stt mang néu =1 thi nhay elsel, =2 thi nhay else2,=3 thi nhay else3
29
Trang 36
sll $t2,$s2,2 add $t9,$1,$t2
lw $a0,0($t9)
j done
else2:
addi $t2,$s2,44 add $t9,$1,$t2
Ib $a0,0($t9)
j done
else3:
addi $t2,$s2,64 add $t9,$1,$t2
Trang 37Gan $t1 = Địa chỉ đầu tiên của mảng array 1 cha zai
$s1=$s1+4
Dung
Gán $t1 = Địa chỉ đâu tiên của array 2
$ = Địa chỉ đâu tiên của array 3
Gan $a0 = array 1[] có giá trị của địa chỉ $t1
Trang 38
cascuiz "\nGia tri lon .asc1z "\nG1a trị nho asc1z "\nTong cac asc1z "\nNhap phan tu .asc1iz "Phan tu do la: