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
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.
$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).
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)
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.
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
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)
$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
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
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ư