Hợp ngữ MIPS (P1)

Cơn mưa rào cuối hạ, đã đi qua,

Trời hửng nắng, heo may về nhè nhẹ

Sắc vàng tươi, trải dài trên con phố,

Xào xạc lá rơi, Hà nội thu sang (~ ~)

20200831105443337.jpg

Lời đầu tiên mình xin chào các bạn có duyên đến với blog này của mình để đọc những gì mình viết ở đây  (^∀^●)ノシ . Các bạn sẽ tự hỏi là tại sao mà mình viết bài về hợp ngữ MIPS này , vì kiến thức cũng không có gì mới mà lại viết . Lý do ở đây là hiện tại mình đang muốn nghiên cứu , tìm hiểu khai thác về các thiết bị IoT ( đặc biết là các thiết bị Router wifi ). Vậy nên các bạn biết rồi đó các thiết bị IoT thì thường sử dụng MIPS là kiến trúc bộ tập lệnh RISC.

Nói đến bộ tập lệnh thì có 2 loại là CISC và RISC.

- CISC được sử dụng chủ yếu trên các máy tính cá nhân và server lý do đơn giản là bộ tập lệnh này  nhiều và rất phức tạp dẫn đến tiêu tốn tài nguyên và điện năng. Chính vì vậy các thiết bị IoT thì không thích thú lắm 😊).

- Ngược lại RISC thì lại ít và đơn giản hơn gây tiêu tốn ít tài nguyên và điện năng hơn nên nó hợp cho những thiết bị IoT hoặc thiết bị di động.

Xàm xí vậy thôi vào chủ đề chính của ngày hôm nay thôi.

Hợp ngữ MIPS.

MIPS sau nhiều lần nâng cấp thì hiện tại có 2 phiên bản 32 bit và 64 bit nhưng bài viết này và về sau mình chỉ tập chung vào 32 bit cho nó thân thiện, với mình cũng đang tìm hiểu nên các bạn thông cảm nhé ^^.

20200831105116177.png

 MIPS có tổng cộng 32 thanh ghi để lưu giá trị được đánh số từ 0 – 31 cùng với quy ước chung khi sử dụng. Trong đó thì thanh ghi 0 thì luôn được gán cứng với giá trị 0.

Thanh ghi

Tên thông thường

Ý nghĩa

$0

$zero

Thanh ghi luôn chứa giá trị 0

$1

$at

Được dành riêng bởi assembler.

$2 – $3

$v0,$v1

Lưu giá trị trả về hàm

$4 - $7

$a0-$a3

Lưu tham số truyền vào hàm

$8 - $15

$t0 - $t7

Lưu biến tạm

$16 - $23

$s0 - $s7

Lưu giá trị thanh ghi

$24 - $25

$t8 - $t9

Tương tự như các thanh ghi $8 - $15

$$26 -$27

$k0 - $k1

Dành riêng cho vùng kernel. Không được dùng.

$28

$gp

Con trỏ tới vùng global ( Global Area Pointer)

$29

$sp

Stack Pointer

$30

$fp

Frame Poniter

$31

$rp

Return Address

 

Định dạng mã lệnh MIPS

Trên một số bộ xử lý, đặc biệt là bộ xử lý CISC, kích thước của mã lệnh thay đổi theo lệnh và toán hạng của nó.

Do MIPS giống với hầu hết các bộ xử lý RISC, sử dụng mã lệnh có độ dài cố định. Tất cả mã lệnh MIPS chính xác với 32 bit. Mã lệnh có độ dài cố định mang lại lợi thế là tìm nạp lệnh đơn giản hơn, đồng nghĩa là bộ xử lý nhỏ hơn, rẻ hơn. Đơn giản và nhỏ hơn sẽ nhanh hơn, tiêu thụ điện năng và chi phí sản xuất thấp hơn.

Register Instructions

Các lệnh thanh ghi có hai thanh ghi nguồn và một thanh ghi đích.

Định dạng lệnh Register.

Opcode

Source 1

Source 2

Destination

Shift Amount

Function

000000

5 bits

5 bits

5 bits

5 bits

6 bits

 

Giải thích:

Opcode( 6 bits): Thanh ghi này chứa 6 bits 0 chỉ ra rằng đây là lệnh thanh ghi (RI)

Function( 6 bits): Thanh ghi này sử dụng 6 bit để phân biệt các mã lệnh với nhau

Source 1, Source 2( 10 bits): 2 Thanh ghi này để thực hiện tính toán.

Destination (5 bits): Thanh ghi này lưu trữ kết quả tính toán được.

Shifft Amount ( 5 bits): Số bit cần dịch trái, dịch phải khi có lệnh dịch bit.

 

Ví dụ:  add   $t3,  $t4,  $t1  

Trong đó: $t3 = 11,  $t4 = 12,  $t1= 9

000000

01100

01001

01011

00000

10000

RI

$t4

$t1

$t3

unused

add

 

Jump Instructions

Định dạng lệnh Jump

Opcode

Target Offset

0001xx

26 bits

 

Trường hợp nếu 6 bits ngoài cùng bên trái là 00001x thì đây là lệnh nhảy không điều kiện.

Ví dụ:

000010         xxxxxxxxxxxxxxxxxxxxxxxxxx   ~ j       label  

000011         xxxxxxxxxxxxxxxxxxxxxxxxxx   ~ jal     label 

 

Nhìn vào đây các bạn sẽ tự hỏi có 26 bit thì làm thế nào mà nó nhảy được đến địa chỉ đích 32 bit. Trường địa chỉ đích chuyển thành địa chỉ 32 bit, được thực hiện tại thời điểm chạy, khi lệnh nhảy được thực thi.

Cách thực hiện:

-  Dịch 26 bit sang trái hai vị trí 2 bit bậc thấp trở thành “00”.

- Sau khi thay đổi ta cần điền  bốn bit bậc cao của địa chỉ. Bốn bit này đến từ bậc cao trong PC ( Program Counter).

 20200831105943819.png

Coprocessor Instructions

Nếu 6 bits ngoài cùng là 0100xx, thì lệnh được xử lý bởi bộ đồng xử lý / coprocessor ( Một phần mở rộng cho MIPS CPU cở bản ). Hai bits cuối cùng đại diện cho bộ đồng xử lý (coprocessor).

Opcode

Source 1

Source 2

Destination

Shift Amount

Function

0100xx

5 bits

5 bits

5 bits

5 bits

6 bits

 

 

Immediate Instructions

Nếu 6 bit ngoài cùng bên trái khác với tất cả các mẫu ở trên , thì lệnh được sử dụng cho định dạng tức thời.

Các lệnh tức thời sử dụng một thanh ghi nguồn , môt thanh ghi đích và 16 bit toán hạng nguồn tức thời.

Toán hạng tức thời giới hạn 16 bit vì vậy số có không dấu từ 0 – 65535 hoặc có dấu -32768 – 32767 ( bộ xử lý MIPS sử dụng bù 2 cho toán hạng có dấu )

Opcode

Source

Destination

Immediate Operand

0100xx

5 bits

5 bits

16 bits

 

Ví dụ: addi $t1, $t5, 7

Opcode

Source

Destination

Immediate Operand

001000 

sssss  

ttttt

0000000000000111

addi

$t1

$t5

7

 

 

Bài viết đến đây là hết rồi, mình viết bài này chủ yếu là  giới thiệu sơ qua cái chung và tổng quát nhất của hợp ngữ MIPS thôi. Bài sau mình sẽ nói chi tiết về các lệnh mình coi là quan trong trong MIPS :D. Đây sẽ là một seri dài hạn ai đọc được thì cho mình xin một like và subscribe nhé ^^.

Link tham khảo:

https://chortle.ccsu.edu/AssemblyTutorial/index.html

https://en.wikipedia.org/wiki/MIPS_architecture