Bài giảng Kiến trúc máy tính - Chương 2: Kiến trúc tập lệnh 2

Nội dung

 Biên dịch mã máy

– Các định dạng lệnh

– Các hằng số lớn

 Các thủ tục gọi

– Tập các thanh ghi

– Bộ nhớ ngăn xếp

 Các ISA khác

pdf25 trang | Chuyên mục: Kiến Trúc Máy Tính | Chia sẻ: yen2110 | Lượt xem: 395 | Lượt tải: 1download
Tóm tắt nội dung Bài giảng Kiến trúc máy tính - Chương 2: Kiến trúc tập lệnh 2, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
Kiến trúc tập lệnh 2 
Nội dung 
 Biên dịch mã máy 
– Các định dạng lệnh 
– Các hằng số lớn 
 Các thủ tục gọi 
– Tập các thanh ghi 
– Bộ nhớ ngăn xếp 
 Các ISA khác 
Biên dịch thành mã máy 
Mã hóa và các định dạng 
Định dạng lệnh (mã máy) 
Ngôn ngữ máy 
– Máy tính không hiểu được chuỗi ký tự sau “add R8, R17, R18” 
– Các lệnh phải được chuyển đổi thành ngôn ngữ máy(1s and 0s) 
Ví dụ: 
add R8, R17, R18 → 000000 10001 10010 01000 00000 100000 
Các trường lệnh MIPS 
• opcode mã lệnh xác định phép toán (e.g., 
“add” “lw”) 
• rs chỉ số thanh ghi chứa toán hạng 
nguồn 1 trong tệp thanh ghi 
• rt chỉ số thanh ghi chưa toán hạng 
nguồn 2 trong tệp thanh ghi 
• rd chỉ số thanh ghi lưu kết quả 
• shamt Số lượng dịch(cho chỉ thị dịch) 
• funct mã chức năng thêm cho phần 
mã lệnh (add = 32, sub =34) 
Định dạng lệnh MIPS 
• MIPS có 3 dạng chỉ thị : 
– R: operation 3 registers no immediate 
– I: operation 2 registers short immediate 
– J: jump 0 registers long immediate 
Câu hỏi: Lệnh cộng tức 
thời (addi) 
cần bao nhiêu bit? 
Trả lời: I-format: 
5+5+6 bits 
= 16 bits. 
Giá trị nằm trong khoảng 
Từ -32,768 đến +32767 
Hằng số (tức thì) 
Các hằng số nhỏ (tức thì) được sử dụng ở hầu hết các đoạn mã 
(~50%) 
If (a==b) c=1; 
else c=2; 
• Làm thế nào để thực thi trong bộ xử lý ? 
– Đưa các hằng số vào bộ nhớ và tải chúng (chậm) 
– Gán cứng giá trị trên than ghi(giống R0) (Bao nhiêu?) 
• MIPS thực thi như thế nào: 
– Các chỉ thị có thể chứa hằng số bên trong. 
– Bộ điều khiển sẽ gửi giá trị hằng số đến bộ ALU 
– addi R29, R30, 4 ← giá trị 4 nằm trong câu lệnh 
• Nhưng xảy ra một vấn đề 
– Số bit mã hóa của một trường lệnh là 32 bits. Cần dùng cho 
trường mã lệnh và các thanh ghi. Làm cách nào để cân đối 
được không gian cho các hằng số và chỉ thi lệnh? 
Cần bao nhiêu bit 
khi sử dụng các 
thanh ghi để lưu giá 
trị, số lượng than 
ghi là hữu hạn? 
Lưu trữ dữ liệu về 
hằng số trên chỉ thị, 
không sử dụng tệp 
thanh ghi. 
Tải các giá trị tức thì (hằng số) 
Bộ điều 
khiển 
(Control) báo 
cho ALU 
nhận toán 
hạng từ tệp 
thanh ghi và 
từ chỉ thị 
lệnh. 
Các hằng số lớn và lệnh rẽ 
nhánh 
Tải các giá trị lớn 
Question: ori có sử 
dụng cho các số có 
dấu? 
Answer: No. 
If it was we would end 
up with all 1s in the 
top bits. 
(See the MIPS 
reference data in the 
book.) 
• Trường lệnh trực tiếp giới hạn trong 16 bits (-32,768 to 
+32,767) 
– Làm thế nào để tải được các giá trị lớn? 
• Sử dụng 2 lệnh để tải 
– Load Upper Immediate (lui): Loads upper 16 bits 
– Or Immediate (ori): Loads lower 16bits 
• Ví dụ: 10101010 10101010 11110000 11110000 
Địa chỉ trong lệnh rẽ nhánh 
và lệnh nhảy 
Question: 
Sử dụng lệnh 
nhảy bne/beq với 
khoảng cách bao 
nhiêu? 
Answer: 
Từ -32,767 đến 
+32,768 lệnh từ 
chỉ thị lệnh hiện 
tại. 
Các lệnh rẽ nhánh 
– bne/beq I-format 16 bit immediate 
– j J-format 26 bit immediate 
Địa chỉ là 32 bits! Điều khiển bằng cách nào? 
– Xem xét bne/beq như là độ lệch tương đối (relative offsets) 
(add to current PC) 
– Xem xét j như là một giá trị tuyệt đối (absolute value) (thay 
thế 26 bits của PC) 
Ví dụ nhảy địa chỉ: loops 
Thủ tục gọi hàm 
 Lời gọi thủ tục và khai báo thủ tục được chuyển thành lệnh máy như thế 
nào? 
 Đối số được truyền vào thủ tục như thế nào? 
 Kết quả trả về của thủ tục được truyền ra ngoài như thế nào? 
 Thủ tục được gọi: Callee 
 Thủ tục gọi: Caller 
Các thủ tục gọi hàm 
Các thủ tục (hàm/chương trình con) sử dụng cho chương trình 
có cấu trúc. 
main( ) { for ( j=0; j<10; j++ ) 
If (a[ j ] == 0) 
a[ j ] = update(a[ j ], j); 
} 
Thực thi các thủ tục cần các điều kiện sau: 
– Đưa dữ liệu vào nơi thủ tục cần truy cập vào 
– Bắt đầu thực thi 
– Làm việc/ sử dụng thanh ghi 
– Quay lại thủ tục gọi (caller) 
– Nhận kết quả và trả kết quả về 
Các thủ tục gọi hàm 
1. Đưa các tham số (parameters) vào thủ tục được gọi (callee) 
2. Chuyển quyền điều khiển tới thủ tục được gọi 
3. Cấp các thanh ghi cần thiết cho thủ tục được gọi 
4. Thực thi đoạn mã 
5. Trả kết quả (results) vào vị trí hàm gọi có thể truy cập 
6. Trả điều khiển đến vị trí trước khi gọi thủ tục 
without messing up the caller’s registers! 
main( ) { for ( j=0; j<10; j++ ) 
If (a[ j ] == 0) 
a[ j ] = update(a[ j ], j); 
} 
Int update (int x, int y) { 
return x+y; 
} 
Caller: main() 
Callee: update() 
Parameters: a[j], j 
Results: (stored in) a[j] 
Nguyên tắc sử dụng thủ tục 
Ví dụ: f(g,h,i,j)=(g+h) – (i+j) 
add R1, R4, R5 ; g=R4, h=R5 
add R2, R6, R7 ; i=R6, j=R7 
sub R3, R1, R2 
Nếu thủ tục gọi(e.g., main()) sử dụng 
R1, R2 hoặc R3 sẽ phải được lưu lại, 
bởi vì thủ tục được gọi sẽ ghi đè lên khi 
thực thi. 
Một số vấn đề: 
• Thủ tục được gọi không biết về các 
thanh ghi thủ tục gọi sử dụng (Bao 
gồm nhiều thủ tục gọi khác nhau) 
• Thủ tục gọi không biết thanh ghi 
nào mà thủ tục được gọi sẽ sử dụng! 
(Có thể gọi nhiều thủ tục con) 
• Phân chia giữa callee và caller 
• Theo quy ước này cho phép bất kỳ thủ tục gọi nào đều gọi tới bất kỳ 
thủ tục được gọi 
• Callee và caller đều biết cái gì cần được lưu trữ 
Các thanh ghi lưu trữ: Quy ước 
trong MIPS 
Question: Các 
thanh ghi 
$s0 - $s8 và 
$sp, $fp, $ra? 
Answer: 
Là tên chuẩn 
cho các thanh 
ghi R16 ‐ R23 
và R29‐R31. 
• Quy ước trong MIPS 
- Thống nhất theo “điều kiện" hoặc "giao thức” sau đó 
- Xác định chính xác việc sử dụng và một số quy ước đặt 
tên 
- Được thiết lập như là một phần của kiến ​​trúc 
- Được sử dụng bởi tất cả các trình biên dịch, chương trình, 
và các thư viện 
- Đảm bảo khả năng tương thích 
• Callee lưu vào các thanh ghi sau đây, nếu sử dụng 
chúng 
– $s0 ‐ $s7 (s=saved) 
– $sp, $fp,$ra 
• Caller phải lưu vào bất kỳ thanh ghi nào cần sử dụng 
đến. 
Tên các thanh ghi MIPS và 
các quy ước 
Làm thế nào để thực thi một 
thủ tục gọi 
Chuyển đổi quyền điều khiển (transfer control) tới callee 
jal Procedure Address ; nhảy và kết nối thủ tục (jump‐and‐link to 
the procedure) 
– Địa chỉ trả về PC+4 được lưu trong $ra 
Trả điều khiển (return control) tới caller: 
jr $ra ; nhảy và trả về địa chỉ lưu trong $ra 
(jump‐return to the address in $ra) 
– Phải lưu lại địa chỉ quay về! 
Quy ước thanh ghi cho thủ tục gọi: 
– $a0 ‐ $a3: Các thanh ghi đối số (4) 
– $v0 ‐ $v1: Các thanh ghi biến (2) cho kết quả trả về 
– $ra: Địa chỉ quay về 
Ví dụ 
main() { 
Int a,b,c ; 
.. 
c = sum(a,b); 
} 
/* Khai báo hàm sum*/ 
int sum (int x, int y) { 
return x + y; 
} 
Địa chỉ Chỉ thị lệnh 
1000 add $a0, $s0, $zero # x = a 
1004 add $a1, $s1, $zero # y = b 
1008 addi $ra, $zero, 1016 # Lưu địa chỉ quay về 
1012 j sum # nhảy tới nhãn “sum” 
1016 .. 
2000 sum: add $v0, $a0,$a1 # Khai báo thủ tục sum 
2004 jr $ra #nhảy tới địa chỉ lệnh trong $ra 
Địa chỉ Chỉ thị lệnh 
1000 add $a0, $s0, $zero # x = a 
1004 add $a1, $s1, $zero # y = b 
1008 jal sum # Lưu địa chỉ quay về vào $ra 
1012  
2000 sum: add $v0, $a0,$a1 # Khai báo thủ tục sum 
2004 jr $ra #nhảy tới địa chỉ lệnh trong $ra 
Các ví dụ về thủ tục gọi hàm và 
ngăn xếp 
Lưu trữ vào thanh ghi (trong ngăn 
xếp) 
• Ngăn xếp là một phần của bộ nhớ lưu trữ dữ liệu tạm thời. 
• Con trỏ ngăn xếp (Lưu trong $sp) trỏ tới điểm cuối cùng của ngăn xếp trong 
bộ nhớ 
• Trong MIPS ngăn xếp đi từ trên xuống. 
• Các thủ tục di chuyển con trỏ ngăn xếp khi chúng lưu dữ liệu trong ngăn xếp. 
• Mỗi thủ tục quay lại ngăn xếp đến trạng thái trước khi được gọi. 
Nếu thủ tục sử dụng nhiều dữ 
liệu (đối số, kết quả trả về, biến 
cục bộ) hơn số lượng thanh ghi 
lưu trữ 
1/ Sử dụng thêm nhiều thanh 
ghi hơn? Bao nhiêu thì đủ? 
2/ Sử dụng ngăn xếp (stack) 
Các kiến trúc tập lệnh khác 
(ISAs) 
Có rất nhiều kiến trúc tập lệnh khác nhau (ISAs): 
– x86 (Intel/AMD) 
– ARM (ARM) 
– JVM (Java) 
– PPC (IBM, Motorola) 
– SPARC (Oracle, Fujitsu) 
– PTX (Nvidia) 
– etc. 
Chú ý đến một số vấn đề chính : 
– Các kiểu mã máy (Machine types) 
– Phân loại các kiểu tập lệnh (ISA classes) 
– Các chế độ đánh địa chỉ (Addressing modes) 
– Độ lớn của chỉ thị (Instruction width) 
– Phân biệt kiến trúc CISC vs. RISC 
Phân loại tập lệnh cơ bản 
• Accumulator (1 register) 
 – 1 address add A acc ← acc + mem[A] 
• General purpose register file (load/store) 
 – 3 addresses add Ra Rb Rc Ra ← Rb + Rc 
 load Ra Rb Ra ← Mem[Rb] 
• General purpose register file (Register - Memory) 
– 2 address add Ra B Ra ← Mem[B] 
• Stack (not a register file but an operand stack) 
– 0 address add tos ← tos + next 
 tos = top of stack 
• Comparison: 
– Bytes per instruction? Number of instructions? Cycles per instruction? 
So sánh số lượng các chỉ thị 
Các chế độ đánh địa chỉ 

File đính kèm:

  • pdfbai_giang_kien_truc_may_tinh_chuong_2_kien_truc_tap_lenh_2.pdf