You are on page 1of 10

CS621 Exercise 4

C programming: Run MARS simulator and Write a Simple program

1.Run the program One Step at a Time from start (at line 7) until the program finish execute the
instruction at line 24 (addi $1, $5, -2) and describe what happen to the Registers and Data Segment on
each step.

la $s0, fibs ; Fibs เปนตัวแปรที่เก็บคา Array 20 ชอง,โหลดคา Address เริ่มตน มาเก็บ ในตัวแปล $s0
ซึ่งเปน register เอาไวเกบคา address เริ่มตน ซึ่ง Data Segment เริ่มตอที่ 0x10010000

la $s5, size ; size เปนตัวแปรที่เก็บขนาดของ Array แลวโหลด คา Address ที่เก็บขนาดไปเก็บไวในตัวแปล


$s5 เอาไวเก็บคา address ที่ตําแหนง 0x10010020 ซึ่งเปน Address ตําแหนงที่ตอจากAddress ที่เก็บคาของ
Array

lw $s5, 0($s5) โดยที่ $s5 เก็บ address ของ memory ไว แลวเอาคาใน memory ที่ $5 เก็บไว นั่นก็คือ 20 มา
เก็บใน $s5 อีกทีหนึ่งเพราะ เพราะฉะนัน $s5 ตอนนี้จึงเก็บ 20

li $s2, 1 เปนคําสั่งสําหรับ load immediate คา 1 เอามาเก็บใน register $s2 ซึ่ง 1 เปนคาเริ่มตน

sw $s2, 0($s0) ก็คือคําสั่ง store word ที่ทําการบันทึกคา $s2 ซึ่งตอนนี้เก็บ 1 อยู ทําการเก็บไวใน memroy
ที่ $s0 + 0 address เพราะฉะนั้น ก็เก็บไน memroy ที่เก็บ $s0 เก็บไวเลย การเก็บคา
F(0) = 1

sw $s2, 4($s0) ก็คือคําสั่ง store word ที่ทําการบันทึกคา $s2 ซึ่งตอนดวย 1 address จะตอง + 4 นั่นก็คือ $s0
เก็บ address อะไรไว จะตอง + 4 แลวนําคา $s2 ก็คือ 1 มาเก็บไว ซึ่งจะเห็นไดวา data seqment ตัวที่ 1 กับ 2 มี
คาเก็บเปน 1 เหมือนกัน บรรทัดนี้ก็เทากับวา
F[1] = F[0] = 1
addi $s1, $s5, -2 เปนคําสั่ง นับจํานวน loop ซึ่ง Register $s5 ซึ่งเก็บขนาดของ Array ลบดวย 2 แลวนําคาที่
ได addi กับตัวแปล $s1

ลักษณะการทํางานของคําสั่ง

Data Segment ที่เกิดขึ้นจากการรันคําสั่ง


แสดง output ไดจากการรันโปรแกรม

2. column-major.asm เปนโปรแกรมที่ สราง Array ขนาด 16x16 แลวทําการ วน loop เพื่อเอาคาไปเก็บ


ไวใน Array โดยลักษณะการเก็บคา จะเปนการเก็บลงตามแนว Column โดยเริ่มจาก
1
2
3
4
5
6
7
.
.
.

ลักษณะการทํางานของคําสั่งแตละ Step
li $t0, 16 เปนคําสั่ง สําหรับเอาคา 16 ไปเก็บในตัวแปล $t0 ซึ่งเปนการเก็บขนาดของ Array

li $t1, 16 เปนคําสั่ง สําหรับเอาคา 16 ไปเก็บในตัวแปล $t1 ซึ่งเปนการเก็บขนาดของ Array

move $s0, $zero เปนการนําคา 0 ไปเก็บใน ตัวแปร $s0 ซึ่งเปนคาเริ่มตน โดยตัวแปลนี้เอาไวนับ


จํานวนแถว
move $s1, $zero เปนการนําคา 0 ไปเก็บใน ตัวแปร $s1 ซึ่งเปนคาเริ่มตน โดยตัวแปลนี้เอาไวนับ
จํานวนคอลัมน

move $t2, $zero เปนการนําคา 0 ไปเก็บใน ตัวแปร $t2 ซึ่งเปนคาเริ่มตน โดยตัวแปลนี้เอาไวเก็บคาที่


ไดจากการวน loop แลวเพิ่มคาขึ้นที่ละหนึ่ง แลวเอาเปนเก็บใน Array

loop: mult $s0, $t1 เปนสวนของการวน loop ตามแนว Column โดยเริม่ จาก เอาคา $t1=16
โดย คูณกับตัวแปล $s0= 0 แลวนําคา $s2

mflo $s2 นําคาที่ไดจากการคูณ จากคําสั่งขางบน มีเก็บในตัวแปรนี้ $s2 = 0

add $s2, $s2, $s1 การบวกคาตัวแปล $s2, $s1 เขาดวยกันแลวนําไปสะสมคาที่ $s2

sll $s2, $s2, 2 ที่การเลื่อนบิตไปทางซาย 2 bit แลวนําไปสะสมคาที่ $s2

sw $t2, data($s2) นําคาที่จากการเลื่อนบิตเขาไปเก็บในแมทตริกซึ่งก็คือ ตัวแปล $t2

addi $t2, $t2, 1 หลังจาก เก็บคาแลวก็บวกเพิ่มคาขึ้นอีกหนึ่ง

addi $s0, $s0, 1 หลังจากที่ทําการเก็บคาแรกแลวตอไปก็ทําการเพิ่ม Row ขึ้นอีก 1 โดยทําการบวก 1


เขากับตัวแปล $s0

bne $s0, $t0, loop เพื่อทําการเช็คเงื่อนไขวาถึงเก็บขอมูลตามแนวตั้งถึงตําแหนงสุดทายหรือยัง ถายังก็


วน loop ไปเพิ่มคาอีก

move $s0, $zero เคลียคาตัวแปล $s0 ใหเปน 0

addi $s1, $s1, 1 เพิ่มคา column ขึ้นอีกหนึ่งหลังจากที่วน loop จนหมด column แรก
bne $s1, $t1, loop เช็คเงื่อนไขวาวน loop จนหมดทุก column หรือยัง ถายังก็วน loopกลับไปทําจน
หมด

ถาเราไปดูใน Data Segment จะเห็นวา จะเริ่มการทํางานตั้งแต Address 0x10010000 แลวชอง


Value(+0) จะเก็บคา 0 ที่ตําแหนง Address 0x10010040 แลวชอง Value(+0) จะเก็บคา 1 แลวโปรแกรม
จะทําการเก็บคาอยางนี่ลงมาเรื่อยๆจะถึง แถวสุดทายแลวจึงขึ้น column ใหม

คําสั่งที่ใชในการรัน

Data Segment ที่เกิดขึ้นแสดงการเก็บผลลัพธ


3. row-major.asm เปนโปรแกรมที่ สราง Array ขนาด 16x16 แลวทําการ วน loop เพื่อเอาคาไปเก็บไวใน
Array โดยลักษณะการเก็บคา จะเปนการเก็บลงตามแนว Row โดยเริ่มจาก

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24 25 26 27 28 ...

ลักษณะการทํางานของคําสั่ง
li $t0, 16 เปนคําสั่ง สําหรับเอาคา 16 ไปเก็บในตัวแปล $t0 ซึ่งเปนการเก็บขนาดของ
Array

li $t1, 16 เปนคําสั่ง สําหรับเอาคา 16 ไปเก็บในตัวแปล $t1 ซึ่งเปนการเก็บขนาดของ Array

move $s0, $zero เปนการนําคา 0 ไปเก็บใน ตัวแปร $s0 ซึ่งเปนคาเริ่มตน โดยตัวแปลนี้เอาไวนับ


จํานวนแถว

move $s1, $zero เปนการนําคา 0 ไปเก็บใน ตัวแปร $s1 ซึ่งเปนคาเริ่มตน โดยตัวแปลนี้เอาไวนับ


จํานวนคอลัมน

move $t2, $zero เปนการนําคา 0 ไปเก็บใน ตัวแปร $t2 ซึ่งเปนคาเริ่มตน โดยตัวแปลนี้เอาไวเก็บคาที่


ไดจากการวน loop แลวเพิ่มคาขึ้นที่ละหนึ่ง แลวเอาเปนเก็บใน Array

loop: mult $s0, $t1 เปนสวนของการวน loop ตามแนว Column โดยเริม่ จาก เอาคา $t1=16
โดย คูณกับตัวแปล $s0= 0 แลวนําคา $s2

mflo $s2 นําคาที่ไดจากการคูณ จากคําสั่งขางบน มีเก็บในตัวแปรนี้ $s2 = 0

add $s2, $s2, $s1 การบวกคาตัวแปล $s2, $s1 เขาดวยกันแลวนําไปสะสมคาที่ $s2


sll $s2, $s2, 2 ที่การเลื่อนบิตไปทางซาย 2 bit แลวนําไปสะสมคาที่ $s2

sw $t2, data($s2) นําคาที่จากการเลื่อนบิตเขาไปเก็บในแมทตริกซึ่งก็คือ ตัวแปล $t2

addi $t2, $t2, 1 หลังจาก เก็บคาแลวก็บวกเพิ่มคาขึ้นอีกหนึ่ง

addi $s1, $s1, 1 หลังจากที่ทําการเก็บคาแรกแลวตอไปก็ทําการเพิ่ม Column ขึ้นอีก 1 โดยทําการบวก


1 เขากับตัวแปล $s1

bne $s1, $t1, loop เพื่อทําการเช็คเงื่อนไขวาถึงเก็บขอมูลตามแนวตั้งถึงตําแหนงสุดทายหรือยัง ถายังก็


วน loop ไปเพิ่มคาอีก
move $s1, $zero เคลียคาตัวแปล $s1 ใหเปน 0

addi $s0, $s0, 1 เพิ่มคา Row ขึ้นอีกหนึ่งหลังจากที่วน loop จนหมด Row แรก

bne $s0, $t0, loop เช็คเงื่อนไขวาวน loop จนหมดทุก column หรือยัง ถายังก็วน loopกลับไปทําจน
หมด

ลักษณะการทํางานของคําสั่ง
Data Segment ที่เกิดขึ้นจากการรันคําสั่ง

ถาเราไปดูใน Data Segment จะเห็นวา จะเริ่มการทํางานตั้งแต Address 0x10010000 แลวชอง


Value(+0) จะเก็บคา 0 แลวชอง Value(+4) จะเก็บคา 1 แลวโปรแกรมจะทําการเก็บคาอยางนี่ลงมาเรื่อยๆจะ
ถึง Column สุดทายแลวจึงขึ้น Row ใหม

4. Set a break point (Bkpt) on the instruction at line 24 and run the program. Describe what happen in the
Data Segment when the program stop at the breakpoint. Do the same until the execution finishes.

addi $s1, $s5, -2 คําสั่งบรรทัดนี้ โดยการนับจํานวนลูปแลว ลดขนาด size ลง 2 โดยการเอา-2 ไปลบ $s5
แลวไปเก็บใน Register $s1 ถาเรา break point ณ บรรทัดนี้ ถาเรามาดูที่ Data Segment Value(+0) = 1 ก็คือ
คาที่เอาไปใสที่ตําแหนงที่เรากําหนด แลวที่ตําแหนง Value(+4) = 1 ดวยตามคําสั่งของโปรแกรม

Data Segment ที่เกิดขึ้น

5. Write a MIP assembly program to calculate sum = 1+2+3+4+...+20 and print a string “Hello World :)”
with the output on screen.

- sum.asm เปนโปรแกรมบวกคาตัวเลข ตั้งแตเลข 1 ถึง 20 และปริ้นคา Hello World :)

la $s1, sum โหลดคา Address ของ ตัวเลข 20 จํานวนมาเก็บที่ Register $s1

lw $s1, 0($s1) โดยที่ $s1 เก็บ address ของ memory ไว แลวเอาคาใน memory ที่ $s1 เก็บไว นั่นก็คือ 20 มา
เก็บ
addi $s1 , $s1 , 1 บวกคาเริ่มตนตั้งแต 1 เขาไปเก็บในตัวแปล $s1 ตัวแปลนี้จะทําหนาที่ เพิ่มจํานวน loop 1
จน ถึง 20 +1

li $s0 , 1 เปนการเคลียคาเริ่มตนของตัวแปลที่จะ เก็บคาเริ่มตนของ loop คือ เริ่มจาก 1

li $s2 , 0 Set คาตัวแปล temp ใหเปนคา 0 เพื่อชวยในการบวก

loop: add $s2 , $s2 , $s0 บวกคา เริ่มตนคือ 1 เขากับตัวแปล temp เพื่อสะสมคา

addi $s0 , $s0 , 1 เปนการบวกคาตัวแปลเพื่อ เพิ่ม จํานวน loop ที่ละ 1

bne $s0 , $s1 , loop ทําหนาที่เช็คเงื่อนไข วาบวกครบ 20 จํานวนหรือยัง ถายังวน ไปบวกใหม ถาครบก็ออก
จากลูป แลวแสดงผล ออกมา

สวนของการแสดงผล ขอความ Summary : และ Hello World :)


print:add $t0, $zero, $a0 จุดเริ่มตนของ Address ของ Array ของ data ที่จะ printed
add $t1, $zero, $a1 เปนการบวกคาเพิ่มนับ จํานวนลูป ของ Array โดยการ initialize คาเริ่มตนใหตัวนับ
la $a0, head เปนการเก็บตําแหนง Address ของตําแหนงขอมูลที่เราจะทําการ printed

li $v0, 4 syscall สองคําสั่งนี้เปนการเรียกคาฟงชั่นที่เราตองการใหมัน print ออกมาแสดง

out: add $a0 , $s2 , $zero เปนสวนของฟงชั่นที่ แสดงขอมูล Summary : 210


out2: la $a0 , head2 เปนสวนของฟงชั่นที่แสดงขอมูล Hello World :)
คําสั่งที่ใชในการ บวกเลข

Data Segment ที่ไดจากการรันคําสั่ง

คาผลลัพธ ของการบวก ตัวเลขตั้งแต 1 ถึง 20

You might also like