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á
Bài 1
Đềề 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 c.Sỗấ c t ộ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 ị ử ở ộ ủ ả
Phân tch cách th c hi n ự ệ
Đỗấi v i t ng phầần: ớ ừ 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 ị ỉ ủ ể ả ụ Trong phầần này, t i hàm cầấp phát b nh malloc, xầy d ng m t hàm ạ ộ ớ ự ộ checkDevide4 đ ki m tra xem đ a ch c a ki u đã chia hềất cho 4 hay ch a, ể ể ị ỉ ủ ể ư nềấu ch a, hãy tăng giá tr c a đ a ch đó ư ị ủ ị ỉ
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 ư ớ ủ ỏ ứ
5) 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 ự ỏ ườ ng h 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] ị ử ạ ị
Ý 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 ẩ
5 d 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át cho 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 ị ủ ử ạ ị ủ ả
6 l 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
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: ả ủ ỏ ừ ư
Bài 7
Đềề 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: ớ ả ệ ư
- Nh p vào t bàn phím m t dòng l nh h p ng Ví d beq s1,31,t4 ậ ừ ộ ệ ợ ữ ụ - Ki m tra xem mã opcode có đúng hay khỗng? Trong ví d trền, opcode là beq là h p l ể ụ ợ ệ thì hi n th thỗng báo “opcode: beq, h p l ” ệ ị ợ ệ
- Ki m tra xem tền các toán h ng phía sau có h p l hay khỗng? Trong ví d trền, toán ể ạ ợ ệ ụ h ng s1 là h p l , 31 là khỗng h p l , t4 thì kh i ph i ki m tra n a vì toán h ng tr ạ ợ ệ ợ ệ ỏ ả ể ữ ạ ướ c đã b sai rỗầi ị
- 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 ạ ạ ạ ự ệ
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 : ỏ
L 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:
Ý 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 ả ả ợ ệ ợ ệ
T 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:
[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 ợ ệ ợ ệ
Kềết qu th c hi n ả ự ệ
+) Ki m tra cầu l nh: div $s1, $s2, $s3 ể ệ
+) Ki m tra cầu l nh: div $s1, $s2 ể ệ
+) Ki m tra cầu l nh: j main ể ệ
Source Code
Bài 6
# 1)Vi c c p phát b nh ki u word/m ng wordcó 1 l i, đó là ch a b o đ m qui t c đ a ch c a ki u ấ ộ ớ ể ả ỗ ư ả ả ắ ị ỉ ủ ể wordph 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 tính 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: ế ể ấ ả ề ể ớ ố ồ
# 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. ầ ử ở ộ ủ ả
.data CharPtr: word 0 # Bien con tro, tro toi kieu asciiz BytePtr: word 0 # Bien con tro, tro toi kieu Byte WordPtr: word 0 # Bien con tro, tro toi mang kieu Word CpyCharPtr: word 0
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"
#Bien chua dia chi dau tien cua vung nho con trong Sys_TheTopOfFree: word 1
#Vung khong gian tu do, dung de cap bo nho cho cac bien con tro Sys_MyFreeSpace:
#Khoi tao bien dem bo nho dung thuc li $t0, 0
#Khoi tao bien dem bo nho dung sau chuan hoa li $t3, 0
#Khoi tao vung nho cap phat dong jal SysInitMem
# Cap phat cho bien con tro, gom 3 phan tu, moi phan tu 1 byte
# - la $a0, CharPtr addi $a1, $zero, 3 addi $a2, $zero, 1 li $v0, 4 la $a0, Message11 syscall jal malloc
11 la $a0, CharPtr jal getValue add $a0, $v0, $zero li $v0, 1 syscall li $v0, 4 la $a0, newline syscall li $v0, 4 la $a0, Message31 syscall la $a0, CharPtr jal getAddress add $a0, $v0, $zero li $v0, 1 syscall li $v0, 4 la $a0, newline syscall
# Cap phat cho bien con tro, gom 6 phan tu, moi phan tu 1 byte
# - la $a0, BytePtr addi $a1, $zero, 6 addi $a2, $zero, 1 li $v0, 1 sw $v0, 0($a0) li $v0, 4 la $a0, Message12 syscall jal malloc li $v0, 4 la $a0, Message22 syscall la $a0, BytePtr jal getValue add $a0, $v0, $zero li $v0, 1 syscall li $v0, 4 la $a0, newline syscall li $v0, 4 la $a0, Message32 syscall la $a0, BytePtr jal getAddress add $a0, $v0, $zero
12 li $v0, 1 syscall li $v0, 4 la $a0, newline syscall
# Cap phat cho bien con tro, gom 5 phan tu, moi phan tu 4 byte
# - la $a0, WordPtr addi $a1, $zero, 5 addi $a2, $zero, 4 li $v0, 4 la $a0, Message13 syscall jal malloc li $v0, 4 la $a0, Message23 syscall la $a0, WordPtr jal getValue add $a0, $v0, $zero li $v0, 1 syscall li $v0, 4 la $a0, newline syscall li $v0, 4 la $a0, Message33 syscall la $a0, WordPtr jal getAddress add $a0, $v0, $zero li $v0, 1 syscall li $v0, 4 la $a0, newline syscall
# Question 4: Copy hai con tro
# - li $v0, 4 la $a0, Message4 syscall la $a0, CharPtr li $v0, 1 syscall
13 li $v0, 4 la $a0, Space syscall la $a0, CharPtr la $a1, CpyCharPtr jal CopyPointer add $a1,$a1,$zero li $v0, 1 syscall li $v0, 4 la $a0, newline syscall
#Question 5: Tinh tong bo nho su dung
# - li $v0, 4 la $a0, Message5 syscall jal CalculateMemory li $v0,1 syscall li $v0, 4 la $a0, Space syscall jal CalculateMemory2 li $v0,1 syscall li $v0, 4 la $a0, newline syscall
# Cap phat cho mang con tro word 2 chieu, gom 5 dong, 5 cot moi phan tu 4 byte
# - la $a0, ArrayWordPtr la $a1, MaxDong lw $a1,0($a1) la $a2, MaxCot lw $a2, 0($a2) jal malloc2 li $v0, 4 la $a0, Message6 syscall jal CalculateMemory li $v0,1 syscall li $v0, 4 la $a0, Space
14 syscall jal CalculateMemory2 li $v0,1 syscall li $v0, 4 la $a0, newline syscall li $v0, 4 la $a0, Message71 syscall li $v0, 1007 la $a0, ArrayWordPtr li $a1,3 la $s0, MaxDong lw $s0, 0($s0) bge $a1, $s0, exit li $a2, 3 la $s0, MaxCot lw $s0, 0($s0) bge $a2, $s0, exit jal SetArrayAt li $v0, 1 syscall li $v0, 4 la $a0, newline syscall li $v0, 4 la $a0, Message72 syscall la $a0, ArrayWordPtr li $a1,3 la $s0, MaxDong lw $s0, 0($s0) bge $a1, $s0, exit li $a2, 3 la $s0, MaxCot lw $s0, 0($s0) bge $a2, $s0, exit jal GetArrayAt add $a0,$v0,$zero li $v0, 1 syscall li $v0, 4 la $a0, newline syscall lock: j lock
# Ham khoi tao cho viec cap phat dong
# @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 tao la $t7, Sys_MyFreeSpace #Lay dia chi dau tien con trong, khoi tao sw $t7, 0($t9) #Luu lai 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
# Khi ham ket thuc, dia chi vung nho duoc
# cap phat se luu tru vao bien con tro
# @param [in] $a1 So phan tu can cap nhat
# @param [in] $a2 Kich thuoc 1 phan tu, tinh theo byte
# @return $v0 Dia chi cua vung nho can cap nhat
# - malloc: la $t9, Sys_TheTopOfFree lw $t8, 0($t9) #Lay dia chi dau tien con trong sub $t3,$t3,$t8 li $v0, 1 add $a0, $t8, $zero syscall li $v0, 4 la $a0, Space syscall checkDevide4: li $t4, 4 div $t8, $t4 mfhi $t5 beq $t5, $zero, done addi $t8, $t8,1 j checkDevide4 done: add $t3, $t8, $t3 li $v0, 1 add $a0, $t8, $zero syscall li $v0, 4 la $a0, newline syscall sb $t8, 0($a0) #Cat dia chi do vao bien con tro addi $v0, $t8, 0 #Dong thoi la ket qua tra ve cua ham mul $t7, $a1, $a2 #Tinh kich thuoc cua mang can cap nhat add $t0, $t0, $t7 add $t3, $t3, $t7 add $t6, $t8, $t7 #Tinh dia chi dau tien con trong
16 sw $t6, 0($t9) #Luu tro lai dia chi dau tien do vao bien Sys_TheTopOfFree jr $ra
# Ham lay gia tri cua bien con tro
# @param [in] $a0 Chua dia chi cua bien con tro can lay gia tri
# @return $v0 Gia tri cua bien con tro
# Ham lay dia chi cua bien con tro
# @param [in] $a0 Chua dia chi cua bien con tro can lay dia chi
# @return $v0 dia chi cua bien con tro
# - getAddress: add $v0, $zero, $a0 jr $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
#Khong tinh phan nhay coc dia chi CalculateMemory: add $a0, $zero, $t0 jr $ra
#Khong tinh phan nhay coc dia chi CalculateMemory2: add $a0, $t3, $zero jr $ra
# Ham cap phat bo nho dong cho cac bien con tro
# @param [in] $a0 Chua dia chi dau tien
# @return $v0 Dia chi cua vung nho can cap nhat
17 lw $t8, 0($t9) #Lay dia chi dau tien con trong sub $t3,$t3, $t8 checkDevide4_2: li $t4, 4 div $t8, $t4 mfhi $t5 beq $t5, $zero, done_2 addi $t8, $t8,1 j checkDevide4_2 done_2:
#syscall add $t3,$t3,$t8 sw $t8, 0($a0) #Cat dia chi do vao bien con tro addi $v0, $t8, 0 #Dong thoi la ket qua tra ve cua ham mul $t7, $a1, $a2 #Tinh so luong phan tu mul $t7, $t7, 4 #Tinh kich thuoc bo nho can cung cap add $t0, $t0, $t7 add $t3, $t3, $t7 add $t6, $t8, $t7 #Tinh dia chi dau tien con trong sw $t6, 0($t9) #Luu tro lai dia chi dau tien do vao bien
# - GetArrayAt: la $t1, MaxDong lw $t1,0($t1) la $t2, MaxCot lw $t2, 0($t2) mul $t7, $a1, $t2 add $t7, $t7, $a2 mul $t7, $t7, 4 add $a0, $a0, $t7 lw $v0, 0($a0) jr $ra
# - SetArrayAt: la $t1, MaxDong lw $t1,0($t1) la $t2, MaxCot lw $t2, 0($t2) mul $t7, $a1, $t2 add $t7, $t7, $a2 mul $t7, $t7, 4 add $a0, $a0, $t7 sw $v0, 0($a0) jr $ra exit:
18 open_file_registers: li $v0, 13 la $a0, File_Registers li $a1, 0 syscall # mo file Registers.txt. move $s1, $v0 bltz $s1, error # kiem tra file co doc duoc ko? read_file_registers: li $v0, 14 move $a0, $s1 la $a1, List_Registers #Luu tai List_Register li $a2, 500 syscall # doc file Registers.txt
# INPUT AND SAVE THE COMMAND #
#################################################################################### input_command: li $v0, 4 la $a0, Message_input syscall li $v0, 8 la $a0, Command li $a1, 100 syscall # nhap vao dong lenh end_input_command:
# - print: print_Command: li $v0, 4 la $a0, Message1_Command # message 1 command syscall la $a0, Command syscall # in ra Command la $a0, Message2_Command syscall # message 2 command
# CHECK THE COMMAND THEN RETURN RESULTS #
#################################################################################### xy_ly_Command: add $s7, $0, $0 # khoi tao index = 0 add $s6, $0, $0 # s6 : address OpCode in Library_Opcode (neu co) jal skipSpace # bo qua khoang trang
#s2 hien tai dang la address of Command nop check_OpcodeOfCommand: jal check_Opcode # kiem tra opcode co hop le nop beq $v0, $0, waning_opcode # ko hop le -> waning_Opcode li $v0, 4 # hop le -> in ra OpCode hop le!
21 la $a0, Message1_Opcode syscall li $v0, 4 la $a0, OpCode syscall li $v0, 4 la $a0, Message2_Opcode syscall check_ToanHang: jal skipSpace # bo qua khoang trang nop jal check_Toan_Hang # kiem tra cac toan hang cua OpCode nop beq $v0, $0, waning_command check_cac_ky_tu_con_lai: jal skipSpace # bo qua khang trang nop
# - phan bo qua chu thich - add $t0, $s2, $s7 # t0 : address Command[index] lb $t1, 0($t0) # t1 = Command[index] bne $t1, 35, check_KetThuc_Command # Command[index] != '#' > check_KetThuc_Command addi $s7, $s7, 1 # index += 1 duyet_het_Command: add $t0, $s2, $s7 # t0 : address Command[index] lb $t1, 0($t0) # t1 = Command[index] beq $t1, 10, end_duyet_het_Command # Command[index] == '\n' > ket thuc addi $s7, $s7, 1 # index += 1 j duyet_het_Command end_duyet_het_Command: j Opcode_chu_ky
# - check_KetThuc_Command: bne $t1, 10, error_cu_phap # Command[index] != '\n' > lenh khong hop le!
Opcode_chu_ky: # in ra thong tin chu ky ung voi OpCode li $v0, 4 la $a0, Message_Chu_ky syscall addi $t3, $s6, 15 # t3 : address chu ky Opcode lb $t4, 0($t3) # t4 = chu ky li $v0, 11 move $a0, $t4 syscall # message chu ky li $v0, 11 addi $a0, $0, 10 syscall # xuong dong end_Opcode_chu_ky:
ThongBaoHoanThanh: # thong bao hop le li $v0, 4 la $a0, Message_ThongBao syscall end_check_CKTCL: j close_file
#################################################################################### waning: # phan canh bao trong qua trinh xu ly command waning_opcode: li $v0, 4 la $a0, Message1_Opcode
22 syscall li $v0, 4 la $a0, OpCode syscall li $v0, 4 la $a0, Waning_Opcode syscall waning_command: li $v0, 4 la $a0, Waning_Command syscall end_waning: j close_file error_cu_phap: li $v0, 4 la $a0, Waning_CuPhap syscall end_error_cu_phap: j close_file error: # bao loi doc file li $v0, 4 la $a0, Error_Open_File syscall end_error: close_file: # phan dong file close_file_opcode: li $v0, 16 move $a0, $s0 syscall # dong file OpCode.txt close_file_registers: li $v0, 16 move $a0, $s1 syscall # dong file Registers.txt end_close_file: exit: li $v0, 10 syscall # thoat CT end_main:
# Procedure skipSpace: Bo qua khoang trang #
# s2: [in]: Luu dia chi cua chuoi muon bo qua khoang trang
# s7: [in]: Chua index cua chuoi tren
#################################################################################### skipSpace: addi $sp, $sp, -20 sw $t0, 16($sp) sw $t1, 12($sp) sw $t7, 8($sp) sw $t8, 4($sp) sw $t9, 0($sp)
#Luu lai gia tri tai cac thanh ghi sap dung, tranh truong hop bi mat du lieu lap: add $t0, $s2, $s7 # get address of Command[index] baseAddress s2 + index s7 lb $t1, 0($t0) # get vakue of Command[index] then save into t1
23 seq $t9, $t1, 32 # check if t1 is equal 32 or not
# t9 = 1 if Command[index] == ' ' seq $t8, $t1, 9 # check if t1 is \tab or not
# t8 = 1 if Command[index] == '\tab' or $t7, $t8, $t9 beq $t7, $zero, end_lap # !(Command[index] == ' '
#or Command[index] == '\tab') -> done addi $s7, $s7, 1 # tang index them 1
# de kiem tra ki tu tiep theo (index++) j lap end_lap: lw $t9, 0($sp) lw $t8, 4($sp) lw $t7, 8($sp) lw $t1, 12($sp) lw $t0, 16($sp) addi $sp, $sp, 20
#da hoan thanh viec su dung, tra du lieu dang luu lai cho cac thanh ghi vua su dung end_skipSpace: jr $ra
# Procedure check_Opcode : Kiem tra opcode co hop le hay khong #
# 0 neu khong tim thay check_Opcode: luu_value_registers:
#luu lai du lieu cua cac thanh ghi sap su dung, phong truong hop bi mat du lieu addi $sp, $sp, -52 sw $s5, 48($sp) sw $t0, 44($sp) sw $t6, 40($sp) sw $t5, 36($sp) sw $s0, 32($sp) sw $s1, 28($sp) sw $t1, 24($sp) sw $t2, 20($sp) sw $t3, 16($sp) sw $t4, 12($sp) sw $t7, 8($sp) sw $t8, 4($sp) sw $t9, 0($sp)