שפת MIPS - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

שפת MIPS


~שירה

Recommended Posts

אני לא נגעתי בזה איזה שנתיים...

אבל משהו כמו

Four_F: .float 4.0

מגדיר את הערך 4.

וזה קוד לבאבלסורט. צריך להבין שמערך זה רק פוינטר.

#
# SAL code for bubble sort of integer array
#
.data
n: .word 0 # input number
a: .space 200 # 50 element array
i: .word # array index
J: .word # array index
base: .word a # base address of array
end: .word # address of last array element
flag: .word 0 # completion flag
prompt: .asciiz "Enter integers to be sorted, one per line. End with 0\n"
result: .asciiz "Sorted list:\n"
nl: .byte '\n'

.text
__start: puts prompt # prompt for input
la base, a # initialize base, end
move end, base
getin: get n # input numbers > 0
blez n, sort
move M[end], n # store input in array
add end, end, 4 # increment ending address
b getin

sort: la i, a # bubble sort outer loop
add J, i, 4
move flag, 0 # clear swap flag
loop: ble M[i], M[J], noswap # if elements i & J out of order, swap
move n, M[i]
move M[i], M[J]
move M[J], n
move flag, 1 # set swap flag
noswap: add i, i, 4 # increment i
add J, J, 4 # increment J
blt J, end, loop # test for end of array
bgtz flag, sort # if a swap occurred, continue sort

put '\n'
puts result
la i, a
print: put M[i] # print sorted array
put '\n'
add i, i, 4
blt i, end, print
done

קישור לתוכן
שתף באתרים אחרים

צריכה להפוך תכנית לשפת MIPS:

איך אני מצהירה על משתנים?


int i, j, k[10]

k[i] = j

הכתובת של K שמורה ברגיסטר 5.

רגיסטר $S7 = 1

תודה

קודם כל' date=' מיפס זה שם של מחשב. זה כמו להגיד "שפת פנטיום".

במיפס, כמו בכל אסמבלי אחר, אין משתנים, אלא יש ויש רגיסטרים.

את צריכה לדעת באיזה כתובת נמצא המערך K, ובאיזו כתובת נמצא I ובאיזו כתובת נמצא J.

לא הבנתי מה זה $1, לכן אענה בכלליות.


lw $3, 0[bla1]
lw $4, 0[bla2]
add $2, $5, $3
sw $4, 0[$2]

מה שעשיתי כאן בעצם זה:

1) לטעון את הערך של I לתוך רגיסטר 3(BLA1 צריך להיות שם של רגיסטר שמכיל את הכתובת של I).

2) לטעון את הערך של J לתוך רגיסטר 4.

3) לסכום את $5 ו $3 כדי לקבל את הכתובת בזיכרון של k[ i '].

4) להכניס לזיכרון בכתובת של k[ i] את הערך שהכנסתי מקודם ל$4(J בעצם).

קישור לתוכן
שתף באתרים אחרים

אם אני קובעת איזה משתנה יהיה בכל רגיסטר?

אז- איך אני מכניסה את המשתנים לתוך רגיסטרים?

איך אני מצהירה על משתנה מסוג INT?

לדוגמא:


int i=0, j=0, k[10];

איך אני מכניסה את K לרגיסטר S5?

I לרגיסטר S0?

J לרגיסטר S1?

קישור לתוכן
שתף באתרים אחרים

1) משתנה זה בסך הכל כתובת בזיכרון. משתנה לא מיוצג ע"י רגיסטר, אלא ע"H כתובת מסויימת. הכתובת תלוייה בכל התוכנית, ולא ניתן לדעת את הכתובת ישירות. אם אלו משתנים גלובאלים, אז זה תלוי במשתנים שמוגדרים לפניהם. אז אלה משתנים שמוגדרים על הSTACK(בתוך פונקציה מסויימת, או בכל בלוק של קוד) זה תלוי בפונקציות שקראת להן לפני ההצהרה על המשתנים, ובמשתנים שהגדרת לפני.

2) כשאת אומרת להכניס משתנים לתוך רגיסטרים, את מתכוונת לכתובת שלהם, או לערך.

3) לא מצהירים על משתנה. הקומפיילר אחראי ליצור כתובת(או OFFSET) למשתנה. המשתנה שמוגדר אחריו יהייה בכתובת שגדולה ב- 4 ממנו(בגלל שהגודל של INT הוא 4 בדרך כלל). הקומפיילר גם יודע איזה סוג זה כל משתנה, ולכן הוא יודע לתת את הערכים שלו לרגיסטרים המתאימים(אם זה FLOAT למשל, אז יש רגיסטרים אחרים שמשתמשים בהם).

אם קיבלת שאלה מסויימת, תרשמי או תסרקי את כולה כדי שנוכל לעזור לך.

קישור לתוכן
שתף באתרים אחרים

שאלה ראשונה:


.data
iInt: .word 0


str1: .asciiz "i is " #
str2: .asciiz "\n"

.text
main:

lw $s0, iInt


li $s6, 1
li $s7, 10


Loop: slt $s6, $s0, $s7
beq $s6, $zero, End


li $v0,4
la $a0,str1
syscall

lw $s0, iInt
li $v0, 1
move $a0, $s0
syscall

li $v0,4
la $a0,str3
syscall

addi $s0, $s0, 1

j Loop

End:
li $v0, 10
syscall

אני עברת בלולאה מ0-9 ורוצה בכל פעם לרשום את הערך של המונה, אבל נוצרת לי לולאה אינסופית (המונה לא מתקדם...)

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...