Báo cáo Final - project 20212Architechture Lab Trong báo cáo này , nhóm em xin được trình bày n i d ng th c hi n các ch đềầ đã độụựệủược phần cỗng nh sau:ưPhầần 1: Bài 6 do Phan Hùng Khá
Trang 1TRƯỜNG Đ I H C BÁCH KHOA HÀ N IẠỌỘ
BÁO CÁO
Final projects Course 2020-2021
Computer Architechture Lab
Gi ng viên hảướng dẫẫn:
TS Đỗỗ Cỗng Thuầần
Sinh viên th c hi n:ựệNhóm 16:
Hà Quang Thiềầu - 20184309Phan Hùng Khánh - 20184277
Mã l p:ớ 131102
Hà N i, tháng 7 năm 2022ộ
Trang 3Báo cáo Final - project 20212
Architechture Lab
Trong báo cáo này , nhóm em xin được trình bày n i d ng th c hi n các ch đềầ đã độụựệủược phần cỗng nh sau:ư
Phầần 1: Bài 6 do Phan Hùng Khánh th c hi n.ựệPhầần 2: Bài 7 do Hà Quang Thiềầu th c hi n.ựệ
Trang 4I Bài 11.Đềề bài
Đềầ bài: Hàm cầấp phát b nh malloc()ộớ
Mỗ t : Chảương trình cho bền dưới là hàm malloc(), kèm theo đó là ví d minh h a, ụọđược viềất băầng h p ng MIPS, đ cầấp phát b nh cho m t biềấn con tr nào đó.Hãyợữểộớộỏđ c chọương trình và hi u rõ nguyền tăấc cầấp phát b nh đ ng.Trền c s đó, hãy ểộớ ộơ ởhoàn thi n chệương trình nh sau L u ý, ngoài viềất các hàm đó, cầần viềất thềm m t ưưộsỗấ ví d minh h a đ thầấy vi c s d ng hàm đó nh thềấ nào.ụọểệử ụư
1) Vi c cầấp phát b nh ki u word/m ng word có 1 lỗỗi, đó là ch a b o đ m qui tăấc ệộớ ểảưảảđ a ch c a ki u word ph i chia hềất cho 4 Hãy khăấc ph c lỗỗi này.ịỉ ủểảụ
2) Viềất hàm lầấy giá tr Word /Byte c a biềấn con tr (tịủỏ ương t nh *CharPtr, *BytePtr,ựư*WordPtr)
3) Viềất hàm lầấy đ a ch biềấn con tr (tịỉỏ ương t nh &CharPtr, &BytePtr, *WordPtr)ựư4) Viềất hàm th c hi n copy 2 con tr xầu kí t (Xem ví d vềầ CharPtr)ựệỏựụ
5) Viềất hàm tnh toàn b lộ ượng b nh đã cầấp phát cho các biềấn đ ngộớộ
6) Hãy viềất hàm Malloc2 đ cầấp phát cho m ng 2 chiềầu ki u word v i tham sỗấ vào ểảểớgỗầm:
a.Đ a ch đầầu c a m ngịỉủảb.Sỗấ dòng
2) Viềất hàm lầấy giá tr Word /Byte c a biềấn con tr (tịủỏ ương t nh *CharPtr, ựư*BytePtr, *WordPtr)
Đ lầấy giá tr c a m t biềấn con tr , s d ng hàm lw đ lầấy giá tr t i ỗ nh , có ểị ủộỏ ử ụểị ạớđ a ch tịỉ ương đương v i giá tr c a con tr đóớị ủỏ
3) Viềất hàm lầấy đ a ch biềấn con tr (tịỉỏ ương t nh &CharPtr, &BytePtr, *WordPtr)ựưĐ lầấy đ a ch c a biềấn con tr , ch cầần load giá tr c a con tr và in raểịỉ ủỏỉị ủỏ4) Viềất hàm th c hi n copy 2 con tr xầu kí t (Xem ví d vềầ CharPtr)ựệỏựụ
Đ copy 2 con tr xầu kí t , trểỏựước tền lầấy đ a ch c a con tr cầần copy, sau đóịỉ ủỏl u nó vào vùng nh c a con tr th 2ướ ủỏứ
Trang 55) Viềất hàm tnh toàn b lộ ượng b nh đã cầấp phát cho các biềấn đ ngộớộTrong yều cầầu này, có hai trường h p cầần tnh toán:ợ
- TH1: Tính kích thước th c dùng đã cung cầấp cho các con tr , trong trựỏườngh p này, ch cầần tnh t ng kích thợỉổước t i phầần cầấp phát.ạ
- TH2: Tính kích thước đã dùng sau khi chu n hóa, trong trẩường h p này, ợngoài vi c tnh kích thệc t i phầần cầấp phát, cầần c ng thềm c phầần ướạộảchu n hóa c a các biềấn con trẩủỏ
6) Hãy viềất hàm Malloc2 đ cầấp phát cho m ng 2 chiềầu ki u word v i tham sỗấ vào ểảểớgỗầm:
a.Đ a ch đầầu c a m ngịỉủảb.Sỗấ dòng
c.Sỗấ c tộ
B i vì trong b nh , các ỗ nh đởộớớ ược săấp xềấp theo th t , khỗng ph i d ng ứ ựảạm ng, nền th c chầất, vi c cầấp phát b nh cho m t m ng 2 chiềầu tảựệộớộảương đương v i vi c cầấp phát cho m ng này m t dãy ỗ nh liềần nhau v i kích ớệảộớớthước băầng ( sỗấ dòng * sỗấ c t * kích thộước ki u )ể
7) Tiềấp theo cầu 6, hãy viềất 2 hàm GetArray[i][j] và SetArray[i][j] đ lầấy/thiềất l p giá ểậtr cho phầần t dòng i c t j c a m ng.ịử ởộủả
Theo phương pháp cầấp phát b nh phầần 6), t i phầần này, trộớ ởạước tền, chúng ta seỗ tm v trí ỗ nh địớ ược gán cho phầần t hàng i, c t j c a m ng, ửộủảbăầng cách (đ a ch đầầu c a m ng + (i * sỗấ dòng c a m ng + j)* kích thịỉủảủảước ki uể Sau khi tm được v trí ỗ nh đó, tềấn hành Set (băầng l nh sw) ho c Get ịớệặ(băầng lw) giá tr phầần t t i v trí [i][j]ịử ạ ị
3 Ý nghĩa các chương trình con
a SysInitMem: Kh i t o vùng cầấp phát đ ng, đánh dầấu v trí băất đầầu c a vùng ở ạộịủcó th cầấp phát b nh đ ng.ểộớ ộ
b malloc: hàm cầấp phát b nh cho các biềấn con tr ộớỏInput: - $a0: đ a ch c a biềấn con trịỉ ủỏ
- $s1: sỗấ phầần tử
- $a2: kích thước mỗỗi phầần tử
Kích thước c a vùng nh seỗ đủớược tnh băầng $s1*$a2, sau đó c ng thềm ộphầần chu n hóa.ẩ
Output: - $v0: đ a ch c a biềấn con tr cầần c p nh tịỉ ủỏậậ
c checkDevide4: Hàm chu n hóa, ki m tra xem đ a ch đã th a mãn chia hềất ẩểịỉỏcho 4 hay ch a, nềấu ch a thì c ng thềm 1 và tềấp t c l p l iưưộụ ặạ
Input: - $t8: đ a ch hi n t iịỉệạ
Outpyt: -$t8: đ a ch sau khi địỉược chu n hóaẩ
Trang 6d done: Hoàn thành cỗng vi c chu n hóa và l u l i đ a ch đầầu tền m i là đ a ệẩưạịỉớịch hi n t i cho các hàm malloc tềấp theo.ỉệạ
e getValue: Hàm lầấy giá tr c a m t con tr ,ị ủộỏInput: -$a0: đ a ch c a con trịỉ ủỏOutput: -$v0: giá tr c a biềấn con tr $a0ị ủỏf getAddress: Hàm lầấy đ a ch c a biềấn con trịỉ ủỏ
Input: -$a0: đ a ch c a biềấn con trịỉ ủỏOutput: tr vềầ giá tr $a0ảị
g CopyPointer: Hàm copy đ a ch c a con tr này, vào m t con tr khácịỉ ủỏộỏInput: - $a0: đ a ch c a biềấn con tr nguỗầnịỉ ủỏ
Output: -$v0: đ a ch c a biềấn con tr đích.ịỉ ủỏ
h CalculateMemory: Tính toán lượng b nh đã s d ng (ch a tnh phầần chu nộớử ụưẩhóa ) Đ tnh t ng lểổượng b nh đã s d ng, dùng m t thanh ghi $t0 là biềấn ộớử ụộtoàn c c, $t0 seỗ đụược tăng thềm đúng m t lộ ượng băầng b nh độớ ược cầấp phátcho con tr đó Hàm CalculateMemory seỗ tr vềầ giá tr $t0 hi n t i khi đỏảịệạược g i đềấn.ọ
i CalculateMemory2: Tính toán lượng b nh đã s d ng (đã tnh phầần chu n ộớử ụẩhóa ) Cách ho t đ ng tạộương t v i hàm CalculateMemory, khác bi t chỗỗ, ự ớệ ởthành ghi $t3 (biềấn toàn c c l u tr lụ ưữ ượng b nh s d ng) ngoài vi c c ng ộớ ử ụệộthềm kích thước được cung cầấp, seỗ c ng thềm phầần kích thộước được chu n ẩhóa (đ th a mãn chia hềất cho 4) Hàm CalculateMemory2 seỗ tr vềầ giá tr $t3ểỏảịhi n t i khi đệạược g i đềấn.ọ
j malloc2, checkDevide4_2, và done_2: các hàm này ho t đ ng tạộương t nh ựưcác hàm malloc, checkDevide4, và done trền.ở
k GetArrayAt: hàm lầấy giá tr t i v trí c th c a m ng.ị ạ ịụể ủảInput: - $a0: đ a ch đầầu tền c a m ngịỉủả
- $a1: v trí dòngị- $a2: v trí c tịộ
Output: - $v0: giá tr c a phầần t t i v trí [i][j] c a m ngị ủử ạ ịủả
Trang 7l SetArrayAt: hàm đ t giá tr t i v trí c th c a m ng.ặị ạ ịụể ủả
Input: - $v0: giá tr cầần đ t cho phầần t th [i][j] c a m ng.ịặửứủả- $a0: đ a ch đầầu tền c a m ngịỉủả
- $a1: v trí dòngị- $a2: v trí c tịộ
m exit: Hàm thoát chương trình do lỗỗi index
4 Kềết qu ch y chảạương trình.
Sau khi ch y chạương trình, thu được kềất qu c a các cầu h i t 1-7 nh sau:ả ủỏ ừư
II.Bài 7
1 Đềề bài: Chương trình ki m tra cú pháp l nh MIPS:ểệ
Trình biền d ch c a b x lý MIPS seỗ tềấn hành ki m tra cú pháp các l nh h p ng trong ịủộ ửểệợữmã nguỗần, xem có phù h p vềầ cú pháp hay khỗng, rỗầi m i tềấn hành d ch các l nh ra mãợớịệmáy Hãy viềất m t chộương trình ki m tra cú pháp c a 1 l nh h p ng MIPS bầất kì ểủệợữ(khỗng làm v i gi l nh) nh sau:ớả ệư
- Cho biềất l nh h p ng đó cầần bao nhiều chu kì thì m i th c hi n xong.ệợữớựệ
G i ý: nền xầy d ng m t cầấu trúc ch a khuỗn d ng c a t ng l nh v i tền l nh, ki u c aợựộứạủừệớệểủtoán h ng 1, toán h ng 2, toán h ng 3, sỗấ chu kì th c hi n.ạạạựệ
2 Phân tch cách th c hi n:ựệ
Bài toán đ t ra đầy: Nh p vào 1 cầu l nh, sau đó ki m trra cú pháp c a cầu l nh ặởậệểủệDo đó, ra chia thành các bài toán nh :ỏ
Trang 8L u l i cầu l nh và chia thành các phầần gỗầm opcode + toán h ng.ưạệạKi m tra opcodeể
Ki m tra sỗấ lểượng, cầấu trúc c a các toán h ng có đúng khỗng.ủạL u ý vi c b qua kho ng trăấng.ưệỏả
In kềất quả
Ngoài ra, ta cũng xầy d ng cầấu trúc ch a khuỗn d ng c a t ng l nh v i tền l nh, ki uựứạủừệớệểc a toán h ng 1, toán h ng 2, toán h ng 3, sỗấ chu kì th c hi n và cầấu trúc l u các ủạạạựệưthanh ghi đ ki m traể ể
C th , vi c phần tch cầu l nh đụểệệược th hi n qua s đỗầ dểệơưới đầy:
3 Ý nghĩa chương trình con
+) open_and_read_fle: ý nghĩa c a chủương trình này seỗ m và đ c các fle cầấu trúc có săỗn ởọgỗầm: Register.txt và Opcode.txt Sau khi m các fle thì d li u c a Opcode.txt seỗ đởữ ệủượ ưc l u trong Library_Opcode và d li u c a Register seỗ đữ ệủượ ưc l u trong List_Register
+) skipSpace: ý nghĩa c a chủương trình con này là seỗ b qua các kho ng trăấng Trong quá ỏảtrình nh p, ngậi dùng seỗ ngăn cách cách thành phầần băầng các kho ng trăấng, c th là ‘ ’ ườảụểho c ‘\tab’ Trong hàm này seỗ s d ng $s2 l u đ a ch c a Command, và $s7 l u v trí c a kí ặử ụưịỉ ủưịủt đang xét trong Command.ự
+) check_Opcode: ý nghĩa c a hàm này là seỗ ki m tra Opcode có h p l hay khỗng? Băầng ủểợệcách truy xuầất d li u vềầ opcode đữ ệượ ưc l u trong Library_Opcode
Hàm seỗ tr vềầ kềất qu $v0: băầng 0 khi opcode khỗng h p l , băầng 1 khi opcode h p lảảợệợệ+) check_ToanHang: hàm này seỗ giúp th c hi n vi c ki m tra s h p l c a các toán h ng ựệệểự ợệ ủạtương ng v i t ng Opcode ứớ ừ
Hàm seỗ tr vềầ kềất qu $v0: băầng 0 khi khỗng h p l , băầng 1 khi h p lảảợệợệ
Trang 9T i chạương trình con này, seỗ s d ng các chử ụương trình con khác gỗầm:
-) read_Toan_Hang: đ c và l u toán h ng vào ToanHang1, ToanHang2, ToanHang3ọưạ-) check_register: ki m tra xem toán h ng có ph i thanh ghi hay khỗng?ểạảHàm có các param:
[in] $s1: ch a đ a ch c a toán h ngứịỉ ủạ
[out] $v0: băầng 0 khi khỗng h p l , băầng 1 khi h p lợệợệ
-) check_Number: ki m tra xem toán h ng có ph i sỗấ nguyền hay khỗng?ểạảHàm có các param:
[in] $s1: ch a đ a ch c a toán h ngứịỉ ủạ
[out] $v0: băầng 0 khi khỗng h p l , băầng 1 khi h p lợệợệ-) check_Hex: ki m tra xem toán h ng có ph i sỗấ Hex hay khỗng?ểạảHàm có các param:
[in] $s1: ch a đ a ch c a toán h ngứịỉ ủạ
[out] $v0: băầng 0 khi khỗng h p l , băầng 1 khi h p lợệợệ
-) check_Label: ki m tra xem toán h ng có ph i Label h p l hay khỗng?ểạảợệHàm có các param:
Trang 10+) Ki m tra cầu l nh: div $s1, $s2ểệ
+) Ki m tra cầu l nh: j mainểệ
III Source Code
Trang 11CharPtr: word 0 # Bien con tro, tro toi kieu asciizBytePtr: word 0 # Bien con tro, tro toi kieu ByteWordPtr: word 0 # Bien con tro, tro toi mang kieu WordCpyCharPtr: word 0
ArrayWordPtr: word 0MaxDong: word 5MaxCot: word 5Space: asciiz " -> "newline: asciiz "\n\n"
Message11: asciiz "Dia chi o nho CharPtr da chuan hoa la: "Message12: asciiz "Dia chi o nho BytePtr da chuan hoa la: "Message13: asciiz "Dia chi o nho WordPtr da chuan hoa la: "
Message21: asciiz " Gia tri cua con tro CharPtr la: "Message22: asciiz " Gia tri cua con tro BytePtr la: "Message23: asciiz " Gia tri cua con tro WordPtr la: "
Message31: asciiz " Dia chi cua bien con tro la: "Message32: asciiz " Dia chi cua bien con tro la: "Message33: asciiz " Dia chi cua bien con tro la: "
Message4: asciiz "Q4: Dia chi cua con tro va con tro copy la: "Message5: asciiz "Q5: Luong bo nho da cap phat la: "
Message6: asciiz "Q6: Luong bo nho sau khi su dung malloc 2 (thuc dung vs chuan hoa): "Message71: asciiz "Q7.1: SetArray[3][3], Set gia tri 1007 cho phan tu vi tri [3][3] cua mang co dia chi la: "
Message72: asciiz "Q7.2: GetArray[3][3], Lay gia tri phan tu vi tri [3][3] cua mang: "
exitMess: asciiz "The index is out of range".kdata
#Bien chua dia chi dau tien cua vung nho con trongSys_TheTopOfFree: word 1
#Vung khong gian tu do, dung de cap bo nho cho cac bien con troSys_MyFreeSpace:
# -li $v0, 4la $a0, Message21syscall
Trang 12jal getValueadd $a0, $v0, $zeroli $v0, 1syscall
li $v0, 4la $a0, newlinesyscall
li $v0, 4la $a0, Message31syscall
la $a0, CharPtrjal getAddressadd $a0, $v0, $zeroli $v0, 1syscall
li $v0, 4la $a0, newlinesyscall
# -# Cap phat cho bien con tro, gom 6 phan tu, moi phan tu 1 byte# -
la $a0, BytePtraddi $a1, $zero, 6addi $a2, $zero, 1li $v0, 1sw $v0, 0($a0)li $v0, 4la $a0, Message12syscalljal malloc
li $v0, 4la $a0, Message22syscall
la $a0, BytePtrjal getValueadd $a0, $v0, $zeroli $v0, 1syscall
li $v0, 4la $a0, newlinesyscall
li $v0, 4la $a0, Message32syscall
la $a0, BytePtrjal getAddressadd $a0, $v0, $zero
Trang 13li $v0, 4la $a0, newlinesyscall
# -# Cap phat cho bien con tro, gom 5 phan tu, moi phan tu 4 byte# -
la $a0, WordPtraddi $a1, $zero, 5addi $a2, $zero, 4
li $v0, 4la $a0, Message13syscalljal malloc
li $v0, 4la $a0, Message23syscall
la $a0, WordPtrjal getValueadd $a0, $v0, $zeroli $v0, 1syscall
li $v0, 4la $a0, newlinesyscall
li $v0, 4la $a0, Message33syscall
la $a0, WordPtrjal getAddressadd $a0, $v0, $zeroli $v0, 1syscall
li $v0, 4la $a0, newlinesyscall
# Question 4: Copy hai con tro# -li $v0, 4
# -la $a0, Message4syscall
la $a0, CharPtr li $v0, 1syscall
Trang 14la $a0, Spacesyscall
la $a0, CharPtrla $a1, CpyCharPtrjal CopyPointeradd $a1,$a1,$zeroli $v0, 1syscall
li $v0, 4la $a0, newlinesyscall
#Question 5: Tinh tong bo nho su dung# -
# -li $v0, 4la $a0, Message5syscall
jal CalculateMemoryli $v0,1syscallli $v0, 4la $a0, Spacesyscalljal CalculateMemory2li $v0,1syscall
li $v0, 4la $a0, newlinesyscall
# -# Cap phat cho mang con tro word 2 chieu, gom 5 dong, 5 cot moi phan tu 4 byte# -
la $a0, ArrayWordPtrla $a1, MaxDonglw $a1,0($a1)la $a2, MaxCotlw $a2, 0($a2)jal malloc2
li $v0, 4la $a0, Message6syscall
jal CalculateMemoryli $v0,1syscallli $v0, 4la $a0, Space
Trang 15jal CalculateMemory2li $v0,1syscall
li $v0, 4la $a0, newlinesyscall
li $v0, 4la $a0, Message71syscall
li $v0, 1007la $a0, ArrayWordPtrli $a1,3la $s0, MaxDonglw $s0, 0($s0)bge $a1, $s0, exitli $a2, 3la $s0, MaxCotlw $s0, 0($s0)bge $a2, $s0, exitjal SetArrayAtli $v0, 1syscall
li $v0, 4la $a0, newlinesyscall
li $v0, 4la $a0, Message72syscall
la $a0, ArrayWordPtrli $a1,3la $s0, MaxDonglw $s0, 0($s0)bge $a1, $s0, exitli $a2, 3la $s0, MaxCotlw $s0, 0($s0)bge $a2, $s0, exitjal GetArrayAtadd $a0,$v0,$zeroli $v0, 1syscall
li $v0, 4la $a0, newlinesyscalllock:j lock
Trang 16# Ham khoi tao cho viec cap phat dong
# -# @param khong co
# @detail Danh dau vi tri bat dau cua vung nho co the cap phat duoc# -SysInitMem:
la $t9, Sys_TheTopOfFree #Lay con tro chua dau tien con trong, khoi taola $t7, Sys_MyFreeSpace #Lay dia chi dau tien con trong, khoi tao
jr $ra
# Ham cap phat bo nho dong cho cac bien con tro
# -# @param [in/out] $a0 Chua dia chi cua bien con tro can cap nhat
duoc
# @param [in] $a2 Kich thuoc 1 phan tu, tinh theo byte
# -la $t9, Sys_TheTopOfFree
lw $t8, 0($t9) #Lay dia chi dau tien con trongsub $t3,$t3,$t8
li $v0, 1add $a0, $t8, $zerosyscall
li $v0, 4la $a0, SpacesyscallcheckDevide4:
li $t4, 4div $t8, $t4mfhi $t5beq $t5, $zero, doneaddi $t8, $t8,1j checkDevide4 done:
add $t3, $t8, $t3
li $v0, 1add $a0, $t8, $zerosyscall
li $v0, 4la $a0, newlinesyscall
sb $t8, 0($a0) #Cat dia chi do vao bien con troaddi $v0, $t8, 0 #Dong thoi la ket qua tra ve cua hammul $t7, $a1, $a2 #Tinh kich thuoc cua mang can cap nhatadd $t0, $t0, $t7
add $t3, $t3, $t7
add $t6, $t8, $t7 #Tinh dia chi dau tien con trong
Trang 17Sys_TheTopOfFreejr $ra
# -# Ham lay gia tri cua bien con tro
# -# @param [in] $a0 Chua dia chi cua bien con tro can lay gia tri
# -getValue:lw $v0, 0($a0)jr $ra
# -# Ham lay dia chi cua bien con tro
# -# @param [in] $a0 Chua dia chi cua bien con tro can lay dia chi
# -getAddress:add $v0, $zero, $a0jr $ra
# -# Ham Copy 2 con tro xau ki tu
# -# @param [in] $a0 Chua dia chi cua bien con tro nguon# [in] $a1 Chua dia chi cua bien con tro dich# -CopyPointer:
sw $a0, 0($a1)jr $ra
# -#Khong tinh phan nhay coc dia chiCalculateMemory:
add $a0, $zero, $t0jr $ra
#Khong tinh phan nhay coc dia chiCalculateMemory2:add $a0, $t3, $zerojr $ra
# Ham cap phat bo nho dong cho cac bien con tro
# -la $t9, Sys_TheTopOfFree