[Architecture] ฟิลด์ของคำสั่ง MIPS
ฟิลด์ของคำสั่ง MIPS
ที่มาของรูป http://www.cise.ufl.edu/~mssz/CompOrg/Figure2.7-MIPSinstrFmt.gif
– MIP มี instruction อยู่ 3 แบบ
Type | -31- format (bits) -0- | |||||
---|---|---|---|---|---|---|
R | opcode (6) | rs (5) | rt (5) | rd (5) | shamt (5) | funct (6) |
I | opcode (6) | rs (5) | rt (5) | immediate (16) | ||
J | opcode (6) | address (26) |
– ในแต่ละฟิลด์ มีความหมายดังต่อไปนี้
op: พื้นฐานการทำงานของคำสั่ง ซึ่งเรียกว่า opcode
rs: รีจีสเตอร์ ตัวแปรกระทำ ตัวแรก (s = source)
rt: รีจีสเตอร์ ตัวแปรกระทำ ตัวสอง (t = target)
rd: รีจีสเตอร์ ที่เก็บผลลัพธ์ (d = destination)
shamt: ค่าของการเลื่อนตำแหน่ง
funct: ฟังก์ชั่น เป็นฟิลด์ที่กำหนดการกระทำย่อยๆ ที่อธิบายเสริมกับพื้นฐานการทำงานของคำสั่ง หรือเรียกว่า function code
I-Type (immediate type) :
– เป็นคำสั่งที่มี immediate value (type อื่นจะให้ assembler จัดการ)
B31-26 | B25-21 | B20-16 | B15-0 |
opcode | register s | register t | immediate |
– มีรีจิสเตอร์อยู่ 2 ตัวคือ rs,rt แล้วตามด้วย immediate ซึ่งต้องเป็น 2’s complement เท่านั้น
– ตัวอย่างคำสั่ง addi $5 $4 0xabcd : opcode rt rs imm หลังจากที่ทำคำสั่งนี้ $5 จะเก็บค่า 0xbcde
– ตัวอย่างคำสั่ง addi $4 $5 0xaabb : $4 คือ rt, $5 คือ rs การทำงานก็คือ $4 = ($5) + 0xaabb
op(6) | rs(5) | rt(5) | immediate |
001000 | 00101 | 00100 | 1010 1010 1011 1011 |
addi | 5 | 4 | aabb |
รวมค่ากันทีละ 4 ค่าที่ได้คือ 0010|0000|1010| 0100 | 1010| 1010| 1011| 1011 = 20a4aabb
– ในการบวกลบเลขกันนั้นปกติถ้าจำนวนบิตไม่เท่ากันจะไม่สามารถทำได้ แต่ MIPs มี sign extention คือการเพิ่มจำนวนบิตของเลขที่มีจำนวนบิตน้อยกว่าให้เท่ากับเลขที่มีจำนวนบิตมากกว่า
– สิ่งที่น่าสังเกตคือ I-Type มี register อยู่ 2 ตัว ดังนั้นถ้าเขียนคำสั่ง load เช่น lw $4, 0($5) เป็นการโหลดค่าใน memory สู่ register ซึ่งเป็นการบอกว่า EA = (($5) + Imm) , EA = Effective Address ซึ่งเป็นค่าในรีจิสเตอร์จริงๆ โดยมีลักษณะคล้าย Pointer ในภาษาซี
op(6) | rs(5) | rt(5) | immediate |
100011 | 00101 | 00100 | 0000 0000 0000 0000 |
lw | 5 | 4 | 0 |
รวมกันค่าที่ได้คือ 1000|1100|1010|0100|0000|0000|0000|0000 = 8ca40000
R-Type (Register)
– เป็นการกระทำที่ operand เป็นregister ล้วนๆ
B31-26 | B25-21 | B20-16 | B15-11 | B10-6 | B5-0 |
opcode | register s | register t | register d | shift amount | functio |
– ตัวอย่างเช่น add $3 $4 $5
– rd คือตัวระบุ destination
– ดังนั้นถ้าเปรียบเทียบระหว่าง R-type กับ I-Type
– op บอกว่าคำสั่งหลักเป็นคำสั่งอะไร โดย variation ของคำสั่งจะอยู่ใน function
– function คือ variation ของคำสั่งหลัก
op (6) | rs (5) | rt (5) | rd (5) | shamt (5) | func (6) |
000000 | 00100 | 00101 | 00011 | 00000 | 100000 |
add | $4 | $5 | $3 | 0 | 2 |
ค่าที่ได้คือ 00851820
– shift amount หรือ shamt : ใช้ 5 bit
– ค่า variable ของ function เช่น addu 0/21, add 0/20 ซึ่งค่า 0 คือ opcode ส่วนค่า 21,20 เป็นค่าฟังก์ชั่น
J-type (jump type)
– เป็นคำสั่งที่มี imm มากสุดคือ 26 bit
– โดย 26 bit นี้อยู่ในโหมด word addressing, ถ้าอยู่ในรูปแบบ byte addressing จะได้ 28 bit
B31-26 | B25-0 |
opcode | target |
– จากการ Instrument code (ใส่โค้ดเข้าไปเพื่อดูว่าการเปลี่ยนของ program counter เป็นอย่างไร)ของ MIPS พบว่าการ jump ไม่เคยเกิน 28 bit ซักที ดังนั้น MIPS ก็เลย implement คำสั่ง J-Type ขึ้นมา
– ถ้า jump เกิน 28 bit ก็ให้ใช้คำสั่งอื่นเช่น jump register
Leave a comment