Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 04: Kiến trúc tập lệnh ISA (3)
Các kiểu lập trình
Thủ tục (chương trình con, hàm) cho phép
người lập trình “cấu trúc” các chương trình
để làm cho chúng:
dễ hiểu và dễ gỡ lỗi hơn,
cho phép chương trình sử dụng lại được.
Thủ tục cho phép người lập trình tập trung
vào một phần của chương trình ở một thời điểm.
Các thông số đóng vai trò các barrier (hàng rào)
giữa thủ tục, phần còn lại của chương trình và
dữ liệu, cho phép thủ tục được truyền các giá trị
(arguments: đối số) và trả về các giá trị (results: kết quả)
Thủ tục (chương trình con, hàm) cho phép
người lập trình “cấu trúc” các chương trình
để làm cho chúng:
dễ hiểu và dễ gỡ lỗi hơn,
cho phép chương trình sử dụng lại được.
Thủ tục cho phép người lập trình tập trung
vào một phần của chương trình ở một thời điểm.
Các thông số đóng vai trò các barrier (hàng rào)
giữa thủ tục, phần còn lại của chương trình và
dữ liệu, cho phép thủ tục được truyền các giá trị
(arguments: đối số) và trả về các giá trị (results: kết quả)
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 04: Kiến trúc tập lệnh ISA (3)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- bai_giang_vi_xu_ly_nang_cao_phan_1_thiet_ke_cpu_risc_bai_04.pdf
- Lec4.ppt
Nội dung text: Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 04: Kiến trúc tập lệnh ISA (3)
- Bài giảng “Vi xử lý nâng cao” Phần 1: Thiết kế CPU RISC Bài 04: Kiến trúc tập lệnh ISA (3) 1
- Các kiểu lập trình Thủ tục (chương trình con, hàm) cho phép người lập trình “cấu trúc” các chương trình để làm cho chúng: dễ hiểu và dễ gỡ lỗi hơn, cho phép chương trình sử dụng lại được. Thủ tục cho phép người lập trình tập trung vào một phần của chương trình ở một thời điểm. Các thông số đóng vai trò các barrier ( hàng rào) giữa thủ tục, phần còn lại của chương trình và dữ liệu , cho phép thủ tục được truyền các giá trị (arguments: đối số) và trả về các giá trị (results: kết quả). 3
- Lệnh gọi thủ tục Lệnh gọi thủ tục (procedure call) của MIPS : jal ProcAddress #jump and link Cất PC+4 trong thanh ghi $ra nhằm liên kết đến lệnh theo sau để thiết lập sự quay về của thủ tục. jr nhảy đến địa chỉ được lưu trong thanh ghi – trong trường hợp này là $ra, Mã máy: – đây chính là điều ta cần! op 26 bit address J format 3 ???? Kế đến làm cho thủ tục quay về (return) với jr $ra #return 5
- Không đủ thanh ghi Nếu trình bị gọi cần sử dụng nhiều thanh ghi hơn so với được cấp phát cho các giá trị đối số và kết quả trả về thì sao ? Sử dụng stack – hàng đợi vào sau ra trước (LIFO) high addr Một trong các thanh ghi tổng quát , $sp ($29 ), được sử dụng để định địa chỉ stack (stack phát Đỉnh của top of stack $sp triển từ địa chỉ từ cao đến địa stack chỉ thấp) Đưa dữ liệu vào stack – push $sp = $sp – 4 data on stack at new $sp Lấy dữ liệu ra khỏi stack – pop low addr data from stack at $sp $sp = $sp + 4 7
- Biên dịch thủ tục leaf của C Các thủ tục leaf là những thủ tục không gọi các thủ tục khác . Dịch sang hợp ngữ: int leaf_ex (int g, int h, int i, int j) { int f; f = (g+h) – (i+j); return f; } trong đó g, h, i, và j ở trong $a0, $a1, $a2, $a3 leaf_ex: addi $sp,$sp,-8 #tạo vùng stack. sw $t1,4($sp) #lưu $t1 vào stack. sw $t0,0($sp) #lưu $t0 vào stack. Khi sử dụng các add $t0,$a0,$a1 thanh ghi tạm, add $t1,$a2,$a3 cần giả định các giá sub $v0,$t0,$t1 lw $t0,0($sp) # $t0 trị cũ của chúng khôi phục lw $t1,4($sp) #khôi phục $t1 phải được lưu và addi $sp,$sp,8 #hiệu chỉnh con trỏ được khôi phục . stack. jr $ra 9
- Tác động của những thủ tục lồng nhau caller: jal rt_1 next: . . . rt_1: bne $a0, $zero, to_2 add $v0, $zero, $zero jr $ra to_2: addi $a0, $a0, -1 jal rt_2 jr $ra rt_2: . . . Trên lời gọi đến rt_1, địa chỉ quay về (next trong trình gọi ) được lưu trong $ra. Điều gì xảy ra cho giá trị trong $ra (khi i != 0) khi rt_1 thực hiện lời gọi đến rt_2? 11
- Lưu địa chỉ quay về, phần 2 Các thủ tục lồng nhau (i được chuyển trong $a0, giá trị trả high addr về trong $v0). rt_1:bne $a0, $zero, to_2 ← add $v0, $zero, $zero old TOS $sp jr $ra caller rt addr to_2:addi $sp, $sp, -8 old $a0 ← $sp sw $ra, 4($sp) sw $a0, 0($sp) addi $a0, $a0, -1 jal rt_2 rt_2:lw $a0, 0($sp) low addr lw $ra, 4($sp) addi $sp, $sp, 8 jr $ra bk_2caller rt addr $ra Lưu địa chỉ quay về (và các đối số) vào trong stack. 13
- Qui ước thanh ghi của MIPS $a0-$a3 – được sử dụng để truyền thông số, được nạp bởi trình gọi (caller), được đọc bởi trình bị gọi (callee) và được bảo tồn bởi trình bị gọi. $v0-$v1 – được sử dụng để truyền trở về kết quả từ trình bị gọi đến trình gọi (lưu ý, cũng có thể sử dụng để truyền thông số từ trình gọi đến trình bị gọi theo cách không được bảo tồn). 15
- Hợp dịch một thủ tục đệ qui fact: addi $sp, $sp, -8 #hiệu chỉnh con trỏ stack. sw $ra, 4($sp) #lưu địa chỉ quay về. sw $a0, 0($sp) #lưu đối số n. slti $t0, $a0, 1 #kiểm tra n =1, đi đến L1. addi $v0, $zero, 1 #ngược lại trả về 1 trong $v0. addi $sp, $sp, 8 #hiệu chỉnh con trỏ stack. jr $ra #trở về chương trình gọi. L1: addi $a0, $a0, -1 #n >=1, do vậy giảm n. jal fact #gọi fact với (n-1). #đây là nơi fact quay về bk_f: lw $a0, 0($sp) #khôi phục đối số n. lw $ra, 4($sp) #khôi phục địa chỉ quay về. addi $sp, $sp, 8 #hiệu chỉnh con trỏ stack. mul $v0, $a0, $v0 #$v0 = n * fact(n-1). jr $ra #trở về chương trình gọi. Không cần nạp $ra và $a0 do chúng không thay đổi giá trị. Ta giả định lệnh nhân là có sẵn cho dù ta chưa đề cập đến lệnh này ! 17
- Xem xét stack đối với $a0 = 2, phần 2 old TOS Trạng thái của stack caller rt addr sau khi thực thi lần $a0 = 2 ← $sp chạm trán thứ hai với bk_f jal thứ $a0 = 1 ←$sp lệnh (lời gọi ba đến trình fact với $a0 lúc này lưu 0) Đã cất địa chỉ quay về của lệnh trong trình gọi (lệnh sau jal ) trong bk_f $ra stack. Đã cất giá trị trước đó 01 $a0 của $a0 vào trong stack. $v0 19
- Xem xét stack đối với $a0 = 2, phần 4 Trạng thái của stack sau old TOS caller rt addr khi thực thi lần chạm $a0 = 2 ←$sp trán lần thứ nhất với bk_f lệnh jr thứ hai (trở về từ $a0 = 1 ← $sp bk_f trình fact sau khi cập $a0 = 0 nhật $v0 bằng 1 * 1) Địa chỉ quay về của trình gọi (bk_f trong trình fact) từ stack được khôi phục vào $ra. bk_f $ra Giá trị trước đó của $a0 01 $a0 được khôi phục từ stack. Con trỏ stack được cập nhật 1 *1 1 $v0 để trỏ đến lời gọi thứ hai đến fact. 21
- Cấp phát không gian trên stack Đoạn nhớ của stack chứa high addr các thanh ghi được lưu của thủ tục và các biến cục bộ $fp Các thanh ghi đối số là khung thủ tục được lưu (nếu có) (procedure frame) của stack Địa chỉ quay về được lưu Các thanh ghi cục bộ (bản ghi hoạt động được lưu (nếu có) (activation record)) Các cấu trúc và dải cục bộ được lưu (nếu có) Con trỏ khung ($fp ) trỏ $sp đến từ đầu tiên của khung của một thủ tục – cung cấp low addr thanh ghi “nền” ( base) ổn định cho thủ tục. -$fp được khởi động bằng cách sử dụng $sp khi gọi và $sp được lưu bằng cách sử dụng $fp khi trở về. 23
- Cấp phát không gian trên heap Đoạn dữ liệu tĩnh Memory cho các hằng số và $sp 0x 7f f f f f f c các biến tĩnh khác Stack (e.g., các dải ). Đoạn dữ liệu động (heap) cho các cấu Dynamic data trúc tăng trưởng và (heap) $gp 0x 1000 8000 thu lại (e.g., các Static data 0x 1000 0000 danh sách liên kết ). Text (Your code) Cấp phát không gian trên heap bằng PC 0x 0040 0000 Reserved malloc() và giải 0x 0000 0000 phóng không gian bằng free(). 25
- Các chế độ định địa chỉ của MIPS Định địa chỉ thanh ghi – operand ở trong thanh ghi. Định địa chỉ nền (độ dời) – operand ở vị trí nhớ có địa chỉ là tổng của thanh ghi và hằng 16-bit chứa trong lệnh. Định địa chỉ trực tiếp (hay tức thời) – operand là hằng 16-bit chứa trong lệnh. Định địa chỉ tương đối PC – địa chỉ ( address ) của lệnh là tổng của PC và hằng 16-bit chứa trong lệnh. Định địa chỉ giả trực tiếp – địa chỉ ( address ) của lệnh là hằng 26-bit chứa trong lệnh nối với 4 bit cao của PC. 27
- Nhắc lại : Các lệnh của MIPS, cho đến đây Loại Lệnh OpC Thí dụ Ý nghĩa Arithmetic add 0 & 20 add $s1, $s2, $s3 $s1 = $s2 + $s3 (R & I subtract 0 & 22 sub $s1, $s2, $s3 $s1 = $s2 -$s3 format) add immediate 8 addi $s1, $s2, 4 $s1 = $s2 + 4 shift left logical 0 & 00 sll $s1, $s2, 4 $s1 = $s2 > 4 (fill with logical zeros) shift right 0 & 03 sra $s1, $s2, 4 $s1 = $s2 >> 4 (fill with arithmetic sign bit) and 0 & 24 and $s1, $s2, $s3 $s1 = $s2 & $s3 or 0 & 25 or $s1, $s2, $s3 $s1 = $s2 | $s3 nor 0 & 27 nor $s1, $s2, $s3 $s1 = not ($s2 | $s3) and immediate c and $s1, $s2, ff00 $s1 = $s2 & 0xff00 or immediate d or $s1, $s2, ff00 $s1 = $s2 | 0xff00 load upper f lui $s1, 0xffff $s1 = 0xffff0000 immediate 29