Mục tiêu của bài giảng Kiến trúc máy tính - Tuần 5: Kiến trúc bộ lệnh giúp người học hiểu cách biểu diễn và cách thực thi các lệnh trong máy tính, chuyển đổi lệnh ngôn ngữ cấp cao sang assembly và mã máy, chuyển đổi lệnh mã máy sang ngôn ngữ cấp cao hơn, biết cách lập trình bằng ngôn ngữ assembly cho MIPS. Mời các bạn cùng tham khảo.
KIẾN TRÚC MÁY TÍNH Tuần KIẾN TRÚC BỘ LỆNH (Tiếp theo) 03/2017 Copyrights 2017 CE-UIT All Rights Reserved Tuần 05 – Kiến trúc lệnh Mục tiêu: 1.Hiểu cách biểu diễn cách thực thi lệnh máy tính 2.Chuyển đổi lệnh ngơn ngữ cấp cao sang assembly mã máy 3.Chuyển đổi lệnh mã máy sang ngơn ngữ cấp cao 4.Biết cách lập trình ngôn ngữ assembly cho MIPS Slide dịch hình lấy từ sách tham khảo: Computer Organization and Design: The Hardware/Software Interface, Patterson, D A., and J L Hennessy, Morgan Kaufman, Revised Fourth Edition, 2011 Copyrights 2017 CE-UIT All Rights Reserved 03/2017 Tuần – Kiến trúc lệnh Thủ tục (Procedure) cho assembly MIPS 03/2017 Copyrights 2017 CE-UIT All Rights Reserved Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Một thủ tục (procedure) hay hàm (function) công cụ mà lập trình viên sử dụng để xây dựng cấu trúc chương trình, với mục đích vừa làm cho chương trình dễ hiểu vừa làm cho mã nguồn chương trình tái sử dụng Một chương trình có nhiều chức năng, chức đưa vào hàm, thủ tục Các thủ tục hàm cho phép lập trình viên thời điểm cần tập trung vào phần công việc, dễ dàng quản lý việc lập trình Assembly giống ngơn ngữ cấp cao, chương trình với nhiều chức chức đưa vào thủ tục khác Chú ý: Các thuật ngữ Routine/Procedure/Function gặp số mơi trường khác nhau; assembly phạm vi môn học này, tất dịch hàm thủ tục 03/2017 Copyrights 2017 CE-UIT All Rights Reserved Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Để thực thi thủ tục, chương trình phải tuân theo sáu bước sau: Đặt tham số nơi mà thủ tục truy xuất Chuyển quyền điểu khiển cho thủ tục Yêu cầu tài nguyên lưu trữ cần thiết cho thủ tục Thực cơng việc (task) Lưu kết nơi mà chương trình truy xuất Trả điều khiển vị trị mà thủ tục gọi Vì thủ tục gọi từ nhiều vị trí chương trình 03/2017 Copyrights 2017 CE-UIT All Rights Reserved Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Một số quy ước MIPS với ghi cần lưu ý: Thanh ghi $at ($1), $k0 ($26), $k1 ($27) dành cho hệ điều hành assembler; không nên sử dụng lúc lập trình thơng thường Thanh ghi $a0-$a3 ($4-$7) sử dụng để truyền bốn tham số đến thủ tục (nếu có tham số truyền vào, tham số lại lưu vào stack) Thanh ghi $v0-$v1 ($2-$3) sử dụng để lưu giá trị trả hàm Các ghi $t0-$t9 ($9-$15, 24, 25) sử dụng ghi tạm Các ghi $s0-$s7 ($16-$23) sử dụng ghi lưu giá trị bền vững Trong MIPS, việc tính tốn cần số ghi trung gian, tạm thời, ghi $t nên dùng cho mục đích (nên ghi nhóm $t thường gọi ghi tạm); kết cuối phép toán nên lưu vào ghi $s (nên ghi nhóm $s thường gọi nhóm ghi lưu giá trị bền vững) 03/2017 Copyrights 2017 CE-UIT All Rights Reserved Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Một số quy ước MIPS với ghi cần lưu ý: Theo quy ước MIPS, thủ tục sử dụng ghi loại $s phải lưu lại giá trị ghi $s trước thực thi hàm Và trước thoát khỏi hàm, giá trị cũ ghi $s phải trả lại Các ghi $s xem biến cục hàm Thanh ghi loại $t xem ghi tạm, nên việc sử dụng ghi loại $t thủ tục không cần lưu lại ghi loại $s Vì ghi loại nhớ có tốc độ truy xuất nhanh nhất, dùng để lưu trữ liệu máy tính số ghi hạn chế nên lập trình hợp ngữ phải hướng đến tận dụng ghi cách tối đa 03/2017 Copyrights 2017 CE-UIT All Rights Reserved Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Các khái niệm tên gọi: Địa trả (return address): liên kết tới vùng gọi cho phép thủ tục trả địa chỉ; MIPS, lưu trữ ghi $ra Cụ thể: chương trình thực thi thủ tục gọi, sau thủ tục thực thi xong, luồng thực thi lệnh phải quay lại chương trình thực tiếp lệnh phía sau thủ tục gọi Địa lệnh thực thi sau thủ tục hoàn thành địa trả Caller: Là chương trình gọi thủ tục cung cấp giá trị tham số cần thiết Callee: Là thủ tục thực thi chuỗi lệnh lưu trữ dựa tham số cung cấp caller sau trả điều khiều cho caller 03/2017 Copyrights 2017 CE-UIT All Rights Reserved Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Các khái niệm tên gọi: Program counter (PC): Là ghi chứa địa lệnh thực thi chương trình Thanh ghi PC cịn gọi trỏ PC hay trỏ lệnh Trong MIPS 32 bits, lệnh lưu word bytes, đó, để tới lệnh thực thi chương trình, PC tăng lên (ngồi trừ lệnh nhảy) 03/2017 Copyrights 2017 CE-UIT All Rights Reserved Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Các khái niệm tên gọi: Stack (ngăn xếp): Là cấu trúc liệu nhớ cho việc lưu liệu theo hàng đợi dạng vàosau ra-trước (last-in first-out) Mỗi thủ tục cần vùng nhớ với (vì thủ tục cần khơng gian để lưu lại biến cục (là ghi $s sử dụng thân hàm biến cục khác), để chứa tham số input số tham số lớn chứa giá trị trả output số giá trị trả lớn 2) Vùng nhớ quy ước hoạt động stack 03/2017 Hình ảnh ví dụ stack với frame (stack phục vụ cho thủ tục mà bốn tham số đầu vào truyền thông qua ghi, tham số thứ lưu stack hình) Copyrights 2017 CE-UIT All Rights Reserved 10 Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Các khái niệm tên gọi: Stack pointer (SP): Địa phần tử cấp phát gần (tức phần tử cấp phát cuối thời điểm tại) Trong MIPS, giá trị lưu ghi $sp (29) Trong đó, ghi $fp ($30) dùng làm trỏ frame (Frame pointer) Stack gồm nhiều frame; frame cuối stack trỏ tới $sp, frame (cho vùng lưu ghi biến cục bộ) trỏ tới $fp (xem hình slide trước) Stack xây dựng theo kiểu từ địa cao giảm dần xuống thấp, frame pointer stack pointer Đây quy ước MIPS Tất nhiên stack xây dựng theo cách khác, tùy vào môi trường làm việc mà ta tuân thủ quy ước 03/2017 Copyrights 2017 CE-UIT All Rights Reserved 12 Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Các khái niệm tên gọi: Push: Việc lưu phần tử vào stack gọi Push Pop: Việc lấy phần tử khỏi stack gọi Pop Trong tập lệnh MIPS chuẩn, lệnh Pop Push Việc thực phải người lập trình thực hiện: Theo quy ước MIPS, PUSH phần tử vào stack, $sp nên trừ byte (1 word) sau lưu liệu vào word nhớ có địa chứa $sp Ngược lại, POP phần tử từ stack, liệu load từ word nhớ có địa chứa $sp sau $sp cộng thêm 03/2017 Copyrights 2017 CE-UIT All Rights Reserved 13 Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Cấu trúc thủ tục/hàm 03/2017 Copyrights 2017 CE-UIT All Rights Reserved 14 Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Cấu trúc thủ tục/hàm Trong chương trình chính, thủ tục gọi, trỏ PC chuyển quyền điều khiển xuống vị trí thủ tục; sau thủ tục thực xong, trỏ PC chuyển thực lệnh sau lệnh gọi thủ tục Việc thực nhờ vào cặp lệnh: jal ten_thu_tuc jr $ra (ten_thu_tuc nhãn lệnh thủ tục, xem tên thủ tục) 03/2017 Copyrights 2017 CE-UIT All Rights Reserved 15 Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Cấu trúc thủ tục/hàm Để gọi thủ tục, dùng lệnh jal (Lệnh nhảy-và-liên kết: jump-and-link) Đầu tiên, địa lệnh sau lệnh jal phải lưu lại để sau thủ tục thực xong, trỏ PC chuyển lại (thanh ghi dùng để lưu địa trả $ra); sau địa trả lưu lại, trỏ PC chuyển đến địa lệnh thủ tục để thực Vậy có hai cơng việc thực jal theo thứ tự: jal 03/2017 # $ra = PC + # PC = Copyrights 2017 CE-UIT All Rights Reserved 16 Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Cấu trúc thủ tục/hàm Sau thủ tục thực xong, để trả lại chương trình chính, dùng lệnh jr (jump regiser) Lệnh “jr $ra” đặt cuối thủ tục thực việc lấy giá trị chứa ghi $ra gán vào PC, giúp ghi quay trở thực lệnh sau lệnh gọi thủ tục jr $ra 03/2017 # PC = $ra Copyrights 2017 CE-UIT All Rights Reserved 17 Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Cấu trúc thủ tục/hàm Như vậy, hàm con/thủ tục chia thành ba phần Phần thân dùng để tính tốn chức thủ tục này, bắt buộc phải có Phần đầu phần cuối có khơng, tùy yêu cầu chương trình 03/2017 Copyrights 2017 CE-UIT All Rights Reserved 18 Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Cấu trúc thủ tục/hàm Ví dụ 1: Một thủ tục có thân hàm (không cần phần đầu cuối) Đoạn code sau thực việc gọi hàm (thủ tục) tên ABC add $t0, $t1, $t2 jal ABC or $t3, $t4, $s5 j EXIT ABC: add $t0, $t3, $t5 sub $t2, $t3, $t0 jr $ra EXIT: 03/2017 Copyrights 2017 CE-UIT All Rights Reserved 19 Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Cấu trúc thủ tục/hàm Ví dụ 2: Một thủ tục có đủ ba phần: thân hàm, phần đầu cuối Viết đoạn code thực •Chương trình có: Bốn giá trị a, b, c, d chứa $s0, $1, $s2, $s3 Chương trình truyền bốn tham số vào thủ tục tên “proc_example” để lấy kết phép toán Sau đưa kết vào ghi $s6 •Thủ tục proc_example có: Bốn input (a, b, c, d) Một output, kết phép toán: (a + b) – (c + d) Q trình tính tốn sử dụng ghi tạm $t1, $t2 ghi $s0 03/2017 Copyrights 2017 CE-UIT All Rights Reserved 20 Bốn tham số truyền cho thủ tục proc_example trước gọi hàm (Theo quy ước, tham số truyền cho thủ tục phải truyền vào ghi $a0-$a3) Sau hàm proc_example thực xong, giá trị trả hàm theo quy ước chứa $v0 Lệnh chuyển liệu từ $v0 vào ghi $s6 Phần đầu: lưu liệu vào stack cho thủ tục Do phần thân hàm có sử dụng ghi $s0 nên trước tính tốn, giá trị cũ $s0 nên lưu stack Nếu có n ghi cần lưu, ghi word, ta cần 4n byte cho stack Trong trường hợp này, ta cần byte Vì stack phát triển theo kiểu từ cao xuống thấp, nên cấp phát frame (1 word cho stack) $sp trừ Hai lệnh tương ứng với PUSH phần tử vào stack Phần thân: Sau tính tốn, kết trả phải lưu vào $v0 quy ước 03/2017 Phần cuối: Trước khỏi hàm, giá trị lưu $s0 phải phục hồi lại; frame stack phải xóa cách lấy $sp + Hai lệnh tương ứng với POP phần tử khỏi stack Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Cấu trúc thủ tục/hàm Trong ví dụ 1, thân thủ tục không sử dụng ghi $s nào, nên không cần khởi tạo stack để lưu ghi lại Trong ví dụ 2, thân thủ tục có sử dụng ghi $s, nên stack phải khởi tạo để lưu; dẫn đến trước kết thúc hàm phải giá trị lưu phải trả lại ghi xóa stack (Lưu ý: Code ví dụ viết lại mà khơng cần dùng ghi $s0; ví dụ cố tình dùng $s0 để thấy việc lưu stack phải thực nào) 03/2017 Copyrights 2017 CE-UIT All Rights Reserved 22 Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Tóm lại: Với thủ tục/hàm con: Input: $a0, $a1, $a2, $a3 Output: $v0, $v1 Địa quay lưu $ra Stack sử dụng trường hợp sau Nếu thủ tục (hàm con) cần nhiều bốn ghi để làm tham số nhiều hai ghi làm giá trị trả khơng gian stack dùng hỗ trợ trường hợp Nếu thủ tục có sử dụng số ghi loại $s, theo quy ước MIPS, trước thực thủ tục, giá trị ghi phải lưu trữ vào stack hồi phục lại kết thúc thủ tục (Các ghi $t không cần lưu) 03/2017 Copyrights 2017 CE-UIT All Rights Reserved 23 Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Nested procedure: Các thủ tục gọi lồng vào Các thủ tục mà không gọi thủ tục khác thủ tục (leaf procedures) Ngược lại nested procedures Chúng ta cần cẩn thận sử dụng ghi thủ tục, cần phải cẩn thận gọi nested procedure 03/2017 Copyrights 2017 CE-UIT All Rights Reserved 24 Tuần – Kiến trúc lệnh Tổng kết: Tuần trình bày nội dung liên quan đến hợp ngữ MIPS, biết để lập trình chương trình dùng assembly Với chương trình assembly dài, có nhiều chức năng, lập trình ngơn ngữ cấp cao, chức đưa vào thủ tục (procedure) (như hàm hàm ngơn ngữ cấp cao) Khi lập trình với procedure cho MIPS, điểm cần ý: stack, $sp, $fp cách truyền tham số 03/2017 Copyrights 2017 CE-UIT All Rights Reserved 25 Tuần – Kiến trúc lệnh Lý thuyết: Đọc sách tham khảo • Mục: 2.8 • Sách: Computer Organization and Design: The Hardware/Software Interface, Patterson, D A., and J L Hennessy, Morgan Kaufman, Revised Fourth Edition, 2011 Bài tập: file đính kèm 03/2017 Copyrights 2017 CE-UIT All Rights Reserved 26 ... Copyrights 2017 CE-UIT All Rights Reserved 15 Các Thủ Tục Hỗ Trợ Trong Phần Cứng Máy Tính Cấu trúc thủ tục/hàm Để gọi thủ tục, dùng lệnh jal (Lệnh nhảy-và-liên kết: jump-and-link) Đầu tiên,... $a 0-$ a3 ($ 4-$ 7) sử dụng để truyền bốn tham số đến thủ tục (nếu có tham số truyền vào, tham số lại lưu vào stack) Thanh ghi $v 0-$ v1 ($ 2-$ 3) sử dụng để lưu giá trị trả hàm Các ghi $t 0-$ t9 ($ 9-$ 15, .. .Tuần 05 – Kiến trúc lệnh Mục tiêu: 1.Hiểu cách biểu diễn cách thực thi lệnh máy tính 2.Chuyển đổi lệnh ngơn ngữ cấp cao sang assembly mã máy 3.Chuyển đổi lệnh mã máy sang ngơn ngữ