HỆ THỐNG MÁY TÍNH 04 – BỘ LỆNH MIPS 32 bit Giới thiệu 2 ¨ Nhiệm vụ cơ bản nhất của CPU là phải thực hiện các lệnh được yêu cầu, gọi là instruction ¨ Các CPU sẽ sử dụng các tập lệnh (instruction set) khác nhau để có thể giao tiếp với nó Kích thước lệnh 3 ¨ Kích thước lệnh bị ảnh hưởng bởi: ¤ Cấu trúc đường truyền bus ¤ Kích thước và tổ chức bộ nhớ ¤ Tốc độ CPU ¨ Giải pháp tối ưu lệnh: ¤ Dùng lệnh có kích thước ngắn, mỗi lệnh chỉ nên được thực thi trong đúng 1 chu kỳ CPU ¤ Dùng bộ nhớ cache Bộ lệnh MIPS 4 ¨ Chúng ta sẽ làm quen với tập lệnh cho kiến trúc MIPS (PlayStation 1, 2; PSP; Windows CE, Routers…) ¨ Được xây dựng theo kiến trúc (RISC) với 4 nguyên tắc: ¤ Càng đơn giản, càng ổn định ¤ Càng nhỏ gọn, xử lý càng nhanh ¤ Tăng tốc xử lý cho những trường hợp thường xuyên xảy ra ¤ Thiết kế đòi hỏi sự thỏa hiệp tốt Cấu trúc cơ bản của 1 chương trình hợp ngữ trên MIPS 5 .data # khai báo các data label (có thể hiểu là các biến) # sau chỉ thị này label1: <kiểu lưu trữ> <giá trị khởi tạo> label2: <kiểu lưu trữ> <giá trị khởi tạo> … .text # viết các lệnh sau chỉ thị này .globl <các text label toàn cục, có thể truy xuất từ các file khác> .globl main # Đây là text label toàn cục bắt buộc của program … main: # điểm text label bắt đầu của program … Hello.data # data segment str: .asciiz “Hello asm !” .text # text segment .globl main main: # starting point of program addi $v0, $0, 4 # $v0 = 0 + 4 = 4 à print str syscall la $a0, str # $a0 = address(str) syscall # excute the system call Bộ lệnh MIPS – Thanh ghi 7 ¨ Là đơn vị lưu trữ data duy nhất trong CPU ¨ Trong kiến trúc MIPS: ¤ Có tổng cộng 32 thanh ghi đánh số từ $0 à $31 n Càng ít càng dễ quản lý, tính toán càng nhanh n Có thể truy xuất thanh ghi qua tên của nó (slide sau) ¤ Mỗi thanh ghi có kích thước cố định 32 bit n Bị giới hạn bởi khả năng tính toán của chip xử lý n Kích thước toán hạng trong các câu lệnh MIPS bị giới hạn ở 32 bit, nhóm 32 bit gọi là từ (word) Thanh ghi toán hạng 8 ¨ Như chúng ta đã biết khi lập trình, biến (variable) là khái niệm rất quan trọng khi muốn biểu diễn các toán hạng để tính toán ¨ Trong kiến trúc MIPS không tồn tại khái niệm biến, thay vào đó là thanh ghi toán hạng Thanh ghi toán hạng 9 ¨ Ngôn ngữ cấp cao (C, Java…): toán hạng = biến (variable) ¤ Các biến lưu trong bộ nhớ chính ¨ Ngôn ngữ cấp thấp (Hợp ngữ): toán hạng chứa trong các thanh ghi ¤ Thanh ghi không có kiểu dữ liệu ¤ Kiểu dữ liệu thanh ghi được quyết định bởi thao tác trên thanh ghi ¨ So sánh: ¤ Ưu: Thanh ghi truy xuất nhanh hơn nhiều bộ nhớ chính ¤ Khuyết: Không như bộ nhớ chính, thanh ghi là phần cứng có số lượng giới hạn và cố định à Phải tính toán kỹ khi sử dụng Một số thanh ghi toán hạng quan tâm 10 ¨ Save register: ¤ MIPS lấy ra 8 thanh ghi ($16 - $23) dùng để thực hiện các phép tính số học, được đặt tên tương ứng là $s0 - $s7 ¤ Tương ứng trong C, để chứa giá trị biến (variable) ¨ Temporary register: ¤ MIPS lấy ra 8 thanh ghi ($8 - $15) dùng để chứa kết quả trung gian, được đặt tên tương ứng là $t0 - $t7 ¤ Tương ứng trong C, để chứa giá trị biến tạm (temporary variable) Bảnh danh sách thanh ghi MIPS 11 Thanh ghi 1 ($at) để dành cho assembler. Thanh ghi 26 – 27 ($k0 - $k1) để dành cho OS Bộ lệnh MIPS – 4 thao tác chính 12 ¨ Phần 1: Phép toán số học (Arithmetic) ¨ Phần 2: Di chuyển dữ liệu (Data transfer) ¨ Phần 3: Thao tác luận lý (Logical) ¨ Phần 4: Rẽ nhánh (Un/Conditional branch) Phần 1: Phép toán số học 13 ¨ Cú pháp: opt opr, opr1, opr2 ¤ opt (operator): Tên thao tác (toán tử, tác tử) ¤ opr (operand): Thanh ghi (toán hạng, tác tố đích) chứa kết quả ¤ opr1 (operand 1): Thanh ghi (toán hạng nguồn 1) ¤ opr2 (operand 2): Thanh ghi / hằng số (toán hạng nguồn 2) Ví dụ 14 ¨ Giả sử xét câu lệnh sau: add a, b, c ¤ Chỉ thị cho CPU thực hiện phép cộng aßb+c ¤ a, b, c được gọi là thanh ghi toán hạng ¤ Phép toán trên chỉ có thể thực hiện với đúng 3 toán hạng (không nhiều cũng không ít hơn) Cộng, trừ số nguyên 15 ¨ Cộng (Add): ¤ Cộng có dấu: add $s0, $s1, $s2 ¤ Cộng không dấu: addu $s0, $s1, $s2 (u: unsigned) ¤ Diễn giải: $s0 ß $s1 + $s2 C/C++: (a = b + c) ¨ Trừ (Subtract): ¤ Trừ có dấu: sub $s0, $s1, $s2 ¤ Trừ không dấu: subu $s0, $s1, $s2 (u: unsigned) ¤ Diễn giải: $s0 ß $s1 - $s2 C/C++: (a = b - c) Nhận xét 16 ¨ Toán hạng trong các lệnh trên phải là thanh ghi ¨ Trong MIPS, lệnh thao tác với số nguyên có dấu được biểu diễn dưới dạng bù 2 ¨ Làm sao biết 1 phép toán được biên dịch từ C (ví dụ a = b + c) là thao tác có dấu hay không dấu? à Dựa vào trình biên dịch ¨ Có thể dùng 1 toán hạng vừa là nguồn vừa là đích add $s0, $s0, $s1 ¨ Cộng, trừ với hằng số? à $s2 sẽ đóng vai trò là hằng số ¤ Cộng: addi $s0, $s1, 3 (addi = add immediate) ¤ Trừ: addi $s0, $s1, -3 Ví dụ 1 17 ¨ Chuyển thành lệnh MIPS từ lệnh C: a=b+c+d–e ¨ Chia nhỏ thành nhiều lệnh MIPS: add $s0, $s1, $s2 # a=b+c add $s0, $s0, $s3 # a=a+d sub $s0, $s0, $s4 # a=a–e ¨ Tại sao dùng nhiều lệnh hơn C? à Bị giới hạn bởi số lượng cổng mạch toán tử và thiết kế bên trong cổng mạch ¨ Ký tự “#” dùng để chú thích trong hợp ngữ cho MIPS Ví dụ 2 18 ¨ Chuyển thành lệnh MIPS từ lệnh C: f = (g + h) – (i + j) ¨ Chia nhỏ thành nhiều lệnh MIPS: add $t0, $s1, $s2 # temp1 = g + h add $t1, $s3, $s4 # temp2 = i + j sub $s0, $t0, $t1 # f = temp1 – temp2 Lưu ý: Phép gán ? 19 ¨ Kiến trúc MIPS không có cổng mạch dành riêng cho phép gán à Giải pháp: Dùng thanh ghi zero ($0 hay $zero) luôn mang giá trị 0 ¨ Ví dụ: add $s0, $s1, $zero Tương đương: $s0 = $s1 + 0 = $s1 (gán) ¨ Lệnh “add $zero, $zero, $s0” có hợp lệ ? Phép nhân, chia số nguyên 20 ¨ Thao tác nhân / chia của MIPS có kết quả chứa trong cặp 2 thanh ghi tên là $hi và $lo Bit 0-31 thuộc $lo và 32-63 thuộc $hi Phép nhân 21 ¨ Cú pháp: mult $s0, $s1 ¨ Kết quả (64 bit) chứa trong 2 thanh ghi ¤ $lo (32 bit) = (($s0 * $s1) << 32) >> 32 ¤ $hi (32 bit) = ($s0 * $s1) >> 32 ¨ Câu hỏi: Làm sao truy xuất giá trị 2 thanh ghi $lo và $hi? à Dùng 2 cặp lệnh mflo (move from lo), mfhi (move from hi) - mtlo (move to lo), mthi (move to high) ¤ mflo $s0 ($s0 = $lo) ¤ mfhi $s0 ($s0 = $hi) Phép chia 22 ¨ Cú pháp: div $s0, $s1 ¨ Kết quả (64 bit) chứa trong 2 thanh ghi ¤ $lo (32 bit) = $s0 / $s1 (thương) ¤ $hi (32 bit) = $s0 % $s1 (số dư) Thao tác số dấu chấm động 23 ¨ MIPS sử dụng 32 thanh ghi dấu phẩy động để biểu diễn độ chính xác đơn của số thực. Các thanh ghi này có tên là : $f0 – $f31. ¨ Để biểu diễn độ chính xác kép (double precision) thì MIPS sử dụng sự ghép đôi của 2 thanh ghi có độ chính xác đơn.
Vấn đề tràn số 24 ¨ Kết quả phép tính vượt qua miền giá trị cho phép à Tràn số xảy ra ¨ Một số ngôn ngữ có khả năng phát hiện tràn số (Ada), một số không (C) ¨ MIPS cung cấp 2 loại lệnh số học: ¤ add, addi, sub: Phát hiện tràn số ¤ addu, addiu, subu: Không phát hiện tràn số ¨ Trình biên dịch sẽ lựa chọn các lệnh số học tương ứng ¤ Trình biên dịch C trên kiến trúc MIPS sử dụng addu, addiu, subu Phần 2: Di chuyển dữ liệu 25 ¨ Một số nhận xét: ¤ Ngoài các biến đơn, còn có các biến phức tạp thể hiện nhiều kiểu cấu trúc dữ liệu khác nhau, ví dụ như array ¤ Các cấu trúc dữ liệu phức tạp có số phần tử dữ liệu nhiều hơn số thanh ghi của CPU à làm sao lưu ?? à Lưu phần nhiều data trong RAM, chỉ load 1 ít vào thanh ghi của CPU khi cần xử lý ¤ Vấn đề lưu chuyển dữ liệu giữa thanh ghi và bộ nhớ ?