Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 03: Kiến trúc tập lệnh ISA (2)


Chỉ ra đích rẽ nhánh
Có thể sử dụng thanh ghi “nền” và cộng thêm offset 16- bit
 Thanh ghi nào?
- Thanh ghi địa chỉ lệnh (PC = program counter) – rẽ nhánh tự động sử dụng thanh ghi này.
- PC được cập nhật (PC+4) trong chu kỳ tìm nạp sao cho PC lưu giữ địa chỉ của lệnh kế tiếp.
 Giới hạn khoảng cách rẽ nhánh đến -215 to +215-1 lệnh kể từ (lệnh sau lệnh) rẽ nhánh.
- Nhưng hầu hết các rẽ nhánh là cục bộ.
pdf 48 trang thamphan 27/12/2022 3240
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 03: Kiến trúc tập lệnh ISA (2)", để 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:

  • pdfbai_giang_vi_xu_ly_nang_cao_phan_1_thiet_ke_cpu_risc_bai_03.pdf
  • pptLec3.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 03: Kiến trúc tập lệnh ISA (2)

  1. Bài giảng “Vi xử lý nâng cao” Phần 1: Thiết kế CPU RISC Bài 03: Kiến trúc tập lệnh ISA (2) 1
  2. Nhắc lại : Tổ chức của MIPS  Các lệnh số học – đến/từ tập thanh ghi.  Các lệnh load/store – từ/đến bộ nhớ. Memory Processor 1 1100 Register File src1 addr src1 read/write 5 32 data addr src2 addr 32 30 5 registers 32 2 dst addr ($zero - $ra) words 5 src2 write data data read data 32 32 32 32 bits write data Fetch 32 0 1100 32 ALU 0 1000 Exec Decode 32 4 5 6 7 0 0100 32 0 1 2 3 0 0000 byte address 32 bits word address (big Endian) (binary) 3
  3. Các lệnh thực hiện quyết định  Các lệnh thực hiện quyết định  thay đổi luồng điều khiển,  i.e., thay đổi lệnh “kế tiếp” được thực thi.  Các lệnh rẽ nhánh có điều kiện (conditional branch) của MIPS: bne $s0, $s1, Lbl #đi đến Lbl nếu $s0 ≠$s1 beq $s0, $s1, Lbl #đi đến Lbl nếu $s0=$s1  Thí dụ: if (i==j) h = i + j; bne $s0, $s1, Lbl1 add $s3, $s0, $s1 Lbl1: 5
  4. Chỉ ra đích rẽ nhánh  Có thể chỉ ra địa chỉ bộ nhớ – nhưng điều này sẽ yêu cầu “trường” 32-bit.  Có thể sử dụng thanh ghi “nền” và cộng thêm offset 16- bit  Thanh ghi nào ? - Thanh ghi địa chỉ lệnh (PC = PC → bne $s0,$s1,Lbl1 program counter ) – rẽ nhánh tự add $s3,$s0,$s1 động sử dụng thanh ghi này. - PC được cập nhật (PC+4) trong chu Lbl1: kỳ tìm nạp sao cho PC lưu giữ địa chỉ của lệnh kế tiếp.  Giới hạn khoảng cách rẽ nhánh đến -215 to +2 15 -1 lệnh kể từ (lệnh sau lệnh) rẽ nhánh. - Nhưng hầu hết các rẽ nhánh là cục bộ. 7
  5. Giải hợp dịch đích rẽ nhánh  Nội dung của PC đã cập nhật (PC+4) được cộng với offset rẽ nhánh 16-bit, offset được biến đổi thành giá trị 32-bit bằng cách  nối thêm hai zero (vị trí thấp) để làm thành địa chỉ từ và kế đến mở rộng dấu cho 18 bit này.  Kết quả được ghi vào PC nếu điều kiện rẽ nhánh là đúng – trước chu kỳ tìm nạp lệnh kế tiếp. từ 16 bit thấp của lệnh rẽ nhánh 16 mở rộng dấu offset 00 Địa chỉ đích 32 32 Add rẽ PC 32 Add 32 32 nhánh 32 4 32 ? 9
  6. Hợp dịch thí dụ rẽ nhánh  Mã hợp ngữ bne $s0, $s1, Lbl1 add $s3, $s0, $s1 Lbl1:  Mã máy của bne: op rs rt 16 bit offset I format 5 16 17 0x0001  Ghi nhớ  Sau khi lệnh bne được tìm nạp , PC được cập nhật sao cho PC sẽ định địa chỉ lệnh add (PC = PC + 4).  Offset (thêm 2 zero ở vị trí thấp) được mở rộng dấu và được cộng vào PC đã cập nhật. 11
  7. Lệnh thay đổi luồng điều khiển khác  MIPS cũng có lệnh rẽ nhánh không điều kiện (unconditional branch) hay lệnh jump: j Lbl #đi đến Lbl  Thí dụ: if (i!=j) h=i+j; else h=i-j; Dịch đoạn mã if-then-else: beq $s0, $s1, Else add $s3, $s0, $s1 j Exit Else: sub $s3, $s0, $s1 Exit: 13
  8. Giải hợp dịch đích nhảy  26 bit thấp của lệnh nhảy được biến đổi thành địa chỉ đích nhảy 32-bit bằng cách  Nối thêm 2 zero vị trí thấp để tạo ra địa chỉ ( từ) 28 bit, kế đến nối 4 bit cao của PC hiện hành (lúc này PC+4) để tạo ra địa chỉ ( từ) 32 bit. Địa chỉ này được đặt vào PC trước chu kỳ tìm nạp lệnh kế tiếp. Từ 26 bit thấp của lệnh nhảy không điều kiện 26 00 32 Địa chỉ đích nhảy 4 PC 32 15
  9. Hợp dịch rẽ nhánh và nhảy beq $s0, $s1, Else add $s3, $s0, $s1 j Exit Else: sub $s3, $s0, $s1 Exit: 0x00400020 4 16 17 2 0x00400024 0 16 17 19 0 32 0x00400028 2 0000 0100 0000 0000 0000 0011 00 = (0) 0x040003 00(00) 0x0040002c 0 16 17 19 0 34 0x00400030 . . . 17
  10. Dịch vòng lặp while  Dịch mã hợp ngữ cho vòng lặp while của C trong đó i ở trong $s0, j ở trong $s1 và k ở trong $s2 while (i!=k) i=i+j; Loop: beq $s0, $s2, Exit add $s0, $s0, $s1 j Loop Exit: . . .  Khối cơ bản – Chuỗi lệnh không có rẽ nhánh (ngoại trừ ở cuối chuỗi) và không có đích rẽ nhánh (ngoại trừ ở đầu chuỗi). 19
  11. Các lệnh thực hiện quyết định khác  Do các toán hạng hằng là phổ biến trong những phép so sánh, ta còn có lệnh slti  Lệnh mới : slti $t0, $s0, 10 # if $s0 < 10 # then # $t0 = 1 # else # $t0 = 0  Mã máy: op rs rt 16 bit number I format a 16 8 0x000a 221
  12. Các lệnh rẽ nhánh khác  Lệnh blt, ble, bgt, bge không được bao gồm trong ISA (chỉ là một giả lệnh) do lệnh này phức tạp – lệnh này sẽ kéo dài thời gian chu kỳ clock hoặc lệnh này sẽ cần thêm chu kỳ clock mỗi lệnh.  Hai lệnh nhanh hơn sẽ tốt hơn. 23
  13. Hợp dịch phát biểu case (switch) switch (k) { Memory case 0: h=i+j; break; /*k=0*/ case 1: h=i+h; break; /*k=1*/ case 2: h=i-j; break; /*k=2*/ L2  Giả sử 3 từ liên tiếp trong bộ nhớ bắt L1 đầu ở địa chỉ trong $t4, các địa chỉ của $t4 → L0 các nhãn L0, L1, L2 và k ở trong $s2. add $t1, $s2, $s2 #$t1 = 2*k add $t1, $t1, $t1 #$t1 = 4*k add $t1, $t1, $t4 #$t1 = addr of JumpT[k] lw $t0, 0($t1) #$t0 = JumpT[k] jr $t0 #nhảy dựa trên $t0 L0: add $s3, $s0, $s1 #k=0 nên h=i+j j Exit L1: add $s3, $s0, $s3 #k=1 nên h=i+h j Exit L2: sub $s3, $s0, $s1 #k=2 nên h=i-j Exit: . . . Bỏ qua đoạn mã trước tiên kiểm tra k để đảm bảo rằng k ở trong tầm từ 0 đến 2. 25
  14. Tổ chức của MIPS Processor Memory Register File 1 1100 src1 addr src1 5 32 data src2 addr 32 5 registers dst addr ($zero - $ra) read/write 5 src2 write data data addr 30 32 32 2 32 32 bits words br offset read data 32 Add PC 32 32 Add 32 32 32 4 Fetch 32 write data 0 1100 PC = PC+4 32 0 1000 4 5 6 7 0 0100 32 ALU 0 1 2 3 Exec Decode 0 0000 32 word address 32 32 bits (binary) byte address (big Endian) 27
  15. Bên cạnh các con số  Đa số máy tính sử dụng byte 8-bit để biểu diễn ký tự theo the American Std Code for Info Interchange (ASCII) ASCII Char ASCII Char ASCII Char ASCII Char ASCII Char ASCII Char 0 Null 32 space 48 0 64 @ 96 ` 112 p 1 33 ! 49 1 65 A 97 a 113 q 2 34 “ 50 2 66 B 98 b 114 r 3 35 # 51 3 67 C 99 c 115 s 4 EOT 36 $ 52 4 68 D 100 d 116 t 5 37 % 53 5 69 E 101 e 117 u 6 ACK 38 & 54 6 70 F 102 f 118 v 7 39 ‘ 55 7 71 G 103 g 119 w 8 bksp 40 ( 56 8 72 H 104 h 120 x 9 tab 41 ) 57 9 73 I 105 i 121 y 10 LF 42 * 58 : 74 J 106 j 122 z 11 43 + 59 ; 75 K 107 k 123 { 12 FF 44 , 60 < 76 L 108 l 124 | 15 47 / 63 ? 79 O 111 o 127 DEL  Do vậy ta cần các lệnh di chuyển byte. 29
  16. Địa chỉ byte  Vì các byte (8-bit) thường hữu dụng, đa số ISA hỗ trợ việc định địa chỉ các byte riêng biệt trong bộ nhớ.  Do vậy, địa chỉ bộ nhớ của word phải là bội số của 4 ( alignment restriction).  Big Endian: byte cực trái là địa chỉ từ. IBM 360/370, Motorola 68k, MIPS , Sparc, HP PA  Little Endian: byte cực phải là địa chỉ từ. Intel 80x86, DEC Vax, DEC Alpha (Windows NT) 31
  17. Định địa chỉ đối tượng: Endianess sự sắp hàng  Quay trở về và xem tại sao số vị trí nhớ từ của bộ nhớ là 2 30.  Hai bit có trọng số thấp nhất của địa chỉ từ là gì (cả hai luôn luôn bằng 0)? 33
  18. Nạp và lưu các byte Việc nạp byte sẽ lấy nội dung của byte ở địa chỉ bộ nhớ được chỉ rõ, mở rộng zero nội dung này, và nạp nội dung này vào thanh ghi. 35
  19. Nạp và lưu các nửa từ  MIPS cũng cung cấp các lệnh đặc biệt để di chuyển “nửa từ”: lh $t0, 1($s3) #load half word from memory sh $t0, 6($s3) #store half word to memory op rs rt 16 bit number  16 bit nào được nạp hoặc được lưu?  việc nạp nửa từ sẽ đặt “nửa từ” từ bộ nhớ vào trong 16 bit cực phải của thanh ghi đích. - điều gì xảy ra đối với các bit khác trong thanh ghi này ?  việc lưu nửa từ sẽ lấy “nửa từ” từ 16 bit cực phải của một thanh ghi và ghi đến nửa từ trong bộ nhớ. - để lại các byte khác trong từ nhớ không thay đổi. 37
  20. Các thao tác dịch bit  Dịch số học (sra) duy trì tính đúng đắn số học của giá trị được dịch (i.e., một số bị dịch phải một bit sẽ bằng phân nửa giá trị ban đầu; một số bị dịch trái một bit sẽ bằng gấp đôi giá trị ban đầu).  sra sử dụng bit có ý nghĩa lớn nhất (bit dấu) làm bit được dịch vào trong.  Sll thực hiện việc dịch trái số học đối với số bù- 2 (nên không cần lệnh sla) sra $t2, $s0, 8 #$t2 = $s0 >> 8 bit op rs rt rd shamt funct R format 0 16 10 8 0x03 39
  21. Các phép toán logic  Có một số phép toán logic từng bit (bit-wise) trong MIPS ISA. and $t0, $t1, $t2 #$t0 = $t1 & $t2 or $t0, $t1, $t2 #$t0 = $t1 | $t2 nor $t0, $t1, $t2 #$t0 = not($t1 | $t2) op rs rt rd shamt funct R format 0 9 10 8 0x24 andi $t0, $t1, 0xff00 #$t0 = $t1 & ff00 ori $t0, $t1, 0xff00 #$t0 = $t1 | ff00 41
  22. Các hằng số lớn hơn thì sao?  Ta cũng muốn có khả năng nạp một hằng số 32-bit vào trong thanh ghi.  Cần sử dụng hai lệnh, lệnh mới “nạp trực tiếp phần cao” ( load upper immediate) lui $t0, 0xaaaa f 0 8 1010101010101010  Kế đến đặt các bit thấp ở bên phải , i.e., ori $t0, $t0, 0xaaaa 1010101010101010 0000000000000000 0000000000000000 1010101010101010 1010101010101010 1010101010101010 43
  23. 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 andi $s1, $s2, ff00 $s1 = $s2 & 0xff00 or immediate d ori $s1, $s2, ff00 $s1 = $s2 | 0xff00 load upper f lui $s1, 0xffff $s1 = 0xffff0000 immediate 45
  24. Nhắc lại : ISA của MIPS  Các loại lệnh Registers  Load/Store  Tính toán R0 - R31  Nhảy và rẽ nhánh  Dấu chấm động - đồng xử lý PC HI  Quản lý bộ nhớ LO  Đặc biệt  3 khuôn dạng lệnh: đều rộng 32-bit 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits OP rs rt rd shamt funct R format OP rs rt 16 bit number I format OP 26 bit jump target J format 47