intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Ngôn ngữ lập trình Assembly - Nguyễn Tiến Duy

Chia sẻ: Dao Anh Huong | Ngày: | Loại File: DOC | Số trang:130

223
lượt xem
44
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Với kết cấu nội dung gồm 7 chương, tài liệu "Ngôn ngữ lập trình Assembly" giới thiệu đến các bạn những nội dung cơ bản về kiến trúc phần cứng và phần mềm của bộ vi xử lý x86 Fmaily. Ngôn ngữ lập trình Assembly để giải quyết các bài toán mức thấp của hệ thống: Vào, ra dữ liệu, điều khiển hệ thống. Với các bạn đang học chuyên ngành Kỹ thuật lập trình máy tính thì đây là tài liệu tham khảo hữu ích.

Chủ đề:
Lưu

Nội dung Text: Ngôn ngữ lập trình Assembly - Nguyễn Tiến Duy

  1. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP KHOA ĐIỆN TỬ   Bộ môn: Kỹ thuật máy tính ASSEMBLY
  2. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP MỤC LỤC  GIỚI THIỆU MÔN HỌC                                                                                                                        ....................................................................................................................      5  BÀI GIẢNG MÔN: ASSEMBLY                                                                                                            ........................................................................................................      6  I.MỤC ĐÍCH MÔN HỌC                                                                                                                        ....................................................................................................................      6  II.NỘI DUNG CHÍNH                                                                                                                             .........................................................................................................................      6  III.NỘI DUNG CHI TIẾT                                                                                                                        ....................................................................................................................      7  CHƯƠNG 1 CƠ BẢN VỀ HỢP NGỮ                                                                                                  ..............................................................................................      7  1.1.Cú pháp lệnh hợp ngữ                                                                                                                       ...................................................................................................................      7  1.1.1.Trường tên (Name field)                                                                                                             .........................................................................................................      7  1.1.2.Trường toán tử (Operator field)                                                                                                  ..............................................................................................      8  1.1.3.Trường các toán hạng (Operand(s) code)                                                                                   ...............................................................................      8  1.1.4.Trường chú thích (Comment field)                                                                                             .........................................................................................     8  1.2.Các kiểu số liệu trong chương trình hợp ngữ                                                                                  ..............................................................................      9  1.2.1.Các số                                                                                                                                          ......................................................................................................................................      9  1.2.2.Các ký tự                                                                                                                                     .................................................................................................................................      9  1.2.3.Các biến (Variables)                                                                                                                   ...............................................................................................................      9  1.2.3.1.Biến byte                                                                                                                              ..........................................................................................................................      9  1.2.3.2.Biến từ (word)                                                                                                                   ...............................................................................................................       10  1.2.3.3.Biến mảng (array)                                                                                                             .........................................................................................................       10  1.2.3.4.Byte thấp và byte cao của một từ                                                                                     .................................................................................      10  1.2.4.Chuỗi các ký tự (Character string)                                                                                            ........................................................................................      10  1.2.5.Các hằng (Constnts)                                                                                                                  ..............................................................................................................       11  1.3.Các lệnh cơ bản                                                                                                                               ...........................................................................................................................       11  1.3.1.Lệnh MOV và lệnh XCHG                                                                                                      ..................................................................................................       11  1.3.2.Lệnh ADD, SUB, INC, DEC                                                                                                    ................................................................................................       12  1.3.3.Lệnh NEG (NEGative)                                                                                                             .........................................................................................................       13  1.4.Chuyển ngôn ngữ cấp cao thành ngôn ngữ ASM                                                                           .......................................................................       13  1.4.1.Mệnh đề A=B:                                                                                                                          ......................................................................................................................       13  1.4.2.Mệnh đề A=5­A:                                                                                                                      ..................................................................................................................       13  1.4.3.Mệnh đề A=B­2*A:                                                                                                                  ..............................................................................................................       14  1.5.Cấu trúc một chương trình hợp ngữ                                                                                               ...........................................................................................       14  1.5.1.Các kiểu bộ nhớ                                                                                                                       ...................................................................................................................       14  1.5.2.Đoạn số liệu                                                                                                                             .........................................................................................................................       14  1.5.3.Đoạn ngăn xếp                                                                                                                          ......................................................................................................................       14  1.5.4.Đoạn mã                                                                                                                                    ................................................................................................................................       15  1.6.Các lệnh vào, ra                                                                                                                               ...........................................................................................................................       15  1.7.Chương trình đầu tiên                                                                                                                     .................................................................................................................       16  1.8.Tạo và chạy một chương trình hợp ngữ                                                                                        ....................................................................................      17  1.8.1.Xuất một chuỗi ký tự                                                                                                               ...........................................................................................................       18  1.8.2.Chương trình đổi chữ thường sang chữ hoa                                                                            ........................................................................       19  CHƯƠNG 2 TRẠNG THÁI CỦA VI XỬ LÝ VÀ CÁC THANH GHI CỜ                                       ...................................       21  2.1.Thanh ghi cờ (Flag register)                                                                                                             .........................................................................................................       21  2.2.Tràn (Overflow)                                                                                                                                ............................................................................................................................       22  2.3.Các lệnh ảnh hưởng đến các cờ như thế nào                                                                                ............................................................................       23  2.4.Chương trình Debug                                                                                                                        ....................................................................................................................       25  CHƯƠNG 3 CÁC LỆNH ĐIỀU KHIỂN                                                                                              ..........................................................................................      29  3.1.Ví dụ về lệnh nhảy                                                                                                                         .....................................................................................................................       29  3.2.Nhảy có điều kiện                                                                                                                           .......................................................................................................................       29  3.3.Lệnh JMP                                                                                                                                         .....................................................................................................................................       32 Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 2
  3. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP  3.4.Cấu trúc của ngôn ngữ cấp cao                                                                                                      ..................................................................................................       32  3.4.1.Cấu trúc rẽ nhánh                                                                                                                     .................................................................................................................       33  3.4.1.1.Cấu trúc If ­ Then                                                                                                               ...........................................................................................................       33  3.4.1.2.Cấu trúc If ­ Then ­ Else                                                                                                    ................................................................................................       33  3.4.1.3.Cấu trúc If ­ Then ­ Else                                                                                                    ................................................................................................       34  3.4.2.Cấu trúc lặp                                                                                                                              ..........................................................................................................................       36  3.4.2.1.Vòng For                                                                                                                             .........................................................................................................................       36  3.4.2.2.Vòng WHILE                                                                                                                     .................................................................................................................       37  3.4.2.3.Vòng REPEAT                                                                                                                   ...............................................................................................................       37  3.5.Lập trình với cấu trúc cấp cao                                                                                                        ....................................................................................................       38  CHƯƠNG 4 CÁC LỆNH LOGIC, DỊCH VÀ QUAY                                                                          ......................................................................       43  4.1.Các lệnh logic                                                                                                                                  ..............................................................................................................................       43  4.1.1.Lệnh And, Or và Xor                                                                                                                ............................................................................................................       43  4.1.2.Lệnh NOT                                                                                                                                 .............................................................................................................................       45  4.1.3.Lệnh TEST                                                                                                                                ............................................................................................................................       45  4.2.Lệnh SHIFT                                                                                                                                     .................................................................................................................................       46  4.2.1.Lệnh dịch trái (Left Shift)                                                                                                         .....................................................................................................       46  4.2.2.Lệnh dịch phải (Right Shift)                                                                                                    ................................................................................................       47  4.3.Lệnh quay (Rotate)                                                                                                                          ......................................................................................................................       48  4.4.Nhập/xuất số nhị phân và số Hexa                                                                                                 .............................................................................................       49  4.4.1.Nhập số nhị phân                                                                                                                      ..................................................................................................................       49  4.4.2.Xuất số nhị phân                                                                                                                       ...................................................................................................................       50  4.4.3.Nhập số Hexa                                                                                                                           .......................................................................................................................       50  CHƯƠNG 5 NGĂN XẾP VÀ THỦ TỤC                                                                                            ........................................................................................      52  5.1.Ngăn xếp                                                                                                                                          ......................................................................................................................................       52  5.1.1.Lệnh PUSH và PUSHF                                                                                                             .........................................................................................................       52  5.1.2.Lệnh POP và POPF                                                                                                                   ...............................................................................................................       52  5.2.Ứng dụng của stack                                                                                                                         .....................................................................................................................       53  5.3.Thủ tục (procedure)                                                                                                                         .....................................................................................................................       54  5.4.Call và Return                                                                                                                                   ...............................................................................................................................       55  5.5.Ví dụ về thủ tục                                                                                                                              ..........................................................................................................................       56  CHƯƠNG 6 LỆNH NHÂN VÀ CHIA                                                                                                 .............................................................................................      58  6.1.Lệnh MUL và IMUL                                                                                                                       ...................................................................................................................       58  6.2.Ứng dụng đơn giản của lệnh MUL và IMUL                                                                                ............................................................................       59  6.3.Lệnh DIV và IDIV                                                                                                                           .......................................................................................................................       60  6.4.Mở rộng dấu của số bị chia                                                                                                            ........................................................................................................       61  6.5.Thủ tục nhập/xuất số thập phân                                                                                                    ................................................................................................       61  CHƯƠNG 7 MẢNG VÀ CÁC CHẾ ĐỘ ĐỊA CHỈ                                                                              ..........................................................................       69  7.1.Mảng một chiều                                                                                                                              ..........................................................................................................................       69  7.2.Các chế độ địa chỉ (Addressing modes)                                                                                          ......................................................................................      70  7.2.1.Chế độ địa chỉ gián tiếp qua thanh ghi                                                                                    ................................................................................      70  7.2.2.Chế độ địa chỉ chỉ số và cơ sở                                                                                                 .............................................................................................      72  7.2.3.Toán tử PTR và toán tử giả LABEL                                                                                        ....................................................................................      74  7.2.4.Chiếm đoạn (segment override)                                                                                               ...........................................................................................      76  7.2.5.Truy xuất đoạn ngăn xếp (stack)                                                                                             .........................................................................................      76  7.3.Sắp xếp số liệu trên mảng                                                                                                              ..........................................................................................................       76  7.4.Mảng hai chiều                                                                                                                                ............................................................................................................................       78  7.5.Chế độ địa chỉ chỉ số cơ sở                                                                                                             .........................................................................................................       80  7.6.Ứng dụng để tính trung bình                                                                                                           .......................................................................................................       81  7.7.Lệnh XLAT                                                                                                                                      ..................................................................................................................................       82 Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 3
  4. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP  PHỤ LỤC 1: INTEL 80X86 INSTRUCTION SET                                                                               ...........................................................................       86  PHỤ LỤC 2: CÁC DỊCH VỤ CỦA BIOS VÀ DOS                                                                           .......................................................................       129  PHỤ LỤC 3: CÁC CHƯƠNG TRÌNH VÍ DỤ                                                                                   ...............................................................................      130  Communication                                                                                                                                    ................................................................................................................................      130  Compression                                                                                                                                         .....................................................................................................................................       130  CPU                                                                                                                                                      ..................................................................................................................................................       130  Date & Time                                                                                                                                         .....................................................................................................................................       130  Disk & File access                                                                                                                                ............................................................................................................................      130  Keyboard & Mouse                                                                                                                              ..........................................................................................................................      130  Math routines                                                                                                                                        ....................................................................................................................................      130  Memory                                                                                                                                                ............................................................................................................................................       130  Protected mode                                                                                                                                     .................................................................................................................................      130  TSR (Terminal and Stay Presidented)                                                                                                  ..............................................................................................      130 Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 4
  5. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP GIỚI THIỆU MÔN HỌC 1. Tên môn học: Ngôn ngữ lập trình Assembly. 2. Phân bố thời gian: 45 LT + 15 BT. 3. Môn tiên quyết: Ngôn ngữ lập trình Pascal, C (Tin học đại cương). Cấu trúc máy tính (hoặc Kiến trúc máy tính). Vi xử lý. 4. Môn song hành: Kỹ  thuật ghép nối máy tính và thiết bị  ngoại vi, Đo lường và điều khiển   bằng máy tính. 5. Mô tả môn học: Môn học cung cấp cho sinh viên những kiến thức cơ bản về kiến trúc phần cứng và phần  mềm của bộ vi xử lý x86 Fmaily. Ngôn ngữ lập trình Assembly (hợp ngữ) để giải quyết các bài  toán mức thấp của hệ thống: vào/ra dữ liệu, điều khiển hệ thống, ... 6. Giáo trình chính: Lập trình hợp ngữ cho IBM PC và máy tính tương thích. 7. Tài liệu tham khảo: [1] Ytha Yu & Charles Marut, Lập trình hợp ngữ (Assembly) và máy vi tính IBM­PC, NXB  Giáo Dục, 1996. [2] PTS. Nguyễn Quang Tấn, Vũ Thanh Hiền, Lập trình với Hợp Ngữ,  NXB Thống Kê,  1997. [3] Văn Thế Minh, Kỹ thuật vi xử lý, NXB Giáo Dục, 1997. [4] Trần Bá Thái, Điều khiển và ghép nối các thiết bị ngoại vi, NXB thống kê, 1987. [5] Trần Quang Vinh, Cấu trúc máy vi tính, NXB Giáo Dục, 1998. [6] Computer   Organization   and   Assembly   Language   Programming   For   IBM   PC   and  Compatibles   Michael   Thorne   ­   The   Benjamin­Cummings   Publishing   Company,   Inc.  1991. [7] Microprocessors   and   microcomputer­based   system   design   Mohamed   Rafiquzzaman   ­  CRC Press, 1995. [8] Interfacing to the IBM Personal Computer Lewis C. Eggebrecht ­ SAMS, 1991. [9] Microprocessors   and   interfacing:   Programming   and   Hardware   Douglas   V.   Hall   ­  Macmillan/McGraw­Hill, 1992. 8. Đối tượng học:  Sinh viên ngành Kỹ  thuật máy tính, Điều khiển tự  động, Điện tử  viễn   thông, Kỹ thuật điện tử. 9. Giáo viên phụ trách: Nguyễn Tiến Duy. 10. Đơn vị phụ trách: Bộ môn Kỹ thuật máy tính, Khoa Điện tử. Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 5
  6. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP BÀI GIẢNG MÔN: ASSEMBLY I. MỤC ĐÍCH MÔN HỌC II. NỘI DUNG CHÍNH Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 6
  7. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP III. NỘI DUNG CHI TIẾT  CH ƯƠ   NG 1 C    Ơ     B    Ả    N V    Ề     H    Ợ    P NG    Ữ    Trong chương này sẽ  giới thiệu những nguyên tắc chung để  tạo ra, dịch và chạy một   chương trình hợp ngữ trên máy tính. Cấu trúc ngữ  pháp của lệnh hợp ngữ  trong giáo trình này được trình bày theo Macro   Assembler (MASM) dựa trên CPU 8086/88. 1.1. Cú pháp lệnh hợp ngữ Một chương trình hợp ngữ  bao gồm một loạt các mệnh đề  (statements) được viết liên   tiếp nhau, mỗi mệnh đề được viết trên một dòng. Một mệnh đề có thể là: o Một chỉ thị (instruction): nó sẽ được biên dịch (Assembler = ASM) thành mã máy. o Một chỉ  dẫn của Assembler (Assembler directive): ASM không chuyển thành mã  máy. Các mệnh đề của ASM gồm 4 trường: Name Operator Operand(s) Comment Các trường cách nhau ít nhất một dấu cách hoặc một ký tự TAB. Ví dụ: Start: Mov cx, 5 ; Khởi tạo biến đếm vòng lặp, (chỉ  thị  này sẽ  được dịch ra mã   máy). Main Proc ; Tạo một thủ tục có tên là Main (chỉ  dẫn này không được dịch ra   mã máy). 1.1.1. Trường tên (Name field) Trường này được dùng cho nhãn lệnh, tên thủ  tục và tên biến. ASM sẽ  chuyển tên  thành địa chỉ bộ nhớ. Tên bao gồm các ký tự: A ­ z, chữ số và một số ký tự đặc biệt: ?, @, _, $. Tên không được chứa dấu cách. Độ dài từ 1 đến 31 ký tự. Nếu trong tên có ký tự ‘.’ thì nó phải là ký tự đầu tiên. Tên không được bắt đầu bằng một chữ số. ASM không phân biệt giữa ký tự hoa và ký tự thường. Ví dụ: COUNTER1 TWO WORDS ; Tên không hợp lệ (chứa dấu cách) @CHARACTER2ABC ; Tên hợp lệ SUM_OF_DIGITS A45.28 ; Tên không hợp lệ (chứa dấu cách) DONE?YOU&ME ; Tên hợp lệ .TEST ADD­REPEAT ; Tên không hợp lệ (chứa dấu cách) Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 7
  8. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP 1.1.2. Trường toán tử (Operator field) Đối với một lệnh, trường toán tử  chứa ký hiệu (symbol) dạng gợi nhớ  (mnemonic)   của mã phép toán (operator code = Opcode). ASM sẽ chuyển ký hiệu của mã phép toán thành  mã máy. Thông thường ký hiệu mã phép toán mô tả chức năng của phép toán (phép toán thực  hiện công việc gì). Ví dụ: ADD, SUB, INC, DEC, INT, IN, OUT, ... Đối với chỉ  dẫn chương trình dịch, trường toán tử  chứa một opcode giả  (Pseudo   operator code = Pseudo­op). ASM không chuyển Pseudo­op thành mã máy mà hướng ASM  thực hiện một công việc gì đó, ví dụ tạo ra một thủ tục, định nghĩa các biến, ... 1.1.3. Trường các toán hạng (Operand(s) code) Operand(s) = Đích, nguồn Trong một chỉ  thị, trường các toán hạng chỉ  ra các số  liệu tham gia trong chỉ  thị  đó.   Tuỳ từng chỉ thị khác nhau mà trường này có thể có 2, 1 hoặc không có toán hạng nào. Ví dụ: Add ax, word ; Hai toán hạng Inc cx ; Một toán hạng Nop ; Không toán hạng Trong   các  chỉ   thị   có  hai  toán  hạng,  toán  hạng  đầu  là   toán  hạng  đích  (destination   operand), toán hạng đích thường là thanh ghi hoặc ô nhớ dùng để  lưu trữ  kết quả. Còn toán  hạng thứ hai là toán hạng nguồn (source operand), toán hạng nguồn thường không bị thay đổi  sau khi thực hiện lệnh. Đối với một chỉ dẫn của ASM, trường toán hạng thường chứa một hoặc nhiều thông  tin mà ASM dùng để thực hiện chỉ dẫn. 1.1.4. Trường chú thích (Comment field) Trường chú thích là một tuỳ  chọn của mệnh đề  trong ngôn ngữ  ASM. Người lập  trình thường dùng trường chú thích để  thuyết minh về  câu lệnh. Điều này là cần thiết vì  ngôn ngữ ASM là ngôn ngữ cấp thấp (low level) vì vậy sẽ rất khó hiểu chương trình nếu nó  không được chú thích một cách đầy đủ và rõ ràng. Tuy nhiên không nên có chú thích đối với   mọi dòng lệnh của chương trình, kể cả những lệnh mà ý nghĩa của nó đã rất rõ ràng như: Nop ; Không làm gì cả Trường chú thích bắt đầu bằng dấu chấm phảy. ASM cũng cho phép dùng toàn bộ  một dòng cho chú thích để  tạo ra một khoảng trống ngăn cách các phần khác nhau của  chương trình, ví dụ: ; ; Khởi tạo các thanh ghi ; Mov ax, 0 Mov bx, 0 Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 8
  9. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP 1.2. Các kiểu số liệu trong chương trình hợp ngữ CPU chỉ làm việc với các số nhị  phân, vì vậy ASM phải chuyển tất cả  các loại số  liệu   thành số nhị phân. Trong một chương trình hợp ngữ  cho phép biểu diễn số  liệu dưới dạng nhị  phân (Binary), thập phân (Decimal) hoặc thập lục phân (Hexa) và thậm chí là cả ký tự. 1.2.1. Các số Một số  nhị  phân là một dãy các bit 0 và 1,  Số Loại phải kết thúc bằng B (hoặc b). 10111 Số thập phân Một số thập phân là một dãy các chữ số thập   10111b Số nhị phân phân, kết thúc bằng D (hoặc d) hoặc không cần. 64223 Số thập phân ­2183D Số thập phân Một số hexa là một dãy các chữ số hexa, kết  1B4DH Số Hexa thúc bằng H (hoặc h). 1B4D Số Hexa không hợp lệ Sau đây là các biểu diễn số hợp lệ và không  FFFFH Số Hexa không hợp lệ hợp lệ trong ASM: 0FFFFH Số Hexa 1.2.2. Các ký tự Ký tự  và một xâu ký tự  phải được đặt giữa cặp dấu ngoặc đơn (hoặc cặp ngoặc  kép). Ví dụ: ‘A’ và “Hello”. Các ký tự  đều được chuyển thành mã ASCII bởi ASM do đó   trong chương trình ASM sẽ xem ‘A’ và 41h (mã ASCII cảu ‘A’) là như nhau. 1.2.3. Các biến (Variables) Trong ASM, biến đóng vai trò như trong ngôn ngữ bậc cao. Mỗi biến có một loại dữ  liệu và nó được gán một địa chỉ  bộ  nhớ  sau khi dịch chương trình. Bảng sau đây liệt kê các   toán tử giả dùng để định nghĩa các loại số liệu. 1.2.3.1. Biến byte PSEUDO­OP STANDS FOR DB Define Byte Chỉ  dẫn của ASM  DW Define Word (doublebyte) để   định   nghĩa   biến   byte  DD Define Doubeword (2 từ liên tiếp) có dạng như sau: DQ Define Quadword (4 từ liên tiếp) DT Define Tenbytes (10 bytes liên tiếp) NAMEDB initial_value Ví dụ: ALPHA DB 4 ; Chỉ  dẫn này sẽ  gán tên ALPHA cho một byte nhớ  trong bộ  nhớ  mà giá trị  ban  đầu của nó là 4. Nếu giá trị của byte là không xác định thì đặt dấu chấm hỏi (?) vào giá trị  ban đầu. Ví dụ: Byte DB ? Đối biến byte, phạm vi giá trị  mà nó có thể  lưu trữ  được là từ  ­128 đến 127 đối  với số có dấu và từ 0 đến 255 đối với số không dấu. Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 9
  10. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP 1.2.3.2. Biến từ (word) Chỉ dẫn của ASM để định nghĩa một biến từ như sau: NAMEDW initial_value Ví dụ: WRD DW ­2 Tương tự như biến byte, cũng có thể dùng dấu ? để định nghĩa một biến từ có giá  trị không xác định. phạm vi giá trị mà nó có thể lưu trữ được là từ  ­32768 đến 32767 đối   với số có dấu và từ 0 đến 65535 đối với số không dấu. 1.2.3.3. Biến mảng (array) Trong ASM, một mảng nhớ là một loạt các byte nhớ hoặc từ nhớ liên tiếp nhau. Ví dụ: Để định nghĩa một mảng 3 byte gọi là B_array mà giá trị ban đầu của nó là  10h, 20h và 30h chúng ta có thể viết: B_array DB 10h, 20h, 30h Khi đó: B_array là tên được gán cho byte đầu tiên. B_array+1 là tên được gán cho byte thứ hai. B_array+2 là tên được gán cho byte thứ hai. Nếu ASM gán địa chỉ  offset là 0200h cho mảng B_array thì nội dung bộ  nhớ  sẽ  như sau (bảng bên): Chỉ dẫn sau đây sẽ định nghĩa một mảng gồm 4 phần tử có tên là W_array: W_array DW 1000, 40, 2997, 230. Symbol Address Contents Giả  sử  mảng bắt đầu tại địa chỉ  offset  B_array 0200h 10h B_array+1 0201h 20h 0300h thì nội dung bộ nhớ sẽ như bên: B_array+2 0202h 30h 1.2.3.4. Byte thấp và byte cao của một từ Đôi khi ta cần truy xuất  đến từng byte  Symbol Address Contents (byte  thấp hoặc byte  cao)  của một từ,  giả  sử  W_array 0300h 1000d chúng ta định nghĩa: W_array+2 0302h 40d W_array+4 0304h 2997d Word1 DW 1234h W_array+4 0306h 230d thì byte thấp của Word1 chứa 34h, còn byte cao của Word1 chứa 12h. Ký hiệu địa  chỉ của byte thấp là Word1 (là địa chỉ của biến Word1) còn ký hiệu địa chỉ của byer cao là  Word1+1. 1.2.4. Chuỗi các ký tự (Character string) Một mảng các mã ASCII có thể được định nghĩa bằng một chuỗi các ký tự. Ví dụ: Letters db 41h, 42h, 43h sẽ tương đương với: Letters db ‘ABC’ Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 10
  11. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP Bên trong một chuỗi, ASM phân biệt chữ  hoa và chữ  thường. Vì vậy chuỗi ‘abc’ sẽ  được chuyển thành 3 byte: 61h, 62h, và 63h. Trong ASM cũng có thể tổ hợp các ký tự và các số trong một định nghĩa. Ví dụ: MSG db ‘HELLO’, 0AH, 0DH, ‘$’ tương đương với: MSG db 48h, 45h, Ch, 4Ch, 4Fh, 0Ah, 0Dh, 24h 1.2.5. Các hằng (Constnts) Trong một chương trình, các hằng có thể  được đặt tên nhờ  chỉ  dẫn EQU (EQUates).  Cú pháp định nghĩa hằng như sau: NAME EQU Value Ví dụ: LF equ 0ah Sau khi có định nghĩa trên thì Lf được dùng thay thế  cho 0ah trong chương trình. Vì  vậy ASM sẽ chuyển các chỉ thị: Mov dl, 0ah và Mov dl, LF thành cùng một mã máy. Cũng có thể dùng EQU để định nghĩa một chuỗi, ví dụ: Prompt equ ‘Type your name: ‘ Sau khi có định nghĩa này, thay cho: Msg db ‘Type your name: ‘ chúng ta có thể viết: Msg db Prompt 1.3. Các lệnh cơ bản CPU 8086/88 có khoảng 115 chỉ thị  (theo tài liệu), trong phần này chúng ta xem xét một   số lệnh đơn giản của 8086/88 mà chúng thường được dùng với các thao tác di chuyển số liệu và   thực hiện các phép tính toán số học và logic. Trong phần sau đây, word1 và word2 là các biến kiểu word (2 byte), byte1 và byte2 là  các biến kiểu byte. 1.3.1. Lệnh MOV và lệnh XCHG Lệnh Mov dùng để chuyển số liệu giữa các thanh ghi, giữa một thanh ghi và một vị  trí nhớ hoặc để di chuyển trực tiếp một số đến một thanh ghi hoặc một vị trí nhớ. Cú pháp   của lệnh Mov như sau: MOV Destination, Source Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 11
  12. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP Ví dụ: mov ax, word1 ; Lấy nội dung của từ nhớ word1 đưa vào ax. mov bx, ax ; bx nhận nội dung của ax, sau khi thực hiện chỉ thị ; nội dung ax không thay đổi. mov ah, ‘A’ ; ax nhận giá trị 41h. Bảng sau cho thấy các trường hợp cho phép hoặc cấm của chỉ thị Mov: Destination operand Source operand General Reg Segment Reg Memory Location Constant General Reg Y Y Y N Segment Reg Y N Y N MemoryLocation Y Y N N Constant Y N Y N Lệnh Xchg (Exchange) dùng để  hoán chuyển nội dung của hai thanh ghi hoặc của   một thanh ghi và một vị trí nhớ. Ví dụ: xchg ah, bl ; Hoán chuyển nội dung giữa thanh ghi ah và bl xchg ax, word1 ; Hoán chuyển nội dung giữa thanh ghi ax và biến word1 xchg al, byte1 ; Hoán chuyển nội dung giữa thanh ghi al và biến byte1 Cũng như lệnh Mov, lệnh Xchg có một số hạn chế như bảng sau: Destination operand Source operand General Register Memory Locatin General Memory  Y Y Memory Location  Y N 1.3.2. Lệnh ADD, SUB, INC, DEC Lệnh ADD và SUB được dùng để  cộng và trừ  nội dung của hai thanh ghi, của một   thanh ghi và một vị trí nhớ, của một thanh ghi hoặc một vị trí nhớ với một số. Cú pháp như  sau: ADD Destination, Source SUB Destination, Source Ví dụ: sub word1, ax ; word1:=word1­ax sub bl, 5 ; bl:=bl­5 sub ax, dx ; ax:=ax­dx Vì lý do kỹ thuật, các lệnh ADD và SUB cũng bị một số hạn chế như bảng sau: Destination operand Source operand General Reg Memory Loacation Gen Memory Y Y Memory Location Y N Constant Y Y Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 12
  13. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP Việc cộng hoặc trừ trực tiếp giữa 2 vị trí nhớ là không được phép. Để giải quyết vấn  đề  này người ta phải di chuyển một byte (word) nhớ  đến một thanh ghi sau đó mới cộng   hoặc trừ thanh ghi này với một byte (word) nhớ khác. Ví dụ: mov al, byte2 add byte1, al Lệnh INC (INCrement) để cộng thêm 1 vào nội dung của một thanh ghi hoặc một vị  trí nhớ. Lệnh DEC (DECrement) để giảm bớt 1 khỏi một thanh ghi hoặc vị trí nhớ. Cú pháp  của chúng là: INC Destination DEC Destination Ví dụ: inc word1 inc ax dec bl 1.3.3. Lệnh NEG (NEGative) Lệnh NEG để đổi dấu (lấy bù 2) của một thanh ghi hoặc một vị trí nhớ. Cú pháp như  sau: NEG destination Ví dụ: neg ax Giả sử ban đầu ax=0002h, sau khi thực hiện lệnh neg ax thì ax=0fffeh. Chú ý: Hai toán hạng trong các chỉ  thị  có hai toán hạng trên phải cùng kích thước   (cùng là byte hoặc cùng là word). 1.4. Chuyển ngôn ngữ cấp cao thành ngôn ngữ ASM Giả sử A và B là 2 biến kiểu word. Chúng ta sẽ chuyển các mệnh đề sau trong ngôn ngữ  cấp cao ra ngôn ngữ ASM: 1.4.1. Mệnh đề A=B: mov ax, A ; Đưa A vào ax mov b, ax ; Đưa ax vào B 1.4.2. Mệnh đề A=5­A: mov ax, 5 ; Đưa 5 vào ax sub ax, a ; ax=5­a mov ax, a ; a=ax Cách khác: neg a ; A=­A add a, 5 ; A=5­A Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 13
  14. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP 1.4.3. Mệnh đề A=B­2*A: mov ax, B ; ax=b sub ax, A ; ax=B­A sub ax, A ; ax=B­2*A mov A, ax ; A=B­2*A 1.5. Cấu trúc một chương trình hợp ngữ Một chương trình ngôn ngữ  máy bao gồm mã (code), số  liệu (data) và ngăn xếp (stack).   Mỗi phần chiếm một đoạn nhớ. Mỗi đoạn chương trình sẽ  được chuyển thành một đoạn bộ  nhớ bởi ASM. 1.5.1. Các kiểu bộ nhớ Độ lớn của mã và số liệu trong một chương trình được quy định bởi chỉ dẫn MODEL   nhằm xác định kiểu bộ nhớ dùng với chương trình. Cú pháp của chỉ dẫn MODEL như sau: .MODEL memory_model Bảng sau cho thấy các kiểu bộ nhớ (các giá trị và ý nghĩa của memory_model): MODEL DESCRITION SMALL code và data nằm trong một đoạn MEDIUM code nhiều hơn một đoạn, data trong một đoạn COMPACT data nhiều hơn một đoạn, code trong một đoạn LARGE code và data lớn hơn một đoạn, array không quá 64KB HUGE code, data lớn hơn một đoạn, array lớn hơn 64KB 1.5.2. Đoạn số liệu Đoạn số  liệu của chương trình chứa các khai báo biến, (có thể  là) khia báo hằng, ...  Để bắt đầu đoạn số liệu, chúng ta dùng chỉ dẫn DATA với cú pháp như sau: .DATA ; Khai báo tên và kích thước của các biến, mảng và hằng. Ví dụ: byte1 db 2 word1 dw 2 word2 dw 5 msg db ‘This is a message’ 1.5.3. Đoạn ngăn xếp Mục đích của việc khai báo đoạn ngăn xếp là dành một vùng nhớ (vùng stack) để lưu   trữ cho stack. Cú pháp của lệnh như sau: .STACK size Nếu không khai báo size thì 1 KB được dành cho vùng stack. Ví dụ: .Stack 100h ; Dành 256 byte cho vùng stack Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 14
  15. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP Chú ý:  Đối với các chương trình hợp ngữ  nói chung, thông thường giá trị  100h cho  kích thước của vùng stack là phù hợp. 1.5.4. Đoạn mã Đoạn mã chứa các câu lệnh (chỉ  thị) của chương trình. Bắt đầu đoạn mã bằng chỉ  dẫn CODE như sau: .CODE Bên trong đoạn mã, các lệnh thường được tổ  chức thành thủ  tục (procedure) mà cấu  trúc của một thủ tục như sau: Name Proc ; body of procedure Name Endp Sau đây là cấu trúc của một chương trình hợp ngữ mà phần CODE là thủ tục có tên là   MAIN: .Model Small .Stack 100h .Data ; Định nghĩa dữ liệu (biến, mảng, hằng) tại đây .Code Main Proc ; Thân thủ tục Main Main Endp ; Các thủ tục khác nếu có End Main 1.6. Các lệnh vào, ra CPU thông tin với các thiết bị ngoại vi thông qua các cổng I/O (Input/Output port). Lệnh   IN và OUT của CPU cho phép truy xuất đến các cổng này. Tuy nhiên hầu hết các  ứng dụng   không dùng lệnh IN và OUT vì hai lý do: Các địa chỉ cổng thay đổi tuỳ theo loại máy tính khác nhau. Có thể  lập trình cho các I/O dễ  dàng hơn nhờ  các chương trình con (routine) được  cung cấp bởi các hãng chế tạo máy tính. Có hai loại chương trình phục vụ I/O là: các   routine của BIOS (Basic Input Output System) và các routin của DOS (Disk Operating  System). Lệnh INT (Interrupt) Để  gọi các chương trình con của BIOS và DOS có thể  dùng lệnh INT với cú pháp như  sau: INT interrupt_number Ở đây interrupt_number là một số mà nó chỉ định một routine. Ví dụ  INT 16h gọi routine  thực hiện việc nhập số liệu từ Keyboard. Lệnh: INT 21h Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 15
  16. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP INT 21h được dùng để gọi một số lớn các hàm (function) của DOS. Tuỳ theo giá trị  mà   chúng ta đã đặt vào thanh ghi ah, INT 21h sẽ gọi chạy một số routine tương ứng. Trong phần này chúng ta sẽ quan tâm đến 2 hàm sau đây: FUNCTION NUMBER ROUTINE 1 Single key input 2 Single character output FUNTION 1 : Single key input Input : AH=1 Output : AL= ASCII code if character key is pressed   AL=0 if non character key is pressed Để gọi routine này thực hiện các lệnh sau: mov ah, 1 ; Input key function int 21h ; ASCII code in AL and display character on the screen FUNTION 2: Display a character or execute a control function Input : AH=2   DL=ASCII code of the the display character or control character Output : AL= ASCII code of the the display character or control character Các lệnh sau sẽ in lên màn hình dấu ? mov ah, 2 ; Sử dụng hàm 2 của ngắt 21h mov dl, ‘?’ ; character is ‘?’ int 21h ; display character Hàm 2 cũng có thể  dùng để  thực hiện chức năng điều khiển. Nếu dl chứa ký tự  điều  khiển thì khi gọi INT 21h, ký tự điều khiển sẽ được thực hiện. Các ký tự điều khiển thường dùng là: ASCII code (Hex) SYMBOL FUNCTION 7 BEL beep 8 BS backspace 9 HT tab A LF line feed D CR carriage return 1.7. Chương trình đầu tiên Chúng ta sẽ  viết một chương trình hợp ngữ  nhằm đọc một ký tự  từ  bàn phím và in nó   trên đầu dòng tiếp theo. TITLE PGM1: ECHO PROGRAM .Model Small .Stack 100h .Code Main Proc ; Hiển thị dấu nhắc mov ah, 2 ; Hàm 2: hiển thị một ký tự mov dl, ‘?’ int 21h Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 16
  17. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP ; Nhập một ký tự mov ah, 1 ; Hàm 1: đọc một ký tự từ bàn phím int 21h ; Ký tự đọc được đưa vào trong al mov bl, al ; Cất ký tự trong bl ; Nhảy đến dòng mới mov ah, 2 mov dl, 0dh ; Ký tự carriage return int 21h ; Thực hiện carriage return mov dl, 0ah ; Ký tự line feed int 21h ; Thực hiện line feed ; Hiển thị ký tự mov dl, bl int 21h ; Hiển thị ký tự ; Trở về DOS mov ah, 4ch ; Hàm thoát về DOS int 21h ; exit to DOS Main Endp End Main 1.8. Tạo và chạy một chương trình hợp ngữ Có 4 bước để tạo và chạy một chương trình hợp ngữ là: Dùng một trình soạn thảo văn bản  để  tạo ra tập tin chương trình nguồn (source  program file). Dùng một trình biên dịch (Assembler) để  tạo ra tập tin đối tượng (object file) ngôn   ngữ máy. Dùng trình kết nối LINK (TLINH) để liên kết một hoặc nhiều tập tin đối tượng thành  file thực thi được. Cho thực hiện chương trình *.exe hoặc *.com vừa tạo ra. Bước 1: Tạo ra chương trình nguồn Dùng một trình soạn thảo văn bản (NC chẳng hạn) để tạo ra chương trình nguồn. Ví dụ  lấy tên  là pgm1.asm.  Phần mở  rộng asm  là phần mở  rộng quy  ước   để  Assembler  nhận ra   chương trình nguồn. Bước 2: Biên dịch chương trình Chúng ta sẽ  dùng TASM (Turbo Asssembler) để  chuyển tập tin nguồn pgm1.asm thành  tập tin đối tượng ngôn ngữ máy gọi là pgm1.obj bằng lệnh DOS sau: TASM PGM1;  Sau khi in thông tin về bản quyền TASM sẽ kiểm tra file nguồn để tìm lỗi cú pháp. Nếu  có lỗi thì TASM sẽ in ra số dòng bị lỗi và một mô tả ngắn về lỗi đó. Nếu không có lỗi thì TASM  sẽ  chuyển ogm1.asm thành một tập tin đối tượng ngôn ngữ  máy gọi là  pgm1.obj. Dấu chấm  phảy sau lệnh TASM PGM1 có nghĩa là chúng ta không muốn tạo ta một tập tin đối tượng có tên   khác với PGM1. Nếu không có dấu chấm phảy sau lệnh này thì TASM sẽ  yêu cầu chúng ta gõ  vào tên của một số tập tin mà nó có thể tạo ra như  dưới đây: Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 17
  18. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP Object file name [ PGM1.OBJ]: Source listing [NUL.LIST]: PGM1 Cross­reference [NUL.CRF]: PGM1 Tên mặc định là NUL có nghĩa là không tạo ra file tương  ứng trừ khi người lập trình gõ   vào tên tập tin. Tập tin danh sách nguồn (source listing file): là một tập tin text có đánh số dòng, trong đó   mã hợp ngữ  và mã nguồn nằm cạnh nhau. Tập tin này thường dùng để  gỡ  rối chương trình  nguồn vì TASM thông báo lỗi theo số dòng. Tập tin tham chiếu chéo (cross reference file): là một tập tin chứa danh sách các tên mà  chúng xuất hiện trong chương trình kèm theo số  dòng mà tên  ấy xuất hiện. Tập tin này được  dùng để tìm các biến và nhãn trong một chương trình lớn. Bước 3: Liên kết chương trình Tập tin đối tượng tạo ra  ở  bước 2 là một tập tin ngôn ngữ  máy nhưng nó không chạy   được vì chưa có dạng thích hợp của một file chạy. Hơn nữa nó chưa biết chương trình được  nạp vào vị trí nào trên bộ nhớ để chạy. Một số địa chỉ dưới dạng mã máy có thể bị thiếu. Trình TLINK (linker) sẽ  liên kết một hoặc nhiều file đối tượng (*.obj) thành một file  chạy duy nhất (*.exe). Tập tin này có thể nạp vào bộ nhớ và thi hành. Để liên kết chương trình ta gõ: TLINK PGM1 [/t]; Nếu không có dấu chấm phẩy thì ASM sẽ  yêu cầu chúng ta gõ vào tên tập tin thực thi.   Nếu có tham số /t thì TLINK sẽ tạo ra tập tin chạy là *.com. Bước 4: Chạy chương trình Từ dấu nhắc lệnh có thể chạy chương trình bằng cách gõ tên nó rồi ấn ENTER. 1.8.1. Xuất một chuỗi ký tự Trong chương trình PGM1 trên đây chúng ta đã dùng INT 21h, hàm 2 và 4 để đọc và   xuất một ký tự. Hàm 9, ngắt 21h có thể dùng để xuất một chuỗi ký tự. INT 21H, Function 9: Display a string Input: DX=offset address of string The string must end with a ‘$’ character Ký tự  ‘$’  ở cuối xâu sẽ  không được in lên màn hình. Nếu chuỗi có chứa ký tự  điều  khiển thì chức năng điều khiển tương ứng sẽ được thực hiện. Chúng ta sẽ viết một chương   trình in lên màn hình chuỗi ‘Hello!’. Thông điệp Hello được định nghĩa như  sau trong đoạn   số liệu: Msg db ‘Hello!$’ Lệnh LEA (Load Effective Address) LEA destnation, source Ngắt 21h, hàm 9 sẽ xuất một xâu ký tự ra màn hình với điều kiện địa chỉ  hiệu dụng   của biến xâu phải ở trong dx. Có thể thực hiện điều này bởi lệnh: Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 18
  19. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP lea dx, Msg ; Đưa địa chỉ offset của biến Msg vào dx. Program Segment Prefix (PSP): Phần mào đầu của chương trình. Khi một chương trình được nạp vào bộ  nhớ  máy tính, DOS dành ra 256 byte cho cái   gọi là PSP. PSP chứa một số thông tin về chương trình đang được nạp trong bộ nhớ. Để cho  các chương trình có thể truy xuất tới PSP, DOS đặt một số phân đoạn của nó (PSP) trong cả  DS và ES trước khi thực thi chương trình. Kết quả  là thanh ghi DS không trỏ  đến đoạn dữ  liệu của chương trình. Để khắc phục điều này, một chương trình có chứa đoạn dữ liệu phải   được bắt đầu bởi 2 lệnh sau đây: mov ax, @Data mov ds, ax Ở   đây   @Data   là   tên   của   đoạn  dữ   liệu   được   định   nghĩa   bởi   Data.   Assembler   sẽ  chuyển @Data thành số đoạn (địa chỉ). Sau đây là chương trình hoàn chỉnh để xuất xâu ký tự ‘Hello!’ TITLE PGM2: PRINT STRING PROGRAM .Model Small .Stack 100h .Data msg db ‘Hello!$’ .Code Main Proc ; Initialize DS mov ax, @Data mov ds, ax ; Display message lea dx, msg mov ah, 9 int 21h ; Return to DOS mov ah, 4ch ; Hàm thoát về DOS int 21h ; exit to DOS Main Endp End Main 1.8.2. Chương trình đổi chữ thường sang chữ hoa Chúng ta sẽ  viết một chương trình yêu cầu người sử  dụng gõ vào một ký tự  bằng  chữ thường. Chương trình đổi ký tự đó sang dạng chữ hoa rồi in ra ở dòng tiếp theo. TITLE PGM3: CASE COVERT PROGRAM .Model Small .Stack 100h .Data cr equ 0dh lf equ 0ah msg1 db ‘Enter a lower case letter: $’ Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 19
  20. TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP msg2 db 0dh, 0ah, ‘In upper case it is: $’ char db ?, ‘$’ .Code Main Proc ; Initialize DS mov ax, @Data mov ds, ax ; Print Prompt user lea dx, msg1 ; Thông báo số 1 mov ah, 9 int 21h ; Nhập vào một ký tự thường và đổi nó thành ký tự hoa mov ah, 1 ; Hàm đọc một ký tự int 21h ; Ký tự đọc được trong al sub al, 20h ; Đổi ra chữ hoa mov char, al;Cất ký tự trong biến char ; Xuất ký tự trên dòng tiếp theo lea dx, msg2 ; Lấy thông báo số 2 mov ah, 9 int 21h ; Xuất chuỗi k.tự thứ 2, vì msg2 không kết thúc  ; bởi ‘$’ nên nó tiếp tục xuất ký tự có trong biến ; char ; Return to DOS mov ah, 4ch ; Hàm thoát về DOS int 21h ; exit to DOS Main Endp End Main Nguyễn Tiến Duy ­ Trung tâm Kỹ thuật máy tính ­ Bộ môn Kỹ thuật máy tính 20
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2