Bài giảng Hệ thống máy tính và ngôn ngữ C - Chương 5: Lập trình hợp ngữ LC-3
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Hệ thống máy tính và ngôn ngữ C - Chương 5: Lập trình hợp ngữ LC-3", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_he_thong_may_tinh_va_ngon_ngu_c_chuong_5_lap_trinh.pdf
Nội dung text: Bài giảng Hệ thống máy tính và ngôn ngữ C - Chương 5: Lập trình hợp ngữ LC-3
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.1 Lập trình hợp ngữ 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.3 Quá trình hợp dịch 5.4 Chƣơng trình với nhiều modul
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.1 Lập trình hợp ngữ Hợp ngữ là một ngơn ngữ cấp thấp và là một bước nâng cấp nhỏ cho ISA của một máy tính. Mỗi lệnh hợp ngữ thường xác định một lệnh đơn trong ISA. Khơng như ngơn ngữ cấp cao, ngơn ngữ cấp thấp phụ thuộc rất nhiều vào ISA. Thực tế, ta sẽ thấy là mỗi kiến trúc tập lệnh ISA chỉ cĩ duy nhất một hợp ngữ. .
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ Để hiểu rõ hợp ngữ LC-3, ta hãy xét chương trình ví dụ sau.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ Để hiểu rõ hợp ngữ LC-3, ta hãy xét chương trình ví dụ sau. Chương trình này nhân số nguyên được khởi tạo trong biến NUMBER với 6 bằng việc cộng số nguyên đĩ 6 lần. Ví dụ, nếu số nguyên đĩ là 123, chương trình sẽ tính tích bằng việc cộng 123 + 123 +123 + 123 + 123 + 123.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.1 Lệnh Thay vì dùng dãy 16 bit 0 và 1 để biểu diễn một lệnh như trong trường hợp ISA LC-3, một lệnh hợp ngữ bao gồm bốn phần theo cấu trúc sau: LABEL OPCODE OPERANDS ; COMMENTS Hai phần LABEL và COMMENTS là tùy chọn. Cịn OPCODE và OPERANDS là bắt buộc.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.1 Lệnh: 1. Opcodes và Operands Hai phần này phải cĩ trong lệnh. Một lệnh phải quy định một mã thao tác OPCODE, tức là cái mà lệnh cần phải làm, và giá trị thích hợp của tốn hạng OPERANDS, tức là cái mà lệnh sẽ dùng với tác vụ đã cĩ. Đây là những thứ mà chúng ta đã gặp khi học LC-3. OPCODE là tên tượng trưng cho mã tác vụ của lệnh LC-3 tương ứng. Với tên tượng trưng này, lập trình viên dễ dàng nhớ thao tác qua các tên như ADD, AND, hay LDR hơn là 4 bit 0001, 0101, hay 0110. Hình 4.3 liệt kê tồn bộ các OPCODES của 15 lệnh LC-3.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.1 Lệnh Số lượng các tốn hạng phụ thuộc vào thao tác được thực thi. Ví dụ, lệnh ADD ở dịng 0B trong chương trình trên AGAIN ADD R3, R3, R2 Lệnh LD ở dịng 06 LD R2, NUMBER Trong trường hợp tốn hạng tức thời, các giá trị thực cần được ghi rõ trong lệnh (như trị 0 trong dịng 07). AND R3, R3, #0 ; xĩa R3 để giữ tích Chúng ta dùng dấu # cho số thập phân, x cho thập lục phân, và b cho nhị phân.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.1 Lệnh 2. Nhãn Nhãn là các tên tượng trưng được dùng để xác định các ơ nhớ được tham khảo tới trong chương trình. Trong hợp ngữ LC-3, một nhãn cĩ thể được tạo từ một tới 20 ký số hay ký tự, và bắt đầu bằng một ký tự, như LAPLAI, KETTHUC, LAP100, . Cĩ hai lý do cần cho việc tham khảo một vị trí trong bộ nhớ, đĩ là - Ơ nhớ vị trí đĩ chứa đích của một lệnh rẻ nhánh, ví dụ AGAIN trong dịng 0B. - Ơ nhớ vị trí đĩ chứa một giá trị cần được nạp hay lưu, ví dụ, NUMBER ở dịng 11, và SIX ở dịng 12.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.1 Lệnh Vị trí tương ứng nhãn AGAIN được tham khảo bởi lệnh rẽ nhánh ở dịng 0E, BRp AGAIN
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.1 Lệnh 3. Ghi chú Ghi chú là các thơng điệp chỉ cần thiết với con người. Các ghi chú khơng cĩ bất kỳ ảnh hưởng nào trong quá trình dịch và cũng khơng chịu tác động nào từ bộ dịch hợp ngữ LC-3. Chúng được quy định trong chương trình bằng các dấu chấm phẩy đặt trước, phần sau dấu chấm phẩy (nếu cĩ) là một ghi chú và được bộ dịch bỏ qua.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.2 Mã giả (Các hƣớng dẫn dịch) Bộ hợp dịch LC-3 là một chương trình lấy đầu vào là chuỗi ký tự biểu diễn một chương trình được viết bằng hợp ngữ LC-3, và dịch nĩ ra thành một chương trình ở cấp kiến trúc tập lệnh (ISA) của LC-3. Mã giả (pseudo-ops) giúp cho bộ dịch thực hiện nhiệm vụ này, cịn được gọi bằng một tên khác là hướng dẫn dịch (assembler directives). Bộ hợp dịch LC-3 gồm năm mã giả: .ORG, .FILL, .BLKW, .STRING, và .END. Tất cả mã giả này đều cĩ dấu chấm như là ký tự đầu tiên của nĩ.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.2 Mã giả (Các hƣớng dẫn dịch) .ORIG .ORIG cho bộ dịch biết nơi bắt đầu chương trình LC-3 trong bộ nhớ. Ở dịng 04, .ORIG x3050 nĩi rằng, chương trình bắt đầu ở vị trí x3050. Và tất nhiên, lệnh LD R1, SIX sẽ được đặt ở vị trí x3050. .FILL .FILL nĩi cho bộ hợp dịch biết việc cần dùng vị trí kế trong chương trình (và tất nhiên là sau này là bộ nhớ khi chạy chương trình), và khởi động nĩ bằng giá trị của tốn hạng. Ở dịng 12, vị trí thứ 9 (tính từ lệnh đầu tiên) trong chương trình LC-3 được khởi động trị x0006.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.2 Mã giả (Các hƣớng dẫn dịch) .BLKW .BLKW bắt bộ dịch để dành một số ơ nhớ (tức BLocK Words) trong chương trình. Số ơ nhớ thực sự là tốn hạng của mã giả .BLKW. Ở dịng 11, mã giả yêu cầu bộ dịch để dành một ơ nhớ với nhản là NUMBER. .STRINGZ .STRINGZ bắt bộ dịch khởi tạo một chuỗi n +1 ơ nhớ. Đối số là dãy n ký tự, bên trong cặp dấu nháy kép. Khi đĩ, n từ nhớ đầu tiên được khởi động bằng các ký tự mã ASCII 8 bit được mở rộng zero (để cĩ 16 bit) trong chuỗi. Từ nhớ cuối cùng được khởi tạo là 0, tức x0000, là trị canh để truy xuất chuỗi các mã ASCII.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.2 Mã giả (Các hƣớng dẫn dịch) Ví dụ 5.2: Đoạn mã sau: .ORIG x3010 HELLO .STRINGZ “Hello, World!”
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.2 Mã giả (Các hƣớng dẫn dịch) x3010: x0048 x3018: x006F x3011: x0065 x3019: x0072 x3012: x006C x301A: x006C x3013: x006C x301B: x0064 x301C: x0021 x3014: x006F x301D: x0000 x3015: x002C x3016: x0020 x3017: x0057
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.2 Mã giả (Các hƣớng dẫn dịch) .END .END nĩi cho bộ dịch biết chương trình kết thúc ở đâu. Bất kỳ ký tự nào đứng sau .END sẽ bị bộ hợp dịch bỏ qua. Như vậy, thực ra .END chỉ đơn giản là một quy định giới hạn, nĩ đánh dấu sự kết thúc của chương trình nguồn.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.3 Một ví dụ Trong mục này chúng ta xét lại ví dụ ở mục 4.10, tính số lần xuất hiện của một ký tự trong một file cho trước. Ký tự cần kiểm tra được vào từ bàn phím, file ký tự được xem là mảng ký tự cần được khởi tạo trước khi chạy chương trình. Giải thuật ở dạng lưu đồ và chương trình ở dạng ISA LC-3 được trình bày trong hình 4.18 và 4.19.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.3 Một ví dụ
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.3 Một ví dụ
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.2 Các thành phần của một chƣơng trình hợp ngữ 5.2.3 Một ví dụ
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.3 Quá trình hợp dịch 5.3.1 Giới thiệu Trước khi một chương trình hợp ngữ LC-3 được thực thi, nĩ phải được dịch ra thành một chương trình ngơn ngữ máy, cĩ nghĩa là từng lệnh trong đĩ sẽ là từng lệnh ở ISA LC-3. Đây là cơng việc của bộ dịch hợp ngữ LC-3. Với bộ hợp dịch LC-3 (mà chúng ta cĩ thể download từ mạng), ta cĩ thể dịch từ chương trình hợp ngữ ra chương trình ngơn ngữ máy. Trong giáo trình này, các chương trình hợp ngữ cĩ thể được viết và được dịch ra dạng ISA bằng LC-3 Simulator mà chúng ta cĩ thể tìm thấy trên mạng.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.3 Quá trình hợp dịch 5.3.2 Quá trình dịch Gồm 2 giai đoạn: -Tạo bảng biểu,Constructing table -Dịch ra ngơn ngữ máy(nhị phân)
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.3 Quá trình hợp dịch 5.3.3 Bƣớc đầu tiên: Tạo bảng biểu trƣng Bảng biểu trưng là một sự tương ứng giữa các tên tượng trưng với các địa chỉ 16 bit của chúng tính từ đầu chương trình. Nên nhớ rằng, chúng ta cần các nhãn ở nhưng chổ cần được tham khảo, hoặc đĩ là đích của một lệnh rẻ nhánh hoặc nơi đĩ chứa dữ liệu cần được nạp hay lưu. Vì vậy, nếu chúng ta khơng cĩ bất kỳ một lỗi lập trình nào, và nếu chúng ta xác định được tất cả các nhãn, chúng ta hẳn sẽ xác định được tất cả các địa chỉ tượng trưng được dùng trong chương trình.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.3 Quá trình hợp dịch 5.3.3 Bƣớc đầu tiên: Tạo bảng biểu trƣng Lệnh đầu tiên cĩ nhãn là lệnh ở dịng 12. Vì nĩ là lệnh thứ năm của chương trình, nên lúc này LC chứa x3004, một đầu vào trong bảng biểu trưng được tạo ra như sau: Lệnh thứ hai cĩ nhãn là lệnh ở dịng 1F. Tại đây, LC đã được tăng lên tới x300B. Như vậy một đầu vào trong bảng đã được tạo ra thêm như sau:
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.3 Quá trình hợp dịch 5.3.3 Bƣớc đầu tiên: Tạo bảng biểu trƣng Tới lúc cuối của bước dịch đầu tiên, bảng biểu trưng cĩ các đầu vào như sau:
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.3 Quá trình hợp dịch 5.3.4 Bƣớc thứ hai: Dịch ra ngơn ngữ máy Bước dịch thứ hai gồm việc duyệt qua chương trình hợp ngữ lần thứ hai, theo từng dịng, lúc này với sự trợ giúp của bảng biểu trưng. Ở mỗi dịng, lệnh hợp ngữ được dịch ra lệnh ngơn ngữ máy LC-3.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.3 Quá trình hợp dịch 5.3.4 Bƣớc thứ hai: tạo chƣơng trỉnh ngơn ngữ máy Lần này, khi bộ dịch lấy lệnh ở dịng 0C, nĩ cĩ thể hồn tồn dịch lệnh này vì nĩ biết nhãn PTR tương ứng với x3013. Lệnh là LD, cĩ opcode là 0010. Thanh ghi đích là R3, nghĩa là 011. PCoffset được tính như sau: chúng ta biết rằng PTR là nhãn cho địa chỉ x3013, và thanh ghi PC đã tăng là LC + 1, tức x3002. Vì PTR (x3013) phải là tổng của PC đã tăng (x3002) và PCoffset được mở rộng dấu, nên PCoffset phải là x0011. Ghép tất cả điều này lại với nhau, ta thấy lệnh ở x3001 là 0010011000010001, và LC được tăng lên x3002.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.3 Quá trình hợp dịch 5.3.4 Bƣớc thứ hai: Dịch ra ngơn ngữ máy Chương trình đã được dịch và nhận được là
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.4 Chƣơng trình với nhiều modul 5.4.1 Bản thực thi Khi máy tính bắt đầu thực thi một chương trình, tập tin thực thi của chương trình được gọi là bản thực thi (Executable image). Bản thực thi thường được tạo ra từ nhiều modul do nhiều lập trình viên thiết kế ra một cách độc lập. Mỗi modul được dịch một cách riêng biệt và tạo thành một tập tin đối tượng (object). Nếu các modul được viết bằng hợp ngữ LC-3, chúng sẽ được dịch bằng bộ dịch hợp ngữ LC-3. Những modul được viết bằng C sẽ được dịch bằng bộ dịch C. Cĩ những modul do lập trình viên viết khi thiết kế chương trình, và cũng cĩ những modul là các chương trình con được cung cấp bởi hệ điều hành. Mỗi tập tin đối tượng bao gồm các lệnh trong kiến trúc tập lệnh (ISA) của máy tính đang được sử dụng, cùng với các dữ liệu liên quan.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.4 Chƣơng trình với nhiều modul 5.4.1 Bản thực thi Bước cuối cùng là liên kết (link) tất cả các modul lại với nhau để cĩ một tập tin gọi là bản thực thi. Trong suốt quá trình thực thi, các chu kỳ lệnh FETCH, DECODE, được áp dụng cho các lệnh trong bản thực thi.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.4 Chƣơng trình với nhiều modul 5.4.2 Thiết kế với nhiều tập tin đối tượng Khi thiết kế một chương trình, chúng ta thường dùng thư viện của hệ điều hành cũng như các modul được viết bởi các lập trình viên khác trong nhĩm. Do đĩ, việc bản thực thi được tạo ra từ nhiều tập tin đối tượng khác nhau là rất phổ biến. Trong chương trình ví dụ đếm số ký tự xuất hiện trong một tập tin là mảng, ta cĩ thể thấy một áp dụng tiêu biểu của chương trình với hai modul, gồm modul chương trình và modul là tập tin dữ liệu. Với ví dụ 5.3, địa chỉ bắt đầu của tập tin mảng dữ liệu là x4000 ở dịng 2D khơng được quan tâm khi chương trình được viết.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.4 Chƣơng trình với nhiều modul 5.4.2 Thiết kế với nhiều tập tin đối tượng Nếu chúng ta thay thế dịng 2D này bằng PTR .FILL STARTofFILE thì chương trình ví dụ này sẽ khơng được hợp dịch vì khơng cĩ đầu vào cho STARTofFILE trong bảng biểu trưng. Chúng ta giải quyết việc này ra sao ? Mặt khác, nếu hợp ngữ LC-3 cĩ mã giả .EXTERNAL, chúng ta cĩ thể xác định STARofFILE như là một tên biểu trưng của một địa chỉ khơng được biết lúc chương trình 5.3 được dịch. Điều này cĩ thể được thực hiện bằng dịng sau .EXTERNAL STARTofFILE
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.4 Chƣơng trình với nhiều modul 5.4.2 Thiết kế với nhiều tập tin đối tượng Mà sẽ báo cho bộ dịch LC-3 rằng sự vắng mặt của nhãn STARTofFILE khơng phải là một lỗi trong chương trình. Hơn nữa, STARTofFILE là một nhãn trong modul khác và modul này sẽ đuộc dịch một cách độc lập. Trong ví dụ 5.3, đĩ chính là nhãn của vị trí của ký tự đầu tiên trong tập tin mảng mà sẽ được chương trình đếm ký tự của chúng ta khảo sát.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.4 Chƣơng trình với nhiều modul 5.4.2 Thiết kế với nhiều tập tin đối tượng Nếu hợp ngữ LC-3 cĩ được mã giả .EXTERNAL, và nếu chúng ta đã thiết kế nhãn STARTofFILE theo .EXTERNAL, LC-3 cĩ khả năng tạo một đầu vào trong bảng biểu trưng cho STARTofFILE, và thay vì gán cho nhãn này một địa chỉ, LC-3 sẽ đánh dấu biểu trưng tùy thuộc modul khác. Lúc liên kết, khi tất cả các modul được kết nối lại, bộ liên kết (tức chương trình phụ trách việc nối này) sẽ dùng đầu vào cho STARTofFILE trong bảng biểu trưng trong modul khác để hồn tất việc dịch dịng 2D.
- CHƢƠNG 5 LẬP TRÌNH HỢP NGỮ LC-3 5.4 Chƣơng trình với nhiều modul 5.4.2 Thiết kế với nhiều tập tin đối tượng Theo cách này, mã giả .EXTERNAL cho phép việc tham khảo của một modul tới các vị trí biểu trưng trong một modul khác một cách dễ dàng. Quá trình dịch phù hợp được bộ liên kết giải quyết.
- HỆ THỐNG MÁY TÍNH VÀ NGÔN NGỮ C KẾT THÚC CHƯƠNG 5