Tải bản đầy đủ (.pdf) (27 trang)

BÀI TẬP LỚN Môn Kiến trúc máy tính

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (679.72 KB, 27 trang )

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à:
o Program counter(PC): con trỏ chương trình.
o Memory : Bộ nhớ.
o Instruction Register: tập các thanh ghi lệnh.
o Register File: tập các thanh ghi.
o ALU: Khối đơn vị số học và logic.

o 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.
o FR =0 : chế độ 64-bits
o 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ư

×