| | | | Clover | Administration
|
Tổng số bài gửi : 747 Join date : 11/07/2010 Age : 35 Đến từ : HN
|
|
| | | | |
| Tiêu đề: L ẬP TRÌNH ASSEMBLY CHO HỆ VI XỬ LÝ Wed Mar 02, 2011 7:44 pm | |
| Clover nói:
| | | | L ẬP TRÌNH ASSEMBLY CHO HỆ VI XỬ LÝ
Trong phần Kiến trúc máy tính, chúng ta đã tìm hiểu về cấu trúc và tập lệnh của bộ vi xử lý x86. Trong phần này chúng ta sẽ tìm hiểu cách lập trình Assembly cho các hệ vi xử lý x86 của Intel. Sở dĩ ta dùng ngôn ngữ lập trình Assembly để viết phần mềm cho hệ vi xử lý là vì nó có các ưu điểm sau: - Sử dụng trực tiếp tập lệnh của bộ vi xử lý nên quá trình điều hành chức năng rất sát với cấu trúc phần cứng của hệ thống, tận dụng triệt để khả năng của phần cứng mà không một ngôn ngữ lập trình bậc cao nào làm được. - Có tốc độ thực hiện nhanh hơn nhiều so với các ngôn ngữ bậc cao. Do vậy nó rất thích hợp với các chức năng yêu cầu thời gian thực chẳng hạn như thao tác với các tín hiệu biến đổi nhanh. Các chương trình viết bằng ngôn ngữ Assembly phải được dịch ra ngôn ngữ máy (dạng nhị phân) vì đây là dạng duy nhất mà hệ vi xử lý có thể hiểu được. Có nhiều chương trình biên dịch nhưng thông dụng nhất hiện nay Macro Assembler của hãng Microsoft, Turbo Assembler của hãng Borland và Emu8086 (www.emu8086.com). Trong khuôn khổ của chương trình học, chúng ta sẽ sử dụng chương trình emu8086 để viết chương trình cũng như tìm hiểu các thức hoạt động của vi xử lý.
1.Cấu trúc một chương trình ASM oCác ký tự dùng trong chương trình: sử dụng tất cả các ký tự trong bảng mã ASCII, không phân biệt chữ hoa/thường - Các chữ cái latin: 26 chữ hoa A-Z, 26 chữ thường a-z. - Các chữ số thập phân: ‘0’ - ‘9’ - Các ký hiệu phép toán, các dấu chấm câu và các ký hiệu đặc biệt: + - * / @ ? $ , . : [ ] ( ) < > { } & % ! \ # v.v... - Các ký tự ngăn cách: space và tab oCấu trúc một lệnh trong chương trình : , ;Ghi chú Nhãn: xác định vị trí bắt đầu của một lệnh/đoạn lệnh, sẽ được thay thế thành địa chỉ sau khi dịch thành mã máy. Nhãn bắt đầu bằng một ký tự, kết thúc bằng dấu hai chấm (:) và không có khoảng trắng ở giữa Lệnh : từ gợi nhớ thay cho một yêu cầu/hoạt động cụ thể của VXL (tham khảo thêm trong emu8086 -> help -> Complete 8086 Instructions Set) vd: MOV -> MOVE -> lệnh di chuyển dữ liệu SUB -> SUBTRACT -> lệnh trừ hai toán hạng Toán hạng : Là thanh ghi, ô nhớ, địa chỉ hoặc số hạng. Các toàn hạng cách nhau bởi dấu phẩy (,). Một lệnh có thể có một, hai hoặc không có toán hạng. vd MOV AX,BX ;chuyển nội dung thanh ghi BX vào AX, có hai toán hạng. MUL BX ;nhân AX cho BX kết quả lưu trong DX:AX, có một toán hạng AAA ;điều chỉnh số BCD sau khi cộng, không có toán hạng Ghi chú : thể hiện ý nghĩa của lệnh/đoạn lệnh trong chương trình vd: MOV AX,data ;xác định địa chỉ đoạn dữ liệu ocác hằng số dùng trong chương trình: sử dụng chủ yếu là ba dạng sau
Số hệ thập phân: dùng các ký tự từ 0 à 9 và kết thúc là chữ d hoặc D. Lưu ý, số không có ký tự kết thúc được hiểu là hệ thập phân vd 1001 à số một nghìn không trăm lẻ một Số hệ nhị phân: dùng hai ký tự từ 0,1 và kết thúc là chữ b hoặc B. vd 1001b à tương ứng với số 9 trong hệ thập phân Số hệ thập lục phân: dùng các ký tự từ 0 à 9, A à F và kết thúc là chữ h hoặc H. Lưu ý, số không được bắt đầu bằng ký tự à thêm số 0 phía trước vd: A37Fh (số sai) à 0A37Fh ocác khai báo biến, hằng số: toán tử EQU: gán giá trị cho biến vd: str EQU 13d ;sau khi dịch thành mã máy, các từ str sẽ được thay thế thành số 13d toán tử DB: khai báo ô nhớ có kích thước 1 byte toán tử DW: khai báo ô nhớ có kích thước 2 byte toán tử DD: khai báo ô nhớ có kích thước 4 byte toán tử DQ: khai báo ô nhớ có kích thước 8 byte toán tử DT: khai báo ô nhớ có kích thước 10 byte vd: str db 10,20,30,40,50 ;khai báo một mảng gồm 5 ô nhớ, mỗi ô dung lượng một byte chứa các giá trị như trong khai báo. Toán tử DUP (): nhân bản các toán tử trong khai báo vd: str db 5 dup (?) ; khai báo một mảng gồm 5 ô nhớ, mỗi ô dung lượng một byte và không chứa giá trị ban đầu (null). ocấu trúc một chương trình ASM dạng *.exe: Gồm ba phần chính là data, stack và code Data Segment chứa các khai báo dữ liệu ban đầu Ends Stack segment dw xx dup (?) ;xx là dung lượng bộ nhớ ngăn xếp Ends Code Segment chứa các lệnh của chương trình | | | | | |
|