BÀi tập lớn môn: Kiến trúc máy tính Yêu cầu: Tìm hiểu kiến trúc mips



tải về 133.42 Kb.
Chuyển đổi dữ liệu30.08.2016
Kích133.42 Kb.
#29156
BÀI TẬP LỚN
Môn: Kiến trúc máy tính

***

Yêu cầu:

1. Tìm hiểu kiến trúc MIPS

- Mô hình lập trình: Tập thanh ghi, không gian địa chỉ.

- Các kiểu dữ liệu

- Tập lệnh

- Quản lý bộ nhớ

- PiPeline



2. Tìm hiểu phần mềm mô phỏng MipsIt hoặc PCSim

3. Lập trình hợp ngữ cho MIPS
1. Giới thiệu.

RICS- Reduced Instruction Set Computer, là một dạng của kiến trúc vi xử lý, là một phương pháp thiết kế các bộ vi xử lý theo hướng đơn giản hóa tập lệnh, trong đó thời gian thực thi tất cả các tập lệnh đều như nhau.

Đầu tiên, các dự án về RICS được bắt đầu từ IBM, Stanford và UC Berkeley vào cuối những năm 70 đầu những năm 80. Hiện nay, các bọ vi xử lý phổ biến là ARM, SuperH, MIPS, SPARC, DEC Alpha, PA-RICS, PIC và PowerPC của IBM.



MIPS- Microprocessor without Interlocked Pipeline Stages, là một kiến trúc xử lý kiểu RICS được phát triển bởi công ty MIPS technologies. Các bộ xử lý MIPS được phát triển như là một phần của chương trình nghiên cứu VLSI ở trường đại học Stanford đầu những năm 80.Nhóm nghiên cứu Stanford có một nền tảng mạnh mẽ trong biên dịch đã đưa họ đến sự phát triển một bộ xử lý, cái mà giảm bớt sự có mặt của trình biên dịch ở cấp phần cứng, trái ngược với sự tăng lên của phần cứng với phần mềm,nó là một bước tiến dài trong triết lý thiết kế phần cứng.

Năm 1984, Hennessy rời khỏi trường Stanford để xây dựng hệ thống máy tính MIPS sau khi nhận ra nhu cầu thương mại tương lai của thiết kế. Phiên bản MIPS R2000 đầu tiên ra đời năm 1985, sau đó là phiên bản MIPS R3000 năm 1988.

Kiến trúc tập lệnh MIPS (ISA) được phát triển từ kiến trúc tập lệnh MISO I đến kiến trúc tập lệnh MIPS V. Vào cuối những năm 1990, kiến trúc MIPS đã được thiết kế xung quanh hai kiến trúc cơ bản sau:


  • MIPS32 cho kiến trúc 32-bit. Kiến trúc MIPS-32bit dựa vào tập lệnh MIPS II ISA với một vài lệnh được thêm vào từ tập lệnh MIPS III đến tập lệnh MIPS V ISA.

  • MIPS64 cho kiến trúc 64-bit , kiến trúc MIPS-64bit thì dựa vào tập lệnh của MIPS V ISA.

Ngày này, kiến trúc MIPS được sử dụng rộng dãi trong các hệ thống nhúng như Series2 TiVo, các thiết bị Window CE, các bộ định tuyến Cisco, các thiết bị chơi game như Nitendo 64, Sony PlayStation... MIPS được thiết kế một bộ tập lệnh đơn giản dễ hiểu nên việc nghiên cứu kiến trúc MIPS rất hữu ích cho việc nghiên cứu về kiến trúc máy tính.

2. Tìm hiểu về MIPS.

Kiến trúc MIPS là kiến trúc các thanh ghi. Tất cả các phép toán số học và logic đều chỉ xoay quanh thanh ghi(hay các hằng số được lưu trữ như là một thành phần của lệnh). Kiến trúc MIPS cũng bao gồm một số các câu lệnh đơn giản dùng để đọc dữ liệu từ bộ nhớ vào thanh ghi và ghi dữ liệu từ thanh ghi sang bộ nhớ. Vì vậy kiến trúc MIPS được gọi là kiến trúc nap/lưu trữ,trong kiến trúc nạp/lưu trữ chỉ có những câu lệnh có thể truy cập vào bộ nhớ là các câi lệnh nạp/lưu trữ còn các câu lệnh khác chỉ có thể truy cập tới thanh ghi.



2.1. Các thành phần cơ bản của kiến trúc MIPS.

Kiến trúc MIPS bao gồm các thành phần sau:



  • MIPS instruction set architecture(ISA)-Kiến trúc tập lệnh MIPS: Nó định nghĩa một tập các câu lệnh 32bit và 64 bit để đảm bảo tương thích với mọi bộ xử lý áp dụng kiến trúc MIPS. Tập lệnh MIPS bao gồm tổng cộng 111 câu lệnh ở hệ 32 bit, ví dụ như một câu lệnh MIPS dưới đây:

Ở trên là câu lệnh Assembly(trái) và số nhị phân(phải) đại diện cho một câu lệnh cộng của MIPS. Câu lệnh gọi bộ xử lý để tính tổng các giá trị trong thanh ghi 7 và 8 và lưu trữ kết quả trong thanh ghi 12. Các tín hiệu “$” để chỉ một hoạt động được đăng ký trên thanh ghi.Những màu nhị phân bên cạnh đại diện cho 6 phần của câu lệnh MIPS. Việc xử lý xác định các loại câu lệnh ở ô đầu tiên và cuối cùng.Các toán hạng được đặt ở các ô màu xanh và màu vàng còn kết quả được đặt ở ô thứ 4. Ô màu cam đại diện cho số lượng chuyển đổi cái mà không phải sử dụng các thao tác thêm.



  • MIPS privileged resource architecture(PRA)-Kiến trúc tài nguyên phân quyền: Nó đưa ra một tập các môi trường đảm bảo cho ISA hoạt động. PRA cung cấp các cơ chế cần thiết để quản lý các tài nguyên của bộ xử lý: bộ nhớ ảo, cache, các ngoại lệ…

  • MIPS application specific extension(ASE)-Các thành phần mở rộng tùy chọn cho ứng dụng:Nó cung cấp các chức năng nâng cao được thiết kế riêng biệt cho các chức năng khác nhau.

  • MIPS user defined struction(NDIs)-Câu lệnh được người dùng định nghĩa: Đây là các câu lệnh đặc biệt cho các úng dụng khác nhau cho mục đích ứng dụng khác nhau khi một bộ xử lý áp dụng kiến trúc MIPS.

Máy tính làm việc bởi lấy lệnh ngôn ngữ máy từ bộ nhớ, giải mã và tính toán chúng. Ngôn ngữ máy và các giá trị sẽ được tính toán và mã hóa thành mã nhị phân. Máy tính chỉ làm việc với các giá trị nhị phân, để thực hiện xây dựng một kiến trúc máy tính sử dụng kiến trúc MIPS thì các thành phần cơ bản phải bao gồm là:



    • Program counter(PC): con trỏ chương trình.

    • Memory : Bộ nhớ.

    • Instruction Register: tập các thanh ghi lệnh.

    • Register File: tập các thanh ghi.

    • ALU: Khối đơn vị số học và logic.

    • CU: khối đợn vị kiểm soát

Tất cả các thành phần ngoại trừ CU, thì đều được kết nối với nhau bằng bus. Bus là tập hợp đường dẫn điện tử với sự khác nhau về sự thiết lập giá trị nhị phân được vận chuyển trên đường dẫn đó. Hầu hết các bus của kiến trúc Mips đều có bề rộng 32-bits.

2.2 Đồ hình truyền dữ liệu:

Đây là một minh họa về đường đi của dữ liệu trong kiến trúc MIPS. Ngày nay việc cài đặt đường ống và siêu vô hướng là chung nhất cho các bộ xử lý hiệu năng cao.



2.3. Tập thanh ghi trong kiến trúc MIPS.

Thuật ngữ register để ám chỉ một thành phần nhớ điện từ. Kiến trúc MIPS cung cấp một tập hợp gồm 32 thanh ghi chung, một thanh ghi chương trình (hay còn được gọi là con trỏ chương trình PC), và có thêm hai thanh ghi đặc biệt. Tất cả các register của kiến trúc Mips đều là thành phần với khả năng nắm giữ 32-bits số nhị phân. Mỗi register có khả năng nắm giữ một giá trị 32-bits. Khi viết ở mức hợp ngữ, hầu hết các lệnh yều cầu một chương trình đặc biệt mà các thanh ghi trong tập thanh ghi (register file) sẽ được sử dụng trong quá trình tính toán lệnh. Một sự thỏa thuận sẽ được thông qua để chi tiết rằng thanh ghi nào sẽ được sử dụng tương ứng với một ngữ cảnh cụ thể. Các thanh ghi sẽ được gọi bằng tên tương ứng, cái mà sẽ giúp nhắc nhở chúng ta về sự thỏa thuận này.



2.3.1. Thanh ghi CPU.

Tập thanh ghi MIPS



Tên

Số

Ý nghĩa

$zero

$0

hằng số 0

$at

$1

Asembler Temporary

$v0-$v1

$2-$3

Giá trị trả lại của hàm hoặc biểu thức

$a0-$a3

$4-$7

Các tham số của hàm

$t0-$t7

$8-$15

Thanh ghi tạm

$s0-$s7

$16-$23

Thanh ghi lưu trữ

$t8-$t9

$24-$25

Thanh ghi tạm

$k0-$k1

$26-$27

Dự trữ cho nhân OS

$gp

$28

Con trỏ toàn cục

$sp

$29

Con trỏ stack

$fp

$30

Con trỏ frame

$ra

$31

Địa chỉ trả về

Thanh ghi zero( có tên là $zero) là đặc biệt, nó là nguồn gốc của giá trị zero. Không có một giá trị nào được ghi vào thang ghi zero. Thanh ghi 1( có tên là $at), được gọi cho hợp ngữ tạp thời, thanh ghi này dành cho tính toán các lệnh marco, và không nên được sử dụng cho các chương trình hợp ngữ. Các thanh ghi $k0 và $k1 được sử dụng bởi các nhân( kernel) của hệ điều hành, và không nên bị thay đổi bởi chương trình người dùng. Thanh ghi cuối cùng $31 được sử dụng giống như là một thanh ghi liên kết bởi lệnh nhảy và lệnh liên kết, cái mà sẽ được sử dụng để gọi một thủ tục. Thanh ghi $31 được sử dụng để ghi nhớ địa chỉ trả về của một thủ tục được gọi.

Các thanh ghi $v0 và $v1 dùng để lưu trữ giá trị trả về của hàm.

Các thanh ghi $t0-$t9 là các thanh ghi có nhớ lời gọi. Dùng cho các giá trị tạm thời mà không cần phải nhớ mỗi khi có lời gọi.

Các thanh ghi $s0-$s7 là các thanh ghi có nhớ lời gọi.dùng cho các giá trị không thay đổi mỗi khi có lời gọi.

Thanh ghi $sp là con trỏ stack, trỏ tới vị trí cuối cùng trỏ tên stack.

Thanh ghi $rp là con trỏ frame.

Thanh ghi $ra ghi lại địa chỉ trả về mỗi khi có lời gọi hàm.

Thanh ghi $gp là con trỏ toàn cục trỏ tới vị trí giữa của khối bộ nhớ 64K vùng heap, nơi chứa các biến và hằng số toàn cục.

Hai thanh ghi đặc biệt được gọi là thanh ghi HI và thanh ghi LO, chúng được sử dụng để kiểm soát kết quả của một lệnh thực hiện nhân hoặc chia số nguyên.

2.3.1.1. Thanh ghi chương trình(PC).

Sau khi một chương trình được viết như là một chương trình bằng ngôn ngữ hợp ngữ sử dụng một trình tạo văn bản, chương trình được chuyển thành mã máy bằng một chương trình sử dụng gọi một trình biên dịch hợp ngữ. Mã của ngôn ngữ máy được ghi vào một file trên đĩa. Khi mà một người muốn thực hiện chương trình này, một chương trình sử dụng khác, gọi một đường dẫn nạp chương trình, sẽ nạp và liên kết với tất cả các khối ngôn ngữ máy cần thiết bên trong bộ nhớ chính. Các lệnh riêng biệt sẽ được ghi nhớ tuần tự vào bộ nhớ. Con trỏ chương trình( PC) là một thanh ghi được khởi tạo bởi hệ điều hành đến địa chỉ của lệnh đầu tiên của chương trình trong bộ nhớ. Chú ý rằng địa chỉ trong con trỏ chương trình được gửi đến đầu vào địa chỉ của bộ nhớ thông qua một bus. Sau khi một lệnh được lấy từ bộ nhớ và được nạp vào thanh ghi lệnh( IR) con trỏ PC sẽ được tăng để CPU có được địa chỉ cho lệnh tuần tự tiếp theo cho quá trình lấy lệnh.



2.3.1.2. Các thanh ghi lệnh.

Thanh ghi lệnh IR là thanh ghi 32-bits dùng để nắm bản sao chép của lệnh được gọi đến gần đây nhất. Trong kiến trúc MIPs thì có 3 định dạng lệnh khác nhau được định nghĩa: định dạng R, định dạng I và định dạng J.



2.3.1.3. Các quy ước sử dụng các thanh ghi.

Mặc dù không có bất kì một yêu cầu nào từ phần cứng của bộ xử lý, nhưng luôn tồn tại một sự thỏa thuận cho việc làm thế nào 32 thanh ghi sẽ được sử dụng. Bởi vì những sự gợi ý này là không hề bắt buộc bởi phần cứng, do đó chúng ta có thể sử dụng các thanh ghi chung một cách thoải mái, tuy nhiên các chương trình đó sẽ không giống để làm việc với các chương trình khác.



Thanh ghi $v0 và thanh ghi $v1 được sử dụng trả về kết quả cho một thủ tục. Các thanh ghi từ $a0 đến $a3 được sử dụng để gọi bốn tham số đầu của một thủ tục. Các tham số duy trì được gọi thông qua stack. Những thanh ghi này là không dành riêng cho lời gọi một thủ tục duy nhất. Lời gọi một thủ tục có thể thay đổi giá trị của các thanh ghi này. Các thanh ghi từ $t0 đến $t9 là các thanh ghi tạm thời, không dành riêng cho các lời gọi các thủ tục. Các thanh ghi này sẽ được bảo đảm để được ghi nhớ bởi một lời gọi. Thêm vào đó thì các thanh ghi từ $s0 đến $s7 được gọi là các thanh ghi lưu trữ, những thanh ghi này có thể được dành riêng cho lời gọi các thủ tục. Thanh ghi $sp là con trỏ stack, đây là thanh ghi rất hữu dụng cho việc cài đăt stack. Nó luôn trỏ tới đỉnh của một stack. Trình biên dịch MIPS không sử dụng một con trỏ nền (frame pointer). Đối với một kết quả, các thanh ghi con trỏ nền $fp được sử dụng như là lưu trữ lời gọi thanh ghi $s8. Thanh ghi $ra được sử dụng để lưu giá trị địa chỉ trả về trong một thủ tục.

Thanh ghi $gp trỏ đến vùng nhớ được dùng để lưu trữ các biến toàn cục và các biến hằng. Thanh ghi $at được dành cho trình biên dịch hợp ngữ. Trình biên dịch hợp ngữ thường sử dụng thanh ghi này để thông dịch lệnh giả mã. Các lệnh giả mã không phải là các lệnh của bộ xử lý, đó chỉ là các lệnh được hỗ trợ bởi trình biên dịch hợp ngữ. Mỗi một giả mã được thông dịch bởi trình biên dịch hợp ngữ thành một hoặc nhiều lệnh của bộ vi xử lí.
2.3.2. Thanh ghi FPU.

Kiến trúc MIPS đưa ra các thanh ghi FPU sau:

- 32 thanh ghi dấu chấm phẩy động. Các thanh ghi này có độ dài 32-bit nếu là bộ FPU 32-bit hoặc 64 bit nếu là bộ FPU 64-bit.

- 5 thanh ghi điều khiển FPU dùng để nhận diện và quản lý FPU

- 8 bộ mã điểu khiển số dấu chấm động là các thành phần của thanh ghi FCSR,FP control/status register.

2.3.2.1. Dữ liệu trong thanh ghi FPU.

FPU hỗ trợ hai dạng dữ liệu: số dấu chấm động và số dấu chấm tĩnh:



  • Số dấu chấm động độ chính xác đơn và kép được định nghĩa theo chuẩn IEEE.

  • Số dấu chấm tĩnh là các số nguyên có dấu hỗ trợ bởi kiến trúc CPU.

Các dạng số dấu chấm động được cung cấp bởi FPU là:

  • Số dấu chấm động chíng xác đơn 32-bit (kiểu S):




S(bit dau)

phần mũ

phần lẻ

1bit

8 bit

23 bit




  • Số dấu chấm động với độ chính xác kép (kiểu D)

S(bit dau)

phần mũ

phần lẻ

1bit

11 bit

52 bit




  • Số dấu chấm động đơn kẹp đôi (kiểu PS):

S

phần mũ

phần lẻ

S

phần mũ

phần lẻ

1 bit

8 bit

23 bit

1 bit

8 bit

23 bit

Các định dạng số dấu chấm tĩnh hỗ trợ bởi FPU:



  • Kiểu Word 32-bit.

S

Interger

1 bit

31 bit

- Kiểu LongWord (kiểu L)



S

Interger

1 bit

63 bit


2.3.2.2. Các thanh ghi đa năng.

Trong phiên bản 1 của kiến trúc số dấu chấm động chỉ có trong kiến trúc MIPS64 nhưng ở phiên bản 2 thì chúng được hỗ trở trong cả kiến trúc MIPS32.

FPU 32-bits có 32 thanh ghi 32-bits.FPRs, mỗi thanh chứa một kiểu dữ liệu 32 bits. Kiểu xác định kép(Double-pricesion-kiểu D) được lưu trữ trong các cặp thanh ghi chẵn, lẻ của FPRs, còn số nguyên dài(kiểu L) và kiểu Paired single(kiểu PS) thì không được hỗ trở.

FPU 64-bits có 32 thanh ghi 64 bits số dấu chấm động, mỗi thanh ghi có thể chứa mọi kiểu dữ liệu. Để tương thích với FPU 32-bits, bit FR trong thanh ghi CP0 Status được sử dụng trong MIPS64 phiên bản 1 hoặc bất kỳ bộ xử lý phiên bản 2 nào hỗ trợ FPU 64-bits để điểu chỉnh FPU sang trạng thái mà các thanh ghi FPRs được coi như các thanh ghi 32 bits, và sẽ lưu trữ các kiểu dữ liệu giống FPRs 32-bits.



    • FR =0 : chế độ 64-bits

    • FR =1 : chế độ 32-bits. Khi đó chỉ 32 bits đầu được sử dụng, 32 bits sau không dùng.


2.3.2.3. Các thanh ghi điều khiển.

Có 5 thanh ghi điều khiển trong kiến trúc MIPS:

- FIR,FP Implementation and Revision Register.

- FCCR, FP condition codes Register.

- FEXR, FP Exception Register.

- FENR, FP Enables Register.

- FCSR, FP control/Status Register.

FCCR, FEXR, FENR truy cập tới FCSR thông qua lệnh CTC1 và CFC1. Các thanh ghi này được dùng nếu chế độ dấu chấm động được sử dụng.



2.4. Bộ nhớ.

Tất cả các bộ xư lý hiện đại đều làm việc với bộ nhớ cache. Bộ nhớ cache được đặt trên chip CPU. Bộ nhớ cache cung cấp bộ nhớ nhanh để truy cập đến các lệnh và dữ liệu thay vì CPU phải truy cập vào bộ nhớ chính. Bộ nhớ cache có chức năng giống như là một cái mảng đĩa phương rộng nơi mà thông tin được lưu trữ và lấy ra theo từ nhớ( word), một từ nhớ( word) là tương ứng với 32-bits. Mỗi vùng trong bộ nhớ có 32-bits địa chỉ. Trong kiến trúc MIPs, địa chỉ của bộ nhớ được đánh từ 0 đến 4,294,967,295. Trong kiến trúc Mips thì một từ nhớ là 32-bits và một byte là 8-bits. Như vậy trong kiến trúc MIPs thì một từ bao gồm 4-Bytes, và đơn vị địa chỉ nhỏ nhất có thể của thông tin được tham biến trong bộ nhớ là một byte. Địa chỉ của byte đầu tiên trong từ nhớ cũng là địa chỉ của từ nhớ. Tất cả các lệnh trong kiến trúc MIPs đều có 32-bits độ dài. Vì vậy con trỏ chương trình được tăng lên 4 sau khi mỗi lệnh được thực hiện.



2.5. Kiểu dữ liệu và cách thức đánh địa chỉ:

2.5.1. Kiểu dữ liệu:

Ta xét bộ xử lý R4000, đây là một bộ xử lí thiết kế theo kiến trúc MIPS, sử dụng 4 định dạng dữ liệu là:



  • Kiểu doubleword với 64-bit.

  • Kiểu word với 32-bit.

  • Kiểu half với 16-bit.

  • Kiểu byte với 8-bit.

Trong đó thì trật tự sắp xếp của các byte trong các kiểu định dạng halfword, word và doubleword có thể được thiết lập theo kiêu đầu to (big-endian) hoặc kiểu đầu nhỏ (little-endian).

Khi mà bộ xử lí được thiết lập theo kiểu đầu to, thì byte số 0 là byte có ý nghĩa cao nhất và ngược lại, đối với kiểu đầu nhỏ thì byte số 0 là byte có ý nghĩa thấp nhất.

Hình 3: Kiểu big-endian

Hình 4: Kiểu little-endian



Hình 5,6 minh họa trật tự theo kiểu little-endian và big-endian trong một doubleword:



Hình 5: Dữ liệu kiểu đầu nhỏ trong doubleword.



Hình 6: Dữ liệu đâu to trong Doubleword.



2.5.2. Cách thức đánh địa chỉ:

Kiến trúc Mips được biết đến với tập lệnh máy tính đơn giản. Các nhà thiết kế kiến trúc Mips cung cấp một tập hợp các lệnh cơ bản. Trong trường hợp muốn gọi một giá trị từ bộ nhớ chính hoặc ghi một giá trị vào bộ nhớ chính, chỉ một phương thức đánh địa chỉ được cài đặt trong phần cứng của máy tính. Phương pháp đánh địa chỉ này được hiểu như là phương pháp đổi chỗ nhiều địa chỉ cơ sở. Phương thức đánh địa chỉ đưa ra cách thức để biết được làm thế nào mà một toán hạnh được xác định.

Như chúng ta đã biết thì đối với một toán hạng nó có thể có 3 vị trí: trong thanh ghi, trong bộ nhớ, hoặc nằm ngay trong phần của câu lệnh và được hiểu như là một hắng số. Việc xác định một hắng số được coi như một toán hạng được gọi là phương thức đánh địa chỉ tức thời. Tương tự như vậy, việc xác định một toán hạnh được lưu trong thanh ghi gọi là phương thức đánh địa chỉ thanh ghi. Mọi bộ xử lý đều chấp nhận hai phương thức đánh địa chỉ này. Sự khác nhau giữa bộ xử lí RISC và CISC là làm thế nào chúng xác định được một toán hạng trong bộ nhớ. Việc thiết kế CISC sự biến đổi rộng rãi của phương thức đánh địa chỉ bộ nhớ. Còn việc thiết kế RISC chỉ chấp nhận duy nhất một hoặc nhiều nhất là hai kiểu phương thức đánh địa chỉ trong câu lệnh nạp và ghi bộ nhớ. Tất cả các kiến trúc MIPS chấp nhận hai phương thức đánh địa chỉ sau đây:


  • Địa chỉ của toán hạng được tính toán bởi phép cộng nội dung của một thanh ghi và một hằng số. Nếu như là hằng số bằng 0, nội dung của thanh ghi được sử lí giống như là địa chỉ của một toán hạng. Trong phương thức này, địa chỉ bộ nhớ được tính toán giống như sau:

Address = contents of a register + constant.

  • Địa chỉ của toán hạng bộ nhớ được tính toán bởi phép cộng nội dung của hai thanh ghi. Nếu như một thanh ghi là bằng 0, phương thức đánh địa chỉ này trở thành giống nhưa phương thức trên với hằng số 0. Trong phương thức này, địa chỉ được tính toán như sau:

Address = contents of register 1+ contents of register 2.

Kiến trúc Mips là một kiến trúc nạp và ghi( Load/Store architecture), điều này có nghĩa là tất cả các lệnh truy cập vào bộ nhớ chính đều là các lệnh nạp và ghi( Load/store instruction).

Một lệnh nạp truy cập giá trị từ bộ nhớ và đặt một bản copy của giá trị tìm thấy trong bộ nhớ vào một trong số tập hợp các thanh ghi. Ví dụ:

Lw $s1,8($a0)

Lệnh này sẽ tính toán địa chỉ thật của vùng nhớ được truy cập bởi thao tác cộng nội dung của thanh ghi $a0 ( thanh ghi cơ sở) và 8 giá trị hằng( sự đổi chỗ). Một bản copy của giá trị truy cập từ bộ nhớ chính tại địa chỉ thực sẽ được nạp vào trong thanh ghi $s1. Một lệnh giả mã tương đương như sau:

$s1 = Mem[$a0 + 8]

Chú ý rằng trong ví dụ này thì địa chỉ cơ sở là giá trị của thanh ghi $a0, và số đổi chỗ là giá trị hằng 8. Giá trị cở sở sẽ luôn luôn là giá trị của một trong những thanh ghi register file. Và giá trị di chuyển luôn luôn là một giá trị hằng, giá trị hằng này có thể nhân các giá trị từ -32,768 đến +32,767. Trong trường hợp lệnh nạp một từ nhớ, địa chỉ thực cần phải là một con số mà là kết quả của một phép nhân với 4, bởi vì một từ nhớ bao giờ cũng bao gồm 4 byte. Cấu trúc lệnh nạp của ngôn ngữ hợp ngữ có vài cái dễ nhầm lẫm. Nếu ai đó viết một trình biên dịch hợp ngữ cho kiến trúc Mips mới, cấu trúc sau đây sẽ làm việc tốt hơn của vân chuyển đến người dùng những gì mà lệnh thực hiện hiện thời:

Lw $s1,[$a0+8]

Sau đây là một ví dụ về lệnh nạp từ nhớ:

Sw $s1, 12($a0)

Khi mà phần cứng tính toán lệnh này, nó sẽ tính địa chỉ thật của vùng nhớ tới bằng cách cộng nội dung của thanh ghi $a0 và giá trị hằng 12. Một bản copy nội dung của thang ghi $s1 được ghi vào bộ nhớ chính tại địa chỉ thực, một lệnh giả mã tương ứng như sau:

Mem[$a0+12]=$s1

Từ quan điểm của người lập trình hợp ngữ, bộ nhớ có thể được thông đến giống như là một mảng tuyến tính dài, và địa chỉ thực là một con trỏ đến một vài vùng của mảng mà hệ điều hành chỉ định giống như là một khối dữ liệu. Con trỏ chương trình PC là con trỏ trong cùng một mảng, nhưng đến một khối khác được gọi khối chương trình. Hệ điều hành cung cấp một mảng khác trong bộ nhớ được gọi là khối ngăn xếp.

2.6. Tập lệnh trong MIPS.

Tập lệnh (Instruction Set) luôn là phần thiết yếu không thể thiếu của bất kì một kiến trúc nào. Một lệnh trong MIPS32 có độ dài 32 bits, còn trong MIPS64 là 64 bits. Lệnh được mô tả bằng hợp ngữ.

Chúng ta có một danh sách các lệnh cho kiến trúc Mips, mỗi một lệnh sẽ được gán một mã nhị phân duy nhất, để có một danh sách các tập lệnh đầy đủ của kiến trúc Mips, chúng ta có thể tham khảo cuốn “MIPS RISC Architecture” của tác giả Kane và Heinrich. Một máy tính sẽ có 2 lệnh cơ bản là cộng( add) và trừ( substract). Các giá trị của các phép toán( source values) sẽ được lấy ra từ register file và sau khi tính toán thì kết quả sẽ được lưu lại vào register file. Khi lập trình bằng hợp ngữ, chúng ta sử dụng một kiểu gợi nhớ để cho biết rằng với phép toán nào đó thì chúng ta muốn máy tính thực hiện và chúng ta cụ thể vùng nhớ cụ thể register file nào thì sẽ được sử dụng tên của vùng nhớ đó. Chúng ta giả sử rằng một người lập trình hợp ngữ muốn cộng nội dung của thanh ghi $a1 to nội dung của thanh ghi $s1, và kết quả nhận được sẽ được đặt vào thanh ghi $v1, khi đó chúng ta sẽ có lệnh của ngôn ngữ lập trình hợp ngữ để làm việc đó như sau:
add $v1,$a1,$s1

Một lệnh giả mã tương ứng sẽ có dạng: $v1 = $a1 + $s1

Kiến trúc MIps bao gồm các lệnh bit logic như: “AND”, “OR” , và “Exclusive-OR” , và có các lệnh để thực hiện các cấu trúc kiếm soát như:

“if … then … else … ”

Các lệnh nhân thực hiện nhân hai giá trị 32-bits và sản sinh ra một kết quả là 64-bits, kết quả này sẽ được ghi nhớ vào hai thanh ghi High và Low. Đoạn mã sau đây sẽ chỉ ra cách làm thế nào để 32-bits thấp của $s1 có thể được di chuyển vào thanh ghi $v1:

Mult $a1,$s1

Mflo $v1

Lệnh chia sau sẽ thực hiện chia giá trị nhị phân 32-bits trong thanh ghi $a1 bởi giá trị 32-bits trong thanh ghi $s1. Thương của phép chia sẽ được ghi vào thanh ghi thấp( Low) và số dư của phép chia được ghi nhớ vào thanh ghi cao( High). Khối mã sau đây sẽ chỉ ra làm thế nào thương của phép chia được di chuyển vào trong thanh ghi $v0 và số dư của phép chia vào trong thanh ghi $v1:

div $a1,$s1

mflo $v0


mfhi $v1

2.6.1. Các định dạng lệnh cơ bản trong MIPS.

Có 3 loại lệnh trong MIPS là:

- Immediate(I-type)

- Jump(J-type)

- Register(R-type)



2.6.2. Các lệnh cơ bản trong kiến trúc MIPS

2.6.2.1. Các lệnh nạp ghi :

Các lệnh nạp và ghi (Load and Store Instructions) là các lệnh di chuyển dữ liệu giữ bộ nhớ và các thanh ghi chung. Chúng đều là các lệnh có định dạng kiểu immediate (I-type), do đó phương thức đánh địa chỉ duy nhất được hỗ trợ là thanh ghi cơ sở cộng 16 bit, có bù định dạng immediate có dấu.





2.6.2.2. Các lệnh số học và logic.

Các lệnh điện toán (Computational Instructions) thực hiện các phép tính số học, logic, dịch chuyển, nhân, và chia trên các giá trị của các thanh ghi. Các lệnh này bao gồm lệnh định dạng kiểu thanh ghi (kiểu R-type, trong đó đã bao gồm đồng thời các toán hạng và kết quả được lưu trữ trong các thanh ghi) và định dạng kiểu immediate (I-type, trong đó đã bao gồm một toán hạng có là một giá trị định dạng immediate với 16 bit).


Các lệnh số học (KiểuImmediate):

Các lệnh số học (Kiểu 3-toán hạng, và R-type):



Các lệnh nhân và chia:



Các lệnh so sánh:



Câu lệnh

Ví dụ

Ý nghĩa

Set on less than

slt $s1,$s2,$s3

If ($s2 < $s3) $s1=1;

Else


$s1=0;

Set on less than unsgn

sltu $s1,$s2,$s3

If ($s2 < $s3) $s1=1;

Else


$s1=0;

Set on less than imm

slti $s1,$s2,10

If ($s2 < 10) $s1=1;

Else


$s1=0;

Slt immediate

sltiu $s1,$s2,10

If ($s2 < 10) $s1=1;

Else


$s1=0;

2.6.2.3. Các lệnh nhảy và rẽ nhánh.

Các lệnh nhảy và rẽ nhánh (Jump and Branch Instructions) là các lệnh thay đổi dòng kiểm soát của một chương trình. Lệnh nhảy luôn được làm đến một trang, dạng địa chỉ tuyệt đối bởi một biên dịch địa chỉ 26-bit, với các bit cao của con trỏ chương trình (kiểu J-type) hoặc địa chỉ thanh ghi (dạng R-type). Các lệnh rẽ nhánh có bù 16-bit liên quan đến con trỏ chương trình (dạng I-type). Các lệnh nhảy và liên kết được nhớ giá trị trả về của chúng trong thanh ghi 31.


Các lệnh nhảy và rẽ nhánh



2.6.2.4. Các lệnh nạp, nhớ, di chuyển dữ liệu.

Toán hạng thư hai của các câu lệnh load và store phải la các địa chỉ. Kiến trúc MIPS hỗ trợ modes địa chỉ.

Các câu lệnh truy nhập và lưu trữ cơ bản là sự truyền những từ (32 bit ) giữa bộ nhớ và thanh ghi.Mỗi một câu lệnh định rõ một địa chỉ thanh ghi và một địa chỉ bộ nhớ.Thanh ghi, nơi cất dữ dữ liệu để lưu truy nhập và là kho dữ liệu để lưu trữ, được định rõ trong trường rt của lệnh I-fomat. Địa chỉ bộ nhớ được định rõ trong phần: được thêm vào để cung cấp địa chỉ 16 bit nguyên trong câu lệnh là hằng số thông thường được thêm tới giá trị cơ bản trong thanh ghi rs.Trong ngôn ngữ assembly thanh ghi nguồn và thanh ghi đích rt được định rõ đầu tiên cho phép bởi hằng số offset và thanh ghi cơ sở rs trong dấu ngoặc đơn.



Câu lệnh

Ý nghĩa

(reg)

Nội dung của reg

Const

một hằng địa chỉ

Const(reg)

hằng + nội dung của reg

Symbol

địa chỉ của symbol

Symbol +const

địa chỉ của symbol + hằng số

Symbol +const(reg)

địa chỉ của symbol + hằng số + nội dung của reg



- Nạp:

Các câu lệnh load, với quy tắc của li và lui, tìm nạp một bye, halfword, hoặc word từ bộ nhớ và đặt nó vào trong một thanh ghi. Các câu lệnh li và lui load một hằng số vào trong một thanh ghi.



Tất cả các địa chỉ load phải được canh lề trên cỡ của mục đang được load. Các câu lệnh ulh và ulw được cung cấp để load halfwords và words từ các địa chỉ mà không phải canh lề một cách chính xác.


Cau lenh

Vi du

Y nghia

Load upper immediate

lui $s1,0xFD

$s1=0xFD << 16

Load immediate*

li $s1,0xFD

$s1=$s1 +0xFD

Load immediate un-signed

liu $s1,0xFD

$s1=$s1 + 0xFD

La

la $s1,0xFD

Load địa chỉ của một nhãn

Lb(u)

lb $s1,0xFD

Load byte ở 0xFD vào $s1

Lh(u)

lh $s1,0xFD

Load halfword ở 0xFD vào $s1

Lw

lw $s1,0xFD

Load word ở 0xFD vào $s1

Lwl

lwl $s1,0xFD




Lwr

lwr $s1,0xFD




Ulh(u)

ulh $s1,0xFD

Load halfword bắt đầu ở địa chỉ 0xFD vào $s1.

Ulw

ulw $s1,0xFD

Load word bắt đầu ở địa chỉ 0xFD vào $s1.


-Nhớ:
Các câu lệnh lưu trữ lưu trữ một byte, halfword, hoặc word từ một thanh ghi vào trong bộ nhớ.


Op

Vi du

Ý nghĩa

Sb

sb $s1,0xFD

Lưu trữ byte thấp của thanh ghi $s1 tới địa chỉ 0xFD

Sh

sh $s1,0xFD

Lưu trữ halfword thấp của thanh ghi tới địa chỉ 0xFD

Sw

sw $s1,0xFD

Lưu trữ word trong thanh ghi tới địa chỉ 0xFD

Swl

swl $s1,0xFD

Lưu trữ halfword cao trong thanh ghi $s1 tới địa chỉ 0xFD

Swr

swr $s1,0xFD

Lưu trữ halfword thấp trong thanh ghi $s1 tới địa chỉ 0xFD

Ush

ush $s1,0xFD

Lưu trữ halfword thấp trong thanh ghi $s1 tới địa chỉ 0xFD

Usw

usw $s1,0xFD

l ưu trữ word trong thanh ghi tới 0xFD



-Di chuyển dữ liệu:
Các câu lệnh di chuyển dữ liệu di chuyển dữ liệu giữa các thanh ghi. Các câu lệnh đặc biệt được cung cấp để di chuyển dữ liệu vào và ra các thanh ghi đặc biệt là HI và LO.


Op

Vi du

Ý nghĩa

Move

move $s1,$s2

Copy nội dung của $s2 tới $s1

Mfhi

mfhi $s1

Copy nội dung của thanh ghi hi tới $s1

Mflo

mflo $s1

Copy nội dung của thanh ghi lo tới $s1

Mthi

mthi $s2

Copy nội dung của $s2 tới thanh ghi HI

Mtlo

mtlo $s2

Copy nội dung của thanh ghi $s2 tới thanh ghi LO

2.7.Quản lý bộ nhớ.

Trong phân này ta sẽ lấy bộ vi xử lí R4000 để mịnh họa hệ thống quản lí bộ nhớ (Memory Management System) của kiến trúc MIPS. Bộ vi xử lí này có 36-bit địa chỉ vật lí. Tuy nhiên, rất hiếm khi có các hệ thống cài đặt khoảng không cho bộ nhớ vât lí rộng, CPU cung cấp sự mở rộng logic của không gian bộ nhớ bằng cách thông dịch địa chỉ thành phần trong không gian địa chỉ ảo rộng bên trong địa chỉ bộ nhớ vât lí.


2.8. Pipeline.

Một kĩ thuật được gọi là kĩ thuật đường ống được sử dụng trong tất cả các cài đặt hiện nay của kiến trúc MIPS để xây dựng bộ vi xử lí. Điều cần thiết ở đây là tăng tốc độ sẽ được hoàn thành bởi việc sử dụng một phương pháp giống như dây chuyền nắp ráp. Bởi những việc xử lý các bước khác nhau trong các câu lệnh trong cùng một thời gian, bộ xử lý có thể thực hiện nhiều câu lệnh hơn trong một thời gian ngắn hơn. Giống như chu trình giặt ủi quần áo dưới đây: giặt trong 30 phút, sấy khô trong 40 phút, gấp quần áo trong 20 phút.




Chúng ta có thể làm tuần tự như trên, tuy nhiên, một phương pháp tiếp cận thông minh hơn của vấn đề này được đưa ra như sau: mang quần áo bẩn về và giặt ngay khi công việc thứ nhất đã được giặt và đang sấy khô.


Một bộ vi xử lí đường ống hoạt động khác nhau đều hoạt động theo cùng một cách, chúng có số bước khác nhau nhưng về cơ bản có thể thành năm tầng khác nhau của phần cứng để thực hiện một lệnh. Với việc cài đặt năm tầng đường ống, chúng ta sẽ có năm lệnh khác nhau trong năm tầng khác nhau của việc tính toán, chúng sẽ di chuyển thông qua đường ống. Như vậy chúng ta cần năm chu trình tín hiệu đồng hồ cho bất kì một lệnh nào để thực hiện chúng thông qua đường ống, nhưng khi mà chúng ta có năm lệnh được tính toán một cách đồng thời, tốc độ tính toán trung bình là một lệnh trên một chu trình xung đồng hồ. Chúng ta có các chức năng được thực hiện trên mỗi lệnh của nằm tầng này sẽ là:

  1. Gọi lệnh từ bộ nhớ cache và nạp chúng vào thanh ghi lệnh (Instruction register), tăng nội dung của con trỏ chương trình nên 4.

  2. Gọi các giá trị Rs và Rt từ thanh ghi trong tập thanh ghi. Nếu như nó là một lệnh rẽ nhánh và điều kiện rẽ nhánh được thỏa mãn thì khi đó nạp vào thanh ghi PC địa chỉ của target rẽ nhánh.

  3. Thực hiện các hàm số học và logic trong đơn vị số học và logic ALU, đây là tầng mà tại đây một lệnh cộng được thực hiện để tính toán địa chỉ cho việc nạp hoặc ghi một lệnh.

  4. Nếu như lệnh là lệnh nạp, thực hiện đọc dữ liệu từ cache. Nếu lệnh là lệnh ghi, thực hiện ghi dữ liệu vào cache. Mặc khác đưa dữ liệu trong thanh ghi kết quả lên thanh ghi Write Back.

  5. Lưu giá trị của thanh ghi Write Back lên thanh tập thanh ghi. Chú ý rằng khi lệnh đầu tiên trong đường ống được ghi kết quả trả về đến tập thanh ghi, lệnh thứ tư trong thứ tự năm lệnh trong đường ống được đọc từ thanh ghi.

Đường dữ liệu trong đường ống:

Trong thực tế, bộ xử lý RICS, vận hành nhiều hơn một chu trình trong một câu lệnh.Và bộ xử lý có thể đưa ra kết quả là những phần phụ thuộc dữ liệu và các lệnh rẽ nhánh.

Giải pháp của MIPS cho vấn đề này là sắp xếp lại mã số

tải về 133.42 Kb.

Chia sẻ với bạn bè của bạn:




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương