Bài giảng Tìm hiểu kiến trúc máy tính

Tài liệu Bài giảng Tìm hiểu kiến trúc máy tính: Kiến trúc máy tính Ch•ơng 1: Hệ thống máy vi tính. I- Giới thiệu: - Một hệ thống máy vi tính (Microcomputer) cơ bản bao gồm các thành phần sau: + Đơn vị hệ thống (System Unit) + Bàn phím, chuột. + Màn hiển thị (Display Screen) + Các ổ đĩa (Disk Drives) - Đơn vị hệ thống th•ờng đ•ợc coi là Máy tính (Computer). Nó chứa các bản mạch của hệ thống máy tính. - Bàn phím, chuột, màn hiển thị th•ờng đ•ợc gọi là thiết bị vào, ra (I/O Devices). Chúng thực hiện các chức năng nhập và xuất của hệ thống. - Mạch tích hợp (Intergrated Circuit "IC") đ•ợc sử dụng để lắp ráp thành các mạch điện tử của máy tính. Mỗi chip IC có thể chứa hàng ngàn transistors. Các IC th•ờng đ•ợc gọi là các mạch điện tử số bởi vì chúng xử lý các mức tín hiệu điện rời rạc (Hiệu điện thế cao, thấp). Chúng ta sử dụng ký hiệu "0" và "1" để biểu diễn các trạng thái thấp và cao của hiệu điện thế. Các ký hiệu trên th•ờng đ•ợc biết nh• là các chữ số nhị phân (Binary Digit hoặc Bit). Các thông tin đ•ợc máy tí...

pdf50 trang | Chia sẻ: hunglv | Lượt xem: 1664 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Bài giảng Tìm hiểu kiến trúc máy tính, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Kiến trúc máy tính Ch•ơng 1: Hệ thống máy vi tính. I- Giới thiệu: - Một hệ thống máy vi tính (Microcomputer) cơ bản bao gồm các thành phần sau: + Đơn vị hệ thống (System Unit) + Bàn phím, chuột. + Màn hiển thị (Display Screen) + Các ổ đĩa (Disk Drives) - Đơn vị hệ thống th•ờng đ•ợc coi là Máy tính (Computer). Nó chứa các bản mạch của hệ thống máy tính. - Bàn phím, chuột, màn hiển thị th•ờng đ•ợc gọi là thiết bị vào, ra (I/O Devices). Chúng thực hiện các chức năng nhập và xuất của hệ thống. - Mạch tích hợp (Intergrated Circuit "IC") đ•ợc sử dụng để lắp ráp thành các mạch điện tử của máy tính. Mỗi chip IC có thể chứa hàng ngàn transistors. Các IC th•ờng đ•ợc gọi là các mạch điện tử số bởi vì chúng xử lý các mức tín hiệu điện rời rạc (Hiệu điện thế cao, thấp). Chúng ta sử dụng ký hiệu "0" và "1" để biểu diễn các trạng thái thấp và cao của hiệu điện thế. Các ký hiệu trên th•ờng đ•ợc biết nh• là các chữ số nhị phân (Binary Digit hoặc Bit). Các thông tin đ•ợc máy tính xử lý đều biểu thị d•ới dạng các dãy số 0 và 1 và đ•ợc gọi là dãy Bit (Bit String). - Theo chức năng, các mạch điện tử của máy tính gồm 3 loại chính: + Đơn vị xử lý trung tâm (Central Processing Unit "CPU"). + Mạch nhớ (Memory Circuit). + Mạch vào ra (I/O Circuit). - Trong hệ thống vi tính, CPU là một chip xử lý đơn và đ•ợc gọi là Vi xử lý (Microprocessor). CPU đ•ợc ví nh• bộ não của máy tính có chức năng điều khiển mọi thao tác trên máy tính. CPU sử dụng mạch nhớ để l•u trữ thông tin, sử dụng các mạch vào ra để liên lạc với các thiết bị vào ra. II- Thiết bị và cấu trúc thiết bị. 1- Bản mạch hệ thống (System Board): - Bản mạch hệ thống là thành phần chính của đơn vị hệ thống, nơi tích hợp bộ vi xử lý, các mạch nhớ và các mạch vào ra. - Bản mạch hệ thống th•ờng đ•ợc gọi là Motherboard/ Mainboard bởi chúng chứa các khe cắm mở rộng (Expansion Slot). Các khe cắm mở rộng cho phép ta kết nối thêm các bản mạch khác (Add-in Boards/ Add-in Cards). Các mạch vào ra có thể nằm trên các bản mạch này hoặc đ•ợc tích hợp sẵn trên bản mạch chính. 2- Bộ nhớ (Memory): - Bytes và Words: This document is created with the unregistered version of Document2PDF Pilot. + Thông tin cần xử lý đ•ợc l•u giữ trong bộ nhớ của máy tính. Các đơn vị của mạch nhớ có thể l•u trữ chỉ 1 bit dữ liệu. Tuy nhiên các mạch nhớ th•ờng đ•ợc tổ chức thành từng nhóm để có thể l•u trữ d•ợc 8 bit dữ liệu, chuỗi 8 bit đ•ợc gọi là 1 Byte. Có một số đ•ợc gọi là địa chỉ (Address) đ•ợc sử dụng để xác định mỗi Byte của bộ nhớ (Memory Byte). Byte đầu tiên đ•ợc gọi là Byte số 0. Dữ liệu đ•ợc chứa trong Byte là nội dung của Byte đó còn đ•ợc gọi là giá trị của Byte (Value). + Việc hiểu rõ và phân biệt giữa Địa chỉ và Nội dung rất quan trọng. Địa chỉ của một byte nhớ là cố định và khác hoàn toàn với các địa chỉ Byte nhớ khác. Nội dung của một Byte nhớ không đồng nhất và có thể thay đổi tuỳ thuộc vào các thao tác l•u trữ. + Trong hệ thống máy vi tính điển hình, 2 Byte đ•ợc ghép lại thành một WORD - Vị trí Bit: Vị trí các bit trong một Byte hoặc một Word th•ờng đ•ợc đánh số từ phải sang trái. Bắt đầu bằng số 0. Các vị trí đ•ợc biểu thị nh• sau: 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - Có 2 loại mạch nhớ chính là RAM (Random Access Memory) và ROM (Read Only Memory) + RAM th•ờng đ•ợc gọi là bộ nhớ chính của máy tính. Các vị trí ô nhớ của RAM có thể cho phép ch•ơng trình đọc (READ) và ghi (WRITE) dữ liệu lên chúng. Các ch•ơng trình và dữ liệu th•ờng đ•ợc nạp vào RAM và nội dung các ô nhớ sẽ bị mất khi RAM bị ng•ng cấp điện. Vì vậy các dữ liệu phải đ•ợc ghi lên bộ l•u trữ ngoài để có thể sử dụng sau này. + ROM Khác với RAM Các dữ liệu trong ROM chỉ đ•ợc truy cập ở mức độ đọc (READ). Vì vậy, khi ROM đ•ợc cập nhật dữ liệu, các dữ liệu đó không bị thay đổi trong quá trình sử dụng. ROM th•ờng đ•ợc nhà sản xuất sử dụng để l•u trữ các ch•ơng trình của hệ thống. ROM có chứa các ch•ơng trình lập trình sẵn đ•ợc gọi là phần "dẻo" Firmware. Loại ROM này có nhiệm vụ tự kiểm tra khi máy tính bật và nạp các ch•ơng trình khởi động từ đĩa. This document is created with the unregistered version of Document2PDF Pilot. 3- Buses: - Bộ xử lý liên lạc với bộ nhớ và các mạch vào ra thông qua tập hợp các dây dẫn điện và kết nối đ•ợc gọi là BUS. Có 3 loại tín hiệu đ•ợc vận chuyển là Địa chỉ, Dữ liệu và Điều khiển t•ơng ứng với 3 lại BUS - Bus địa chỉ, Bus dữ liệu và Bus điều khiển. - Ví dụ: để đọc đ•ợc một giá trị tại một vị trí của bộ nhớ, CPU phải xác định đ•ợc địa chỉ ô nhớ nơi l•u trữ dữ liệu thông qua Bus địa chỉ. Dữ liệu sẽ nhận đ•ợc khi mạch nhớ xác định đ•ợc nơi chứa dữ liệu và truyền qua Bus dữ liệu. Tín hiệu điều khiển đ•ợc yêu cầu thông báo cho bộ nhớ thực hiện thao tác đọc. CPU gởi tín hiệu điều khiển thông qua Bus điều khiển. Hình vẽ sau minh hoạ sự liên quan giữa BUS và các thành phần khác. 4- CPU: - Một CPU điển hình có 2 thành phần chính: + Đơn vị xử lý (Execution Unit "EU") + Đơn vị giao diện BUS (BUS Interface Unit "BIU") a- Đơn vị xử lý: - Công dụng của bộ phận này là thực thi các lệnh. Bộ phận này chứa các mạch đ•ợc gọi là đơn vị xử lý Toán học và Logic (Arithmetic and Logic Unit). ALU có thể điều khiển các phép toán số học và Logic. Dữ liệu của các phép toán đ•ợc l•u trong mạch đ•ợc gọi là Thanh ghi (Registers). Các thanh ghi giống nh• là vị trí của bộ nhớ nh•ng chúng ta th•ờng gọi chúng bằng tên. - Một EU có chứa 8 thanh ghiđ•ợc sử dụng để l•u dữ liệu, tên các thanh ghi nh• sau. + AX, BX, CX, DX, SI, DI, BP và SP + Các thanh ghi tạm thời dùng để l•u các toán hạng cho ALU. + Các thanh ghi cờ (Flag Register). b- Đơn vị giao diện BUS : - BUS Interface Unit có chức năng liên lạc giữa đơn vị xử lý (EU) với Bộ nhớ hoặc mạch vào ra. Nó có nhiệm vụ truyền tín hiệu địa chỉ, dữ liệu và điều This document is created with the unregistered version of Document2PDF Pilot. khiển trên các đ•ờng BUS. - Các thanh ghi CS, DS, ES, SS và IP chứa các địa chỉ của ô nhớ. Thanh ghi IP chứa địa chỉ của lệnh sắp đ•ợc xử lý bởi EU. - EU và BIU luôn làm việc với nhau và đ•ợc kết nối với nhau bằng các BUS nội tại. Trong lúc EU đang thi hành lệnh, BIU sẽ tìm nạp 6 Byte của lệnh tiếp theo vào hàng đợi lệnh. Thao tác này đ•ợc gọi là tìm và nạp lệnh tr•ớc. Mục đích của công việc này là làm tăng tốc độ của CPU. Trong tr•ờng hợp EU cần liên lạc với bộ nhớ hoặc các thành phần khác, BIU sẽ tạm ng•ng công việc nạp lệnh và thi hành công việc cần thiết. This document is created with the unregistered version of Document2PDF Pilot. c- Cổng vào ra: - Các thiết bị vào ra đ•ợc kết nối với máy tính thông qua mạch vào ra. Mỗi mạch chứa nhiều thanh ghi đ•ợc gọi là cổng vào ra. Một số đ•ợc sử dụng cho các dữ liệu, một số khác dùng cho các lệnh điều khiển. Giống nh• vị trí các ô nhớ, các cổng vào ra có các địa chỉ nối với hệ thống BUS, tuy nhiên các địa chỉ này đ•ợc biết nh• là các địa chỉ vào ra và chỉ đ•ợc sử dụng cho các lệnh nhập (Input) và xuất (Output). Điều này giúp CPU phân biệt giữa cổng vào ra và vị trí ô nhớ. - Chức năng của cổng vào ra là liên lạc giữa CPU và các thiết bị vào ra. Dữ liệu nhập từ thiết bị vào ra đ•ợc gửi đến các cổng nơi CPU có thể tìm và đọc chúng. Trong quá trình xuất, CPU ghi dữ liệu vào cổng vào ra, mạch IO có nhiêm vụ chuyển dữ liệu cho thiết bị vào ra. 5- Thi hành lệnh: - Để hiểu các thao tác của CPU, ta khảo sát qua quá trình thi hành lệnh. Câu lệnh mã máy có 2 phần + Opcode: Xác định loại lệnh + Operands: Cung cấp địa chỉ Bộ nhớ nơi l•u trữ dữ liệu sẽ đ•ợc sử dụng để xử lý lệnh. - CPU sẽ thi hành lệnh mã máy bằng 2 b•ớc nh• sau (Chu kỳ tìm nạp, thi hành lệnh "Fetch-Execute Cycle") + Fetch: . Nạp 1 lệnh từ bộ nhớ . Giải mã lệnh để xác định thao tác . Nạp dữ liệu từ bộ nhớ nếu cần. + Execute: . Thực hiện lệnh trên các dữ liệu. . L•u kết quả lên bộ nhớ nếu cần thiết. This document is created with the unregistered version of Document2PDF Pilot. - Ví dụ mô tả: Giả sử ta sử dụng một lệnh cộng (+) nội dung của thanh ghi AX với nội dung của 1 từ (Word) của bộ nhớ tạo địa chỉ 0. CPU thi hành phép cộng tại ALU và l•u kết quả vào Word cũ. Mã lệnh là: 00000001 00000110 00000000 00000000 Tr•ớc khi khảo sát, ta giả định rằng Byte đầu tiên của lệnh đ•ợc l•u tại địa chỉ nào đó đ•ợc xác định bằng thanh ghi IP. Các b•ớc nh• sau: a- Tìm nạp lệnh: Bắt đầu chu kỳ, BIU gửi yêu cầu đọc bộ nhớ trên BUS điều khiển và địa chỉ lệnh lên BUS địa chỉ. Bộ nhớ đáp ứng bằng cách gửi nội dung tại địa chỉ đ•ợc xác định, mã lệnh đ•ợc gửi trên BUS dữ liệu. Mã lệnh có 4 Byte trong khi CPU chỉ đọc đ•ợc 1 Word mỗi lần nên sinh ra 2 thao tác đọc (Read). CPU nhận dữ liệu và cộng 4 vào thanh ghi IP Thanh ghi IP l•u trữ địa chỉ của câu lệnh tiếp theo. b- Giải mã lệnh: Trong quá trình nhận lệnh, mạch giải mã của EU giải mã lệnh và xác định đó là thao tác CộNG (ADD) có liên quan đến Word tại địa chỉ 0. c- Tìm nạp dữ liệu từ bộ nhớ: EU thông tin cho BIU lấy dữ liệu tại Word 0. BIU gửi địa chỉ 0 trên BUS địa chỉ và yêu cầu đọc bộ nhớ qua BUS điều khiển. Nội dung của Word 0 đ•ợc gửi lại EU thông qua BUS dữ liệu và đ•ợc l•u trong thanh ghi của CPU. d- Thực hiện thao tác: Nội dung đ•ợc l•u trữ trong thanh ghi trên và trong thanh ghi AX (Đã đề cập lúc đầu) đ•ợc gửi đến mạch ALU nơi sẽ thực hiện phép tính và đ•a ra kết quả. e- L•u kết quả: EU h•ớng dẫn BIU l•u kết quả tại địa chỉ 0. để làm việc này, BIU gửi yêu cầu ghi trên BUS điều khiển, địa chỉ 0 trên BUS địa chỉ và kết quả phép tính trên BUS dữ liệu. Nội dung cũ của Word 0 bị ghi đè bằng kết quả mới. Chu kỳ sẽ đ•ợc lặp lại cho lệnh tiếp theo mà địa chỉ đã đ•ợc l•u trong thanh ghi IP. 6- Đồng hồ hệ thống (Timming): - Ví dụ trên chỉ ra rằng mặc dù các lệnh vô cùng đơn giản nh•ng quá trình thực thi lại quá phức tạp. Để bảo đảm các b•ớc đ•ợc thi hành đúng tuần tự, mạch điều khiển đồng hồ (CLOCK) điều khiển bộ xử lý bằng cách sinh ra chuỗi xung nhịp. Khoảng ngắt giữa 2 xung đ•ợc gọi là chu kỳ (Period). Số l•ợng xung trong khoảng thời gian 1 giây đ•ợc gọi là Tốc độ đồng hồ (Clock Rate hoặc Clock Speed) và đ•ợc tính bằng đơn vị MegaHertz (MHz). Tốc độ nguyên bản của IBM PC là 4.77 MHz, các máy tính hiện nay đã là 3060 MHz và còn nhanh hơn nữa. This document is created with the unregistered version of Document2PDF Pilot. - Các mạch của máy tính đ•ợc kích hoạt bằng xung đồng hồ, đồng nghĩa với việc các mạch chỉ thực hiện lệnh khi đ•ợc cấp xung. Mỗi b•ớc trong việc tìm nạp và thi hành lệnh đều yêu cầu 1 hay nhiều xung. 7- Ngôn ngữ lập trình (Programming Language): - Các thao tác với phần cứng máy tính dều đ•ợc điều khiển bởi các phần mềm. Khi máy tính đ•ợc bật, nó luôn trong tiến trình xử lý các lệnh. Vậy các lệnh diều khiển là gì? đó là vấn đề chúng ta cần khảo sát. a- Ngôn ngữ máy (Machine Language): + CPU chỉ thực thi đ•ợc các lệnh theo ngôn ngữ máy, đó dãy các bit. D•ới đây là một ví dụ về mã lệnh theo ngôn ngữ máy dành cho IBM PC. Lệnh mã máy Chức năng 10100001 00000000 00000000 Tìm nạp nội dung Word 0 và đ•a vào thanh ghi AX 00000101 00000100 00000000 Cộng (Add) 4 vào AX 10100011 00000000 00000000 L•u tổng (Kết quả) nội dung của AX vào Word 0. Rất khó nhớ và dễ dàng mắc sai lầm khi lập trình theo ngôn ngữ kiểu này. b- Ngôn ngữ Assembly: + Ngôn ngữ sử dụng tiện lợi hơn là Assembly. Trong ngôn ngữ này, ta dùng các tên theo ký hiệu để trình bày lệnh, thanh ghi, và địa chỉ bộ nhớ. Nếu Word 0 là A thì đoạn mã lệnh dề cập tr•ớc sẽ đ•ợc trình bày nh• sau: Lệnh mã Assembly Chú thích MOV AX,A ; Nạp nội dung địa chỉ A của bộ nhớvà đ•a vào thanh ghi AX ADD AX,4 ;Cộng 4 vào AX MOV A,AX ;Chuyển (L•u) kết quả trong AX vào địa chỉ A của bộ nhớ. Mỗi ch•ơng trình trong ngôn ngữ này phải đ•ợc dịch qua ngôn ngữ máy tr•ớc khi CPU có thể thực hiện. 1 ch•ơng trình dịch lệnh sẽ dịch mỗi phát biểu lệnh thành một lệnh máy đơn. c- Ngôn ngữ bậc cao: + Mặc dù ngôn ngữ Assembly có vẻ dễ hiểu, dễ viết hơn nh•ng ngôn ngữ này vẫn quá khó để kiểm soát bởi cả một chuỗi lệnh và các tên lệnh phải nhớ. Chúng chẳng thân thiện với ngôn ngữ ta vẫn dùng hàng ngày. Chính vì vậy một số ngôn ngữ bậc cao đã đ•ợc thiết kế và phát triển. Ta có thể nghe thấy nhiều loại ngôn ngữ lập trình trong thể ghới của máy tính nh•: FORTRAN, Pascal, C, C++… Về cơ bản, mỗi loại ngôn ngữ đ•ợc thiết kế cho các ứng dụng khác nhau nh•ng có điểm chung nhất là gần với ngôn ngữ tự nhiên của con ng•ời (Nhất là các dân tộc sử dụng tiếng Anh!!!). + Để máy tính có thể xử lý đ•ợc các lệnh phải có các ch•ơngtrình biên dịch (Compiler) các ch•ơng trình biên dịch phải thao tác rất nhiều để có thể This document is created with the unregistered version of Document2PDF Pilot. dịch một lệnh ra thành mã máy bởi các ngôn ngữ có độ phức tạp cao. Mỗi một lệnh của ngôn ngữ lập trình bậc cao th•ờng đ•ợc dịch thành nhiều lệnh mã máy. + Đôi khi ta vẫn phải sử dụng các đoạn mã dạng Assembly để xử lý một vấn đề nào đó. Điều này th•ơng xảy ra khi ta quan tâm đến tốc độ và sự đơn giản của ch•ơng trình. Ví dụ: Các thao tác đọc/ ghi các địa chỉ bộ nhớ hoặc truy xuất các địa chỉ vào ra. d- Một đoạn ch•ơng trình đơn giản: Cung cấp khái niệm về ngôn ngữ lập trình Assembly và cách CPU xử lý lệnh: Ch•ơng trình 1: Prog01.asm This document is created with the unregistered version of Document2PDF Pilot. III- Kết luận - Để hiểu đ•ợc kiến trúc của máy tính là một vấn đề hoàn toàn không đơn giản, ngoài các kiến thức đ•ợc cung cấp một cách cơ bản, chúng ta cần phải tham khảo thêm trong quá trình sử dụng, bảo trì hệ thống máy tính, tham khảo các sách h•ớng dẫn. - Bài đầu tiên này cung cấp một số kiến thức cơ bản về cốt lõi của hệ thống máy tính, cách thức xử lý của CPU. Một ngôn ngữ đặc tả hoạt động của hệ thống rõ nhất (Nh•ng không dễ hiểu). - Các vấn đề cần quan tâm nhất trong bài đầu tiên. + Các thành phần của máy tính nhìn d•ới góc độ kỹ thuật. + Main Board + Bộ nhớ (Memory). + Đ•ờng truyền dữ liệu (BUSES). + Cấu trúc CPU. + Chu kỳ th•c hiện lệnh + Ngôn ngữ lập trình. Phụ lục 1: * BUS dữ liệu và BUS địa chỉ: This document is created with the unregistered version of Document2PDF Pilot. Ch•ơng 2: Hệ thống máy tính cá nhân IBM I- Giới thiệu họ vi xử lý: - Hệ thống máy tính cá nhân bao gồm IBM PC, PC XT, PC AT, PS/1, và PS/2. - Các hệ thống trên đều đ•ợc thiết kế dựa trên họ của bộ xử lý Intel 8086 bao gồm 8086/ 8088, 80186, 80188, 80286, 80386, 80386SX, 80486, 80486SX - Các hệ thống hiện nay của IBM và t•ơng thích IBM đều dùng các bộ xử lý của Intel từ Pentium, Pentium II, Pentium III, Pentium IV.. - Tốc độ xử lý của Bộ xử lý tăng rất nhanh từ 4.77 MHz ở những bộ xử lý 8086/ 8088 cho đến hiện nay là 3060 MHz. II- Cấu trúc điển hình của bộ xử lý 1- Tổ chức cấu trúc trong bộ xử lý: - Thông tin trong bộ vi xử lý đ•ợc l•u trong các thanh ghi (Registers). Các thanh ghi đ•ợc phân loại dựa vào các chức năng mà chúng thực hiện. Nói một cách tổng quát, các thanh ghi dữ liệu l•u trữ dữ liệu của lệnh, các thanh ghi địa chỉ l•u trữ địa chỉ của lệnh hoặc dữ liệu, các thanh ghi trạng thái l•u trữ trạng thái hiện tại của bộ xử lý. - Hệ thống chuẩn 8086 đ•ợc thiết kế các thanh ghi nh• sau: + 4 thanh ghi dữ liệu AX, BX, CX, DX. + 4 thanh ghi đoạn CS, DS, SS, ES + 5 thanh ghi địa chỉ SI, DI, SP, BP, IP. + 1 thanh ghi trạng thái (Flag) Tổng cộng gồm có 14 thanh ghi, mỗi thanh ghi có độ dài là 16 bit hay còn đ•ợc gọi là 1 Word Bộ xử lý 16 bit. Các bộ xử lý sau này sử dụng thanh ghi có độ dài 32 bit Bộ xử lý 32 bit… - Các thanh ghi của CPU đ•ợc biêủ diễn nh• sau: E AH AL E BH BL E CH CL E DH DL E SP E BP E SI E DI E IP E FLAG CS DS SS ES This document is created with the unregistered version of Document2PDF Pilot. FS GS 2- Các thanh ghi dữ liệu (Data Register). - Mặc dù bộ xử lý có thể thao tác với các dữ liệu đ•ợc l•u trữ trong bộ nhớ nh•ng để có thể làm việc đ•ợc nhanh hơn, bộ xử lý phải dụng các dữ liệu có sẵn trong các thanh ghi. Đây cúng chính là lý do mà các bộ xử lý về sau cang có khuynh h•ớng đ•ợc thiết kế vói nhiều thanh ghi hơn. 4 thanh ghi đ•ợc thiết kế để thao tác với dữ liệu chung - Các thanh ghi công dụng chung (Còn đ•ợc gọi là các thanh ghi dữ liệu "Data Register"): ký hiệu là AX, BX, CX, DX đ•ợc sử dụng để l•u trữ các kết quả tính toán. + Thanh ghi AX (Accumulator Register): Đ•ợc sử dụng cho các chỉ thị Số học, Logic và chuyển dữ liệu. Thanh ghi này sinh ra các mã lệnh ngắn nhất.Trong các phép tính nhân và chia, một trong các số có liên quan phải đ•ợc l•u trong AX hoặc AL. Các thao tác nhập hoặc xuất cũng đ•ợc yêu cầu phải sử dụng AL và AX. + Thanh ghi BX (Base Register): Dùng để tính toán các địa chỉ. + Thanh ghi CX (Count Register): Th•ờng đóng vai trò tính toán số vòng lặp trong ch•ơng trình. + Thanh ghi DX (Data Register): Th•ờng đ•ợc sử dụng cho các phép toán nhân và chia. Thanh ghi này cúng đ•ợc sử dụng cho các thao tác vào ra, xác định địa chỉ dữ liệu. E AH AL E BH BL E CH CL E DH DL + Đối với các bộ xử lý Pentium trở lên, các thanh ghi đ•ợc thiết kế sử dụng 32 bit. Tên gọi của các thanh ghi đ•ợc thay đổi chút ít AX EAX (ExtraAX)… 3- Các thanh ghi đoạn (Segment Register): - Các thanh ghi đoạn đ•ợc tổ chức để tính toán địa chỉ của các khối bộ nhớ. Các thanh ghi đoạn trỏ đến địa chỉ đầu của đoạn bộ nhớ: + Thanh ghi mã đoạn CS (Code Segment ): + Thanh ghi đoạn dữ liệu DS (Data Segment): + Thanh ghi EX (Extra Segment): + Thanh ghi Ngăn xếp SS (Stack Segment): CS DS SS ES - Để hiểu rõ công dụng của các thanh ghi đoạn này, ta cần khảo sát đến cách tổ This document is created with the unregistered version of Document2PDF Pilot. chức bộ nhớ. - Bộ nhớ là tập hợp của các Byte, mỗi Byte bộ nhớ đều có một địa chỉ nhất định và đ•ợc bắt đầu bằng 0. Bộ xử lý 8086 có thể gán 20 địa chỉ vật lý cho các địa chỉ bộ nhớ (20 bits BUS địa chỉ). Do đó khả năng đánh địa chỉ bộ nhớ là 220 = 1,048,576 Bytes (1 MB). 5 Bytes đầu tiên có các địa chỉ nh• sau (Tính theo hệ thập lục phân): 00000h 00001h 00002h 00003h 00004h ............ Địa chỉ cuối cùng là FFFFFh (1111 1111 1111 1111 1111 B) + Đoạn bộ nhớ (MemorySegments): . Mỗi đoạn bộ nhớ là môt khối gồm 216 Bytes (64 KB).Mỗi đoạn đ•ợc xác định bằng số hiệu đoạn bắt đầu bằng 0. Số hiệu Segment là 16 bit giá trị cao nhất là FFFFh. . Bên trong của Segment, vị trí của ô nhớ đ•ợc xác định bằng độ dời (Offset). Đây là số l•ợng Byte đ•ợc tính từ đầu mỗi Segment. Với 64 KB Segment, độ dời (Offset) có thể xác định bằng 1 số 16 bit. Byte đầu tiên của Segment có độ dời là 0. Byte cuối cùng là FFFFh. + Địa chỉ Segment:Offset: 1 vị trí của ô nhớ có thể xác định bằng số hiệu Segment và độ dời đ•ợc biểu diễn d•ới dạng "Segment:Offset" và đ•ợc coi nh• là địa chỉ Logic. Ví dụ: A4FB:4872h có nghĩa độ dời 4872h bên trong Segment có số hiệu A4FB. Để đạt đ•ợc 20 bit địa chỉ vật lý, bộ vi xử lý 8086 phải dịch địa chỉ segment 4 bits về bên trái (nhân với 10h) sau đó cộng độ dời địa chỉ vật lý của bộ nhớ sẽ là: A4FB x 10h A4FB0h + 4872h A9822h 20 bit địa chỉ vật lý + Vị trí của các Segments: * Segment 0 đ•ợc bắt đầu = 0 0000:0000 = 00000h và kết thúc tại 0000:FFFF= 0FFFFh * Segment 1 đ•ợc bắt đầu = 1 0001:0000 = 00010h và kết thúc tại 0001:FFFF= 1000Fh Các Segment bắt đầu cho mỗi 16 Bytes (10h) và địa chỉ chỉ bắt đầu của Segment luôn kết thúc với chữ số thập lục phân là 0. Ta gọi 16 Bytes này là 1 đoạn (Paragraph) giống nh• một đoạn văn. Ta có thể coi 1 địa chỉ chia hết cho 16 (Kết thúc với số HEX 0) là đ•ờng biên của đoạn (Boundary). Các segment có thể chồng mép lên nhau nên định dạng Segment:Offset là không nhất định. Khảo sát các ví dụ sau: Ví dụ 1: Tại vị trí bộ nhớ có địa chỉ vật lý đ•ợc xác định là 1256Ah, xác định địa chỉ dạng Segment:Offset cho Segment 1240h Giải quyết: . Đặt X là Offset trong Segment 1256Ah This document is created with the unregistered version of Document2PDF Pilot. . Đặt Y là Offset trong Segment 1240h Ta có: . 1256Ah=12560h + X . 1256Ah=12400h + Y X=1256Ah - 12560h = Ah và Y=1256Ah - 12400h = 16Ah 1256Ah =1256:000A = 1240:016A Ta cũng có thể tính toán số hiệu Segment khi có đ•ợc địa chỉ vật lý và Offset Ví dụ 2: Vị trí bộ nhớ có địa chỉ vật lý 80FD2h, tìm Segment có Offset là BFD2h. Giải quyết: Ta đã biết: Địa chỉ vật lý = Segment x 10h + Offset Segment x 10h = Địa chỉ vật lý - Offset. Vậy ta có thể tính toán: Địa chỉ vật lý = 80FD2h - Offset = BFD2h Segment x 10h = 75000h Vậy Segment phải là: 7500h + Đoạn của ch•ơng trình (Program Segments): . Các ch•ơng trình đ•ợc lập trình bằng ngôn ngữ máy tínhchứa các chỉ thị (Code) và dữ liệu. Bao gồm cả Cấu trúc của dữ liệu (Data Structure) đ•ợc gọi là Stack (Ngăn xếp) đ•ợc sử dụng bởi bộ xử lý để thực hiện việc gọi các thủ tục. . Mã ch•ơng trình, dữ liệu và ngăn xếp đ•ợc nạp vào các đoạn bộ nhớ (Memory Segments) khác nhau có các thanh ghi mang tên t•ơng tự. CS (Code Sement), DS (Data Segment), SS (Stack Segment). Khi cần thao tác với dữ liệu bộ xử lý có thể sử dụng thêm thanh ghi ES (Extra Segment). . Một đoạn ch•ơng trình không cần phải chiếm hết 1 đoạn 64 KB của bộ nhớ, nhiều đoạn ch•ơng trình có thể nằm gối đầu lên nhau do đó ta có các Số hiệu Segment và các đoạn ch•ơng trình tại các vị trí t•ơng đối. . Tại một thời điểm xác định, chỉ có các vị trí bộ nhớ đ•ợc đánh địa chỉ bởi 4 thanh ghi đoạn mới có thể truy cập. Do đó, chỉ có 4 đoạn bộ nhớ đ•ợc hoạt động. Tuy nhiên, nội dung của một thanh ghi đoạn có thể đ•ợc cập nhật, thay đổi bởi ch•ơng trình để đánh địa chỉ các Segment khác nhau. 4- Các thanh ghi con trỏ và các thanh ghi chỉ số (Pointer và Index Register): - Các thanh ghi con trỏ và chỉ số th•ờng trỏ đến vị trí của ô nhớ (Chứa địa chỉ Offset). Khác với các thanh ghi đoạn (Segment), các thanh ghi con trỏ và chỉ số có thể sử dụng để tính toán các phép tính số học và một số thao tác khác. - Các thanh ghi con trỏ và chỉ số bao gồm: SP (Stack Pointer), BP (Base Pointer), IP Instruction Ponter, SI (Source Index), DI (Destination Index), Các thanh ghi cờ (Flag Register). This document is created with the unregistered version of Document2PDF Pilot. E SP E BP E SI E DI E IP E FLAG + Thanh ghi SP sử dụng kết hợp với thanh ghi SS để truy cập Stack Segment. + Thanh ghi BP đ•ợc sử dụng để truy cập dữ liệu tại Stack, có thể sử dụng để truy cập Segment khác. + Thanh ghi SI trỏ đến vị trí bộ nhớ của Data Segment đ•ợc đánh địa chỉ bởi DS. Khi tăng giá trị của SI, ta có thể truy cập các vị trí bộ nhớ khác. + Thanh ghi DI cùng chức năng nh• thanh ghi SI. Có 1 tập hợp các lệnh đ•ợc gọi là chuỗi lệnh sử dụng thanh ghi DI để truy cập vào các địa chỉ bộ nhớ đ•ợc đánh địa chỉ bởi thanh ghi ES. + Thanh ghi IP để truy cập các lệnh. Bộ xử lý sử dụng các thanh ghi CS, IP. Thanh ghi CS chứa số hiệu Sement của lệnh tiếp theo, thanh ghi IP chứa Offset đ•ợc cập nhật mỗi khi 1 lệnh đ•ợc thi hành với mục đích trỏ đến câu lệnh kế tiếp. Không giống các thanh ghi khác, thanh ghi IP không thể điều khiển trực tiếp bằng lệnh 1 câu lệnh không thể coi IP nh• một toán hạng (Operand). + Thanh ghi trạng thái (Flag) th•ợc thiết kế để biểu thị trạng thái của bộ vi xử lý. Các bit của thanh ghi Flag đ•ợc xử lý riêng lẻ. Có 2 loại cờ: Trạng thái (Status Flag) và điều khiển (Control Flag). . Các cờ trạng thái (Status Register) mô tả kết quả của lệnh đ•ợc xử lý. Ví dụ khi phép trừ cho ra kết quả 0, cờ ZF cho giá trị 1 (True). . Các cờ điều khiển (Contrl Flag) cho phép hoăc không cho phép các thao tác nhất định của bộ xử lý. Ví dụ: nếu cờ ngắt (IF " Interrupt Flag") đ•ợc xoá (= 0), việc nhập từ bàn phím bị bộ xử lý lờ đi. 11 10 9 8 7 6 4 2 0 . 0 Carry . 2 Parity . 4 Auxilary Carry . 6 Zero . 7 . 8 Trace . 9 Interrupt .10 Direction .11 Overflow Các bit còn lại không sử dụng. 5- Tổ chức một máy tính cá nhân - Máy tính luôn đ•ợc xây dựng trên 2 phần cơ bản là phần cứng (Hardware) và This document is created with the unregistered version of Document2PDF Pilot. phần mềm (Software). Trong đó phần mềm điều khiển các thao tác của phần cứng. Để hiểu đ•ợc các thao tác của phần cứng, chùng ta nên tìm hiểu phần mềm điều khiển máy tính nh• thế nào?. a- Hệ điều hành (Operating System): + Phần mềm quan trọng nhất cho máy tính là hệ điều hành. Mục đích chính của hệ điều hành là xác định việc điều khiển tất cả các thiết bị cấu hình thành một máy tính. Các chức năng chính của hệ điều hành là: . Đọc và thi hành các lệnh đ•ợc đ•a ra bởi ng•ời dùng. . Thực hiện các điều khiển vào ra. . Đ•a ra các thông báo lỗi. . Quản lý bộ nhớ và các tài nguyên khác. + Tại thời điểm hiện tại, các hệ điều hành đang đ•ợc sử dụng thông dụng là các hệ điều hành Windows. Nh•ng để dễ hiểu và dễ sử dụng, chúng ta khảo sát ch•ơng trình bằng hệ điều hành MS DOS trên các hệ thống máy tính dựa vào cấu trúc chuẩn của bộ xử lý 8086/8088. + Một trong các chức năng chính của hệ điều hành DOS là các thao tác đọc ghi đĩa. Ch•ơng trình và các thông tin đ•ợc l•u trên đĩa d•ới dạng File. Ví dụ điển hình là File Command .com với phần tên file là Command và phần mở rộng là com. + Các ch•ơng trình đ•ợc l•u trên đĩa, nên khi máy tính đ•ợc bật và các ch•ơng trình muốn chạy đ•ợc phải đ•ợc truy xuất từ đĩa. Có 1 phần ch•ơng trình hệ thống đ•ợc nạp sẵn trong ROM th•ờng đ•ợc gọi là tiểu trình BIOS (Basic Input/ Output System routines). b- BIOS: + Ch•ơng trình của BIOS điều khiển việc nhập/ xuất (I/O) của máy tính. Mỗi loại máy tính có cấu hình phần cứng riêng do đó các ch•ơng trình BIOS phải t•ơng thích vói hệ thống đó. Điều này liên quan mật thiết đến các mạch vào ra của hệ thống. Các lệnh vào ra của DOS đều đ•ợc thực hiện bởi các ch•ơng trình của BIOS + Chức năng quan trọng khác của BIOS là kiểm tra các mạch và nạp hệ điều hành. 6- Tổ chức bộ nhớ của máy tính cá nhân - Các ch•ơng trình ứng dụng có thể sử dụng rất nhiều bộ nhớ. Tuy nhiên một vài vị trí của bộ nhớ chứa các thông tin dành cho bộ xử lý. Ví dụ 1 KB đầu tiên dành cho bảng Vector ngắt Địa chỉ (00000 003FFh). - Các vị trí khác khác có thể đ•ợc sử dụng cho các mục đích đặc biệt nh• các tiểu trình của BIOS, Bộ nhớ hiển thị (Video Memory). Bộ nhớ hiển thị l•u trữ các dữ liệu sẽ đ•ợc gửi đến màn hình. Để có thể xem đ•ợc các thông tin về màn hình, cách tốt nhất là chia bộ nhớ thành nhiều đoạn khác nhau thành các Segment rời rạc. Bắt đầu từ Sement 0 kết thúc bằng địa chỉ 0FFFFh, địa chỉ kế tiếp sẽ là 10000h = 1000:000T•ơng tự nh• vậy, Kết thúc của Segment này là 1FFFFh và cứ tiếp tục nh• vậy. - Bộ nhớ có thể đ•ợc chia nh• sau: This document is created with the unregistered version of Document2PDF Pilot. 7- Các cổng vào ra thông dụng của máy tính cá nhân (I/O Ports) - Một số địa chỉ cổng thông dụng của PC có thể đ•ợc liệt kê nh• sau. Trên các hệ thống máy tính sử dụng Windows có thể dùng công cụ System Information để xem thông tin chi tiết về các cổng này. Stt Địa chỉ cổng Mô tả 1 20h - 21h Điều khiển ngắt 2 60h - 63h Điều khiển bàn phím 3 200h - 20Fh Điều khiển Game 4 2F8h - 2FFh Cổng tuần tự (COM 2) 5 320h - 32Fh ổ cứng 6 378h - 37Fh Cổng song song (LPT 1) 7 3C0h - 3CFh Màn hình EGA 8 3D0h - 3DFh Màn hình CGA 9 3F8h - 3FFh Cổng tuần tự (COM1) 8- Quá trình khởi động. - Khi máy tính đ•ợc cấp điện, bộ xử lý đ•ợc đặt trong trạng thái khởi động, Thanh ghi CS đ•ợc đặt là FFFFh, thanh ghi IP đ•ợc đặt 0000h lệnh đầu tiên đ•ợc xử lý vùng nhớ FFFF0h. vị trí này dành cho ROM BIOS và chứa lệnh nhảy về địa ch•ơng trình khởi động máy tính của BIOS. Sau đó quá trình tiếp tục cho tới khi hệ điều hành đ•ợc nạp. This document is created with the unregistered version of Document2PDF Pilot. Chýừng 3: Ngôn ngữ Assembly I- Cấu trúc lệnh 1- Cú pháp lệnh - Ch•ơng trình chứa nhiều phát biểu lệnh, mỗi phát biểu lệnh nằm trên 1 dòng. Mỗi phát biểu lệnh có thể là mọtt lệnh đ•ợc dịch hoặc xử lý trực tiếp. Các câu lệnh cần đ•ợc phát biểu theo một dạng (Cú pháp lệnh) nh• sau: Name Operation Operand (s) ;Comment Tên Toán tử Toán hạng ;Giải thích + Ví dụ: Start Mov CX, 5 ;Khoi tao bo đem. . Name: START đ•ợc coi nh• một nhãn. . Operation: Mov . Operand: CX và 5 . Comment: Khoi tao bo dem - Mô tả chi tiết các tr•ờng (Field) + Tr•ờng Name: Sử dụng cho các lênh đặt nhãn, các tên thủ tục hoặc biến.Trình dịch lệnh dịch các tên nh• là địa chỉ của bộ nhớ. Tên có thể đ•ợc đặt có độ dài ttói đa 31 ký tự, có thể chứa chữ, chữ số và các ký tự dặc biệt nh• ? . @ _ & %. Không đ•ợc chứa các khoảng trắng. Nếu dấu chấm đ•ợc sử dụng thì phải đứng đầu tiên. Không phân biệt chữ in hoa hoặc chữ th•ờng. . Ví dụ các tên hợp lệ: Bodem01 @Kytu Tong_2_so $1000 OK? .Test . Ví dụ các tên không hợp lệ Hai Nguoi ; Có khoảng trắng 2AnhEm ; Bắt đầu bằng số A32.77 ; Dấu chấm không ở đầu. + Tr•ờng Operation: Trong mỗi lệnh, Tr•ờng Operation chứa Mã điều khiển dạng biểu t•ợng (Opcode). Trình dịch sẽ dịch mã trên thành mã theo ngôn ngữ máy. Các ký hiệu th•ờng mô tả chức năng của lệnh, ví dụ nh•: MOV, ADD, SUB… + Tr•ờng Operand: Trong mỗi lệnh , tr•ờng này xác định dữ liệu sẽ đ•ợc xử lý bởi các Operatión. Các câu lệnh có thể có 0, 1, hoặc 2 Operand. Ví dụ: NOP ; Khong Operand. INC AX ; 1 Operand . ADD WORD1, 2 ; 2 Operands. + Tr•ờng Comment: Sử dụng để chú thích, làm rõ các câu lệnh. Các câu chú thích đ•ợc bắt đầu là dấu ; . ví dụ: Mov AX, 0 ; Khoi tao thanh ghi AX = 0. Hoặc: This document is created with the unregistered version of Document2PDF Pilot. ; Khoi tao cac thanh ghi AX, BX Mov AX, 0 Mov BX, 0 2- Dữ liệu ch•ơng trình: - Bộ xử lý chỉ thao tác đ•ợc với các dữ liệu Binary, do đó trình dịch phải dịch tất cả dữ liệu thành các số Binary.. Tuy nhiên, trong các ch•ơng trình dung ngôn ngữ Assembly ta có thể biểu diễn các dữ liệu là Binary, Decimal, Hexa Decimal, và ngay cả các ký tự. - Dữ liệu chữ số: + các chữ số Binary đ•ợc biểu diễn nh• một chuỗi các bit và kết thúc bằng ký tự B hoặc b ví dụ nh• "1001b". T•ơng tự, các dạng chữ số decimal có thể kết thúc bằng ký tự D hoặc d. + Các chữ số d•ới dạng Hex phải đ•ợc bắt đầu bằng một chữ số thập phân (Decimal) và kết thúc bằng ký tự H hoặc h, Ví dụ "0ABCDh" Chữ số 0 đầu tiên, ký tự H sau cùng. + các ví dụ sau biểu diễn các các khai báo số hợp lệ trong ch•ơng trình: Chữ số Loại dữ liệu 10101 Decimal 10101b Binary 3256 Decimal -2453 Decimal 1,432 Không hợp lệ vì có chứa ký tự không phải là ký tự số 1B2Dh Hex 2B6C Không hợp lệ vì không kết thúc bằng ký tự H FEEEH Không hợp lệ vì không bắt đầu bằng ký tự số 0FFFFH Hex - Dữ liệu ký tự: Các ký tự và chuỗi ký tự phải đ•ợc biểu diễn nằm trong cặp dấu nháy đơn '..' Hoặc nháy kép "..", ví dụ "A" hoặc 'hello'. Các ký tự đ•ợc biên dịch sang hệ thống mã ASCII bởi ch•ơng trình dịch, vì vậy không có gì la khác nhau giữa cách biểu diễn "A" và 41H (Mã ASCII của A) - Các biểu diễn dữ liệu quy •ớc: Quy •ớc Đại diện cho DB Define Byte DW Define Word DD Define Doubleword (Dãy 2 Words) DQ Define Quadword (Dãy 4 Words) DT Define Ten Byte (Dãy 10 Bytes) 3- Biến: Các biến trong ngôn ngữ bậc thấp đóng vai trò nh• các biến trong các ngôn ngữ lập trình bậc cao. Mỗi biến dều có kiểu dữ liệu riêng và đ•ợc gán một vị trí bộ nhớ nào đó bởi ch•ơng trình. Các loại biến nh• sau: - Biến Byte (Byte Variables): Khai báo biến theo định dạng nh• sau: Name DB Initial value Tên biến Kiểu biến Giá trị khởi tạo Ví dụ khai báo: This document is created with the unregistered version of Document2PDF Pilot. Alpha DB 4 Ch•ơng trình sẽ tổ chức 1 byte bộ nhớ đặt tên là Alpha, khởi tạo dữ liệu trong bộ nhớ là 4. Nếu không cần khởi tạo dữ liệu tr•ớc, ta chỉ cần thay đổi một chút trong khai báo nh• sau: Alpha DB ? Dấu "?" để thay thế cho dữ liệu cần khởi tạo. Giới hạn khai báo của biền loại này theo giá trị Decimal: -128 137 nếu sử dụng các số có dấu. 0 255 nếu sử dụng số không dấu. - Biến Word (Word Variables): Khai báo biến theo định dạng nh• sau: Name DW Initial value Tên biến Kiểu biến Giá trị khởi tạo Ví dụ khai báo: Alpha DB -4 Ch•ơng trình sẽ tổ chức 2 bytes bộ nhớ để sử dụng cho loại biến này. Giới hạn sử dụng theo giá trị Decimal: - 32768 32767 nếu sử dụng các số có dấu. 0 65535 nếu sử dụng các số không dấu. - Biến mảng (Array Variables): Trong ngôn ngữ Assembly, một mảng là một dãy các bytes hoặc words bộ nhớ. Ví dụ nh• ta định nghĩa một mảng gồm 3 Bytes với các giá trị khởi tạo lần l•ợt là 10h, 20h, 30h: B_Array DB 10h,20h,30h B_Array là Byte đầu tiên, B_Array +1 là Byte thứ 2 và B_Array + 2 là Byte thứ ba. Nếu ch•ơng trình tổ chức địa chỉ 200h cho biến, bộ nhớ sẽ đ•ợc phân bố nh• sau: Địa chỉ Nội dung bộ nhớ B_Array 200h 10h B_Array + 1 201h 20h B_Array + 2 202h 30h T•ơng tự nh• trên, một mảng kiểu Word đ•ợc phân bố nh• sau: W_Array DW 1000,40,29870,323 Địa chỉ Nội dung bộ nhớ W_Array 0300h 1000d W_Array + 1 0302h 40d W_Array + 2 0304h 29870d W_Array + 3 0306h 323d - Byte thấp và Byte cao của Word. Đôi khi ta chỉ cần sử dụng Byte cao hoặc byte thấp trong một biến dạng Word. Ví dụ ta khai báo nh• sau: Word01 DW 1234h Byte thấp chứa giá trị 34h, Byte cao chứa giá trị 12h. - Chuỗi ký tự (Character Strings): Một mảng các mã ASCII có thể đ•ợc khởi tạo với một chuỗi các ký tự. Ví dụ nh• sau: Letters DB 'ABC' Cũng có thể đ•ợc khai báo nh• sau: Letters DB 41h,42h,43h This document is created with the unregistered version of Document2PDF Pilot. Trong một chuỗi, ch•ơng trình dịch phân biệt giữa các ký tự chữ hoa và chữ th•ờng. Do đó 'ABC' (41h,42h,43h) sẽ khác với 'abc' (61h,62h,63h). ta có thể khai báo kết hợp cả ký tự chữ cái và ký tự số chung một biến: Mess DB 'Hello',0Ah,0Dh,'$' T•ơng đ•ơng: Mess DB 48h,45h,4Ch,4Ch,4Fh,0Ah,0Dh24h - Hằng số đ•ợc định nghĩa (named Constants): Nhằm mục đích để mã ch•ơng trình dễ hiểu hơn, ta th•ờng khai báo một số hằng số cố định. Để khai báo hằng số, ta sử dụng từ khoá EQU, Cú pháp nh• sau: Name EQU Constant Tên t•ơng đ•ơng Hằng số Ví dụ: LF EQU 0Ah Giải thích: Ta dùng tên LF cho giá trị 0Ah, Mã ASCII của 0Ah là Line Feed (Xuống dòng). Tên LF có thể dùng để thay thế cho 0Ah bất cứ chỗ nào trong ch•ơng trình. Hai câu lệnh sau là t•ơng đ•ơng: Mov DL,0Ah ;và Mov DL,LF 4- Một số lệnh cơ bản Có hàng trăm lệnh trong bộ lệnh của CPU, chúng cũng đ•ợc thiết kế thêm cho các loại CPU về sau này. Trong phần này, chúng ta chỉ quan tâm đến một số lệnh thông dụng nhất đ•ợc sử dụng để di chuyển dữ liệu và một số tính toán số học. Các mô tả d•ới đây sử dụng các từ Word01, Word02 nh• biến kiểu Word, Byte01, Byte02 nh• biến kiểu Byte. - Lệnh MOV và lệnh XCHG + Lệnh MOV đ•ợc sử dụng để di chuyển dữ liệu giữa các thanh ghi, giữa thanh ghi và vị trí nào đó của bộ nhớ hoặc di chuyển trực tiếp một số vào thanh ghi hoặc bộ nhớ. Cú pháp lệnh: MOV Destination, Source Di chuyển Đích đến , Nguồn Ví dụ: Mov AX,Word01 Giá trị có trong thanh ghi AX sẽ đ•ợc thay thế bởi giá trị đ•ợc l•u trong vị trí bộ nhớ Word01. Giá trị trong Word01 không bị thay đổi. Mov AX,BX AX nhận giá trị từ BX, Giá trị của BX không thay đổi. Mov AX, 'A'. Giá trị mã ASCII 041h sẽ đ•ợc di chuyển vào thanh ghi AX. Cụ thể là vào Byte cao của AX (AH). + Lệnh XCHG: Đ•ợc sử dụng để tráo đổi giá trị giữa 2 thanh ghi, giữa thanh ghi và bộ nhớ. Cú pháp lệnh: XCHG Destination, Source Tráo đổi Đích đến , Nguồn Ví dụ: XCHG AX,BX This document is created with the unregistered version of Document2PDF Pilot. Đổi vị trí các giá trị của AX và BX lẫn nhau, AX sẽ l•u trữ giá trị của BX và ng•ợc lại. XCHG AX,Word01 Tráo đổi giá trị của AX và giá trị tại vị trí bộ nhớ Word01. + Điều cấm trong khi sử dụng 2 lệnh trên: Vì các lý do về kỹ thuật, có một số các quy định mà ng•ời lập trình phải tuân theo. Ví dụ minh hoạ: Mov Word01,Word02 ; Không hợp lệ Phát biểu lệnh trên là không hợp lệ, không đ•ợc phép di chuyển dữ liệu trực tiếp từ vị trí bộ nhớ này sang vị trí bộ nhớ khác. Để có thể làm đ•ợc việc trên ta phải thay đổi câu lệnh nh• sau: Mov AX,Word02 Mov Word02,AX Các kết hợp hợp lệ giữa các toán hạng trong 2 lệnh trên: Destination Operand Source Operand General Register Segment Register Memory Location Constant General Reg Yes Yes Yes No Segment Reg Yes No Yes No Mem Location Yes Yes No No Constant Yes No Yes No Destination Operand Source Operand General Register Memory Location General Register Yes Yes Memory Location Yes No - Lệnh ADD, SUB, INC và DEC + Lệnh ADD và lệnh SUB đ•ợc sử dụng để thực hiện các phép tính cộng, trừ giá trị giữa 2 thanh ghi, Giữa thanh ghi và bộ nhớ hoặc để cộng (trừ) một số vào (ra) một thanh ghi hoặc bộ nhớ. Cú pháp lệnh: ADD Destination, Source SUB Destination, Source Ví dụ: ADD Word01,AX Cộng giá trị có trong AX vào Word01. Kết quả l•u trong Word01. SUB AX,DX Giá trị của thanh ghi DX sẽ bị trừ đi giá trị của thanh ghi AX, Kết quả đ•ợc l•u trong thanh ghi AX, Giá trị của thanh ghi DX đ•ợc giữ nguyên. ADD BL,5 Cộng 5 vào giá trị đã có sẵn trong thanh ghi BL. + Quy tắc hợp lệ: Destination Operand Source Operand General Register Memory Location General Register Yes Yes Memory Location Yes No This document is created with the unregistered version of Document2PDF Pilot. Constant Yes Yes Cộng hoặc trừ trực tiếp giữa 2 vị trí của bộ nhớ là không hợp lệ. Ví dụ: ADD Byte01,Byte02 ;Không hợp lệ Giải pháp Mov AL,Byte02 Add Byte01,AL + Lệnh INC và lệnh DEC đ•ợc sử dụng để cộng thêm 1 hoặc bớt đi 1 từ thanh ghi hoặc tại một vị trí ô nhớ nào đó. Cú pháp lệnh: INC Destination DEC Destination Ví dụ: Inc Word01 Cộng thêm một vào Word01. Dec Byte01 Trừ Byte01 đi 1. - Lệnh NEG: Lệnh NEG đ•ợc sử dụng để thay đổi dấu của giá trị. Cú pháp lệnh: NEG Destination Ví dụ: Neg BX Chuyển đổi giá trị của BX thành số âm. - Tính t•ơng thích giữa các toán hạng. Các toán hang trong một câu lệnh 2 toán hạng phải cùng một kiểu, cả hai đều phải là kiểu Byte hoặc kiểu Word Ví dụ: Mov AX,Byte01 không hợp lệ. Tuy nhiên ch•ơng trình có thể chấp nhận kiểu sau: Mov AL, 'A' ;hoặc Mov AX, 'A' 5- Mô tả lệnh với ngôn ngữ Phát biểu Dịch lệnh Mô tả B = A Mov AX,A Di chuyển A vào thanh ghi AX Mov AX,5 Di chuyển 5 vào thanh ghi AX Sub AX,A AX chứa giá trị 5 - A Mov A,AX Di chuyển giá trị trên vào A Neg A A = -A Add A,5 A = 5 - A Mov AX,B AX nhận giá trị B Sub AX,A AX nhận giá trị B - A Sub AX,A AX nhận giá trị B - 2*A Mov A,AX Di chuyển kết quả vào A 6- Cấu trúc ch•ơng trình. This document is created with the unregistered version of Document2PDF Pilot. Chúng ta biết rằng, một ch•ơng trình ngôn ngữ máy tính bao gồm Mã ch•ơng trình, dữ liệu và ngăn xếp. Mỗi một thành phần đều chiếm một phần trong một đoạn nào đó cua bộ nhớ máy tính. Ch•ơng trình của ngôn ngữ assembly cũng đ•ợc tổ chức t•ơng tự. Mã ch•ơng trình, dữ liệu và ngăn xếp ch•ơng trình có cấu trúc nh• một đoạn ch•ơng trình. Mỗi một thành phần đều đ•ợc biên dịch và nạp vào từng đoạn của bộ nhớ. - Tổ chức mô hình bộ nhớ: Kích th•ớc của mã ch•ơng trình và dữ liệu ch•ơng trình có thể đ•ợc xác định quan mô hình tổ chức bộ nhớ thông qua việc sử dụng từ khoá ".MODEL". Cú pháp: .Model Memory_model Các cách tổ chức mô hình bộ nhớ th•ờng dùng là: Small, Medium,Compact và Large theo nh• mô tả trong bảng sau: Model Mô tả Small Mã ch•ơng trình (Code) nằm trong một đoạn (Segment), Dữ liệu (Data) nằm trong một đoạn khác Medium Mã ch•ơng trình (Code) nằm trong nhiều đoạn, Dữ liệu (Data) nằm trong một đoạn khác. Compact Mã ch•ơng trình (Code) nằm trong một đoạn (Segment), Dữ liệu (Data) nằm trong nhiều đoạn khác. Large Mã ch•ơng trình (Code) nằm trong nhiều đoạn (Segment), Dữ liệu (Data) nằm trong nhiều đoạn khác. Nh•ng không có mảng nào lớn hơn 64 KB. Huge Mã ch•ơng trình (Code) nằm trong nhiều đoạn (Segment), Dữ liệu (Data) nằm trong nhiều đoạn khác. Nh•ng có mảng có thể lớn hơn 64 KB. - Đoạn dữ liệu (Data Segment): Đoạn dữ liệu của ch•ơng trình chứa tất cả các khai báo biến ch•ơng trình. Để khai báo đoạn dữ liệu trong ch•ơng trình, ta dung từ khoá ".DATA". Ví dụ minh hoạ: .DATA Word01 DW 2 Word02 DW 5 MSG DB 'The First Message' Mask EQU 10010010b - Đoạn ngăn xếp (Stack Segment) Mục đích của việc khai báo Stack Segment trong ch•ơng trình là để tổ chức một khối bộ nhớ. Cú pháp khai báo nh• sau: .STACK Size Size là kích th•ớc của Stack tính theo Byte. Ví dụ: .STACK 100h Giới hạn 100h byte cho vùng stack. - Đoạn mã (Code Segment). Đoạn này chứa các lệnh của ch•ơng trình (Program Instructions). Cú pháp khai báo: .CODE Name Chú ý: Không cần phải khai báo tên trong Model Small. Trong đoạn này, các lệnh có thể đ•ợc tổ chức thành các đoạn nhỏ gọi là Procedure. Cách định nghĩa Procedure nh• sau This document is created with the unregistered version of Document2PDF Pilot. Name PROC ; Bắt đầu Procedure ; Mã ch•ơng trình Name ENDP ; Kết thúc Procedure Ví dụ về khai báo định nghĩa Code Segment .CODE MAIN PROC ; Bắt đầu Procedure ; Lệnh chính của Procedure MAIN ENDP ; Kết thúc Procedure ; Procedure khác 7- Ghép nối ch•ơng trình Ví dụ sau mô tả cách tổ chức một ch•ơng trình: .Model Small .Stack 100h .Data ; Khai báo dữ liệu .Code Main Proc ; Các câu lệnh Main Endp ; Các procedure khác End Main Dòng cuối cùng của ch•ơng trình phải có từ khoá END theo sau tên của Procedure. 8- Viết ch•ơng trình và chạy ch•ơng trình. - Các câu lệnh vào ra. Ta đã biết, CPU muốn liên lạc đ•ợc với các thiết bị ngoại vi thông qua các thanh ghi vào ra đ•ợc gọi là các cổng vào ra. Có hai lệnh IN và OUT cho phép ta truy xuất trực tiếp các cổng. Các câu lệnh này đ•ợc sử dụng cần thiết khi cần truy xuất các cổng một cách nhanh chóng nh• các ch•ơng trình Game. Tuy nhiên, hầu hết các ch•ơng trình ứng dụng không sử dụng các lệnh vào ra bởi vì các cổng vào ra khac biệt nhau giữa các hệ thống máy tính, tốt nhất là sử dụng các ch•ơng trình con của nhà sản xuất. Có 2 kiểu trình phục vụ các công tác vào ra, đó là BIOS và DOS. Ch•ơng trình BIOS đ•ợc chứa trong BIOS ROM và có thể liên lạc trực tiếp với các cổng vào ra. Các tiểu trình DOS có thể thực hiện đ•ợc rất nhiều các công việc phức tạp ví dụ nh• in chuỗi ký tự, mặc dù các công việc đều thông qua các tiểu trình của BIOS. - Lệnh INT Lệnh INT (interrupt) đ•ợc sử dụng để giải quyết các công việc liên quan đến các tiểu trình DOS và BIOS Cú pháp: INT Interrupt_Number Interrupt_Numberlà số hiệu để xác định ngắt. Ví dụ Int 16h liên quan đến tiểu trình điều khiển bàn phím. + Int 21h: Đ•ợc sử dụng cho rất nhiều chức năng của DOS. Một chức năng đặc biệt là thay đổi các số hiệu chức năng của thanh ghi AH. Các chức năng nh• sau: This document is created with the unregistered version of Document2PDF Pilot. Số hiệu chức năng Tiểu trình 1 Nhập 1 phím 2 Xuất một ký tự đơn 3 Xuất chuỗi ký tự Chức năng Int21h nhập một giá trị vào một thanh ghi nào đó và trả kết quả ra thanh ghi khác. D•ới đây là mô tả các chức năng: Chức năng 01 Nhập một phím Input AH = 1 Output AL = mã ASCII nếu một phím đ•ợc nhấn = 0 Nếu không có phím đ•ợc nhấn. Để giải quyết vấn đề, viết các lệnh nh• sau: Mov AH,1 ; Nhập chức năng phím Int 21h ; Nhập mã ASCII vào AL Bộ xử lý sẽ chờ cho đến khi ng•ời dùng nhấn một phím. Nếu một phím đ•ợc nhấn, thanh ghi AL sẽ nhận đ•ợc mã ASCII của phím đó. Ký tự đó sẽ hiện lên màn hình. Nếu có bất kỳ một phím nào khác đ•ợc nhấn, ví dụ nh• các phím mũi tên, Fx hoặc t•ơng tự, thanh ghi AL sẽ nhận giá trị 0. Các lệnh tiếp theo int21h sẽ đ•ợc thực hiện tiếp. Chức năng 1 của int 21h không có dấu hiệu để ng•ời dùng có thể nhập dữ liệu, vậy ta có thể sử dụng Chức năng 2 nh• sau: Input AH =2 DH = mã ASCII hiện ký tự hoặc ký tự điều khiển Output AL = mã ASCII hiện ký tự hoặc ký tự điều khiển Ví dụ: Mov AH,2 Mov DL, "?" Int 21h Hiện dấu ? lên màn hình và hiện dấu nhắc lệnh để chờ ng•ời dùng nhập phím khác. Chức năng 2 còn có thể đ•ợc sử dụng cho các chức năng điều khiển. Nếu thanhghi DL nhận mã ASCII của các ký tự điều khiển, Int 21h sẽ hiển thị ký tự điều khiển đó. Một số các ký tự điều khiển tiêu biểu nh• sau: Mã ASCII (Hex) Ký hiệu Chức năng 7 Bel Phát tiếng beep từ loa PC. 8 BS Phím lùi. 9 HT Phím Tab. A LF Xuống hàng. D CR Đầu dòng mới. Trong khi xử lý, thanh ghi AL sẽ l•u giữ mã ASCII của ký tự điều khiển. - Ch•ơng trình đầu tiên: Một ch•ơng trình hoàn chỉnh với các chú thích để giải thích từng câu lệnh, chú ý rằng các lời giải thích trong ch•ơng trình thật sẽ không sử dụng đ•ợc tiếng Việt. Tên ch•ơng trình Prg01.asm This document is created with the unregistered version of Document2PDF Pilot. Title Prg01: Echo Program .Model Small .Stack 100h .Code Main Proc ;Hiển thị dấu nhắc lệnh Mov AH,2 ;Chức năng hiển thị ký tự Mov DL,'?' ;Ký tự là dấu '?' Int 21h ;Gọi dịch vụ 21h hiển thị ký tự ;Nhập ký tự Mov AH,1 ;Chức năng đọc ký tự Int 21h ;Gọi dịch vụ 21h để nhập ký tự vào AL Mov BL,AL ;Ghi ký tự vào BL ;Xuống hàng mới Mov AH,2 ;Chức năng hiển thị ký tự Mov DL,0DH ;Con trỏ trở về đầu dòng Int 21h ;Xử lý việc đ•a con trỏ về đầu dòng Mov DL,0AH ;Xuống dòng mới Int 21h ;Xử lý xuống dòng mới ;Hiển thị ký tự Mov DL,BL ;Lấy ký tự l•u trong BL Int 21h ;Hiển thị ký tự trong thanh ghi DL ;Quay trở lại nền DOS Mov AH,4CH ;Gọi hàm thoát về DOS Int 21h ;Thoát về DOS Main Endp ;Kết thúc Procedure End Main ;Kết thúc ch•ơng trình - Tạo ch•ơng trình và chạy ch•ơng trình: Có 4 b•ớc để tạo và chạy ch•ơng trình a- Sử dụng một ch•ơng trình soạn thảo text để tạo ch•ơng trình nguồn. b- Sử dụng ch•ơng trình dịch để tạo ra 1 file mã máy (Object File). c- Sử dụng ch•ơng trình Link để liên kết các ch•ơng trình liên kết tạo ra file chạy (Run File). d- Chạy ch•ơng trình. B•ớc 01: Tạo ch•ơng trình nguồn. Sử dụng ch•ơng trình soạn thảo text để tạo một file có tên Prg01 có nội dung nh• trên. File có đuôi là *.asm. B•ớc 02: Dịch ch•ơng trình Sử dụng ch•ơng trình Masm để dịch ch•ơng trình nguồn thành một file đối t•ợng có tên là PRG01.OBJ. Câu lệnh có thể là nh• sau: C:\>Masm PRG01; Ch•ơng trình sẽ kiểm tra lỗi của ch•ơng trình nguồn. Nếu có lỗi, ch•ơng trình sẽ báo lỗi cho ng•ời dùng biết. Ch•ơng trình sẽ dịch file PRG01.ASM thành file đối t•ợng có tên là PRG01.OBJ. Nên có dấu ; đằng sau câu lệnh.. Thông th•ờng, tên của file mới sẽ lấy mặc định là tên file cũ với đuôi là OBJ. File danh sách nguồn: File sanh sách nguồn (*.LST) là một file text hiển thị các dòng This document is created with the unregistered version of Document2PDF Pilot. lệnh và các lệnh mã máy t•ơng đ•ơng và một số thông tin khác về ch•ơng trình. File này rất hữu dụng cho công việc gỡ rối ch•ơng trình. File tham khảo chéo (Cross-Reference File): File có phần mở rộng (*.CRF) liệt kê tên hiển thị trong ch•ơng trình, hữu dụng khi xác định các biến (Variable), các nhãn (Label) trong một ch•ơng trình lớn. B•ớc 03: Liên kết ch•ơng trình: File OBJ là file chứa mã máy nh•ng không thể xử lý đ•ợc bởi vì nó không phải là định dạng của file chạy. Ch•ơng trình Link sẽ liên kết các file Obj thành file có thể xử lý đ•ợc (.exe file). File dạng này có thể đ•ợc nạp vào bộ nhớ và có thể chạy. Cách liên kết ch•ơng trình C:\>Link PRG01 B•ớc 04: Chạy ch•ơng trình. Khi liên kết xong, ta sẽ có file PRG01.EXE. Ta có thể chạy file này trực tiếp từ dấu nhắc lệnh của DOS. - Một ch•ơng trình khác. Ch•ơng trình này đ•ợc viết với mục đích hiển thị một chuỗi ký tự. Để thực hiện ch•ơng trình này ta cần biết thêm một số vấn đề khác. + Hàm 9 của ngắt 21h Hiển thị chuỗi ký tự. Input DX=Địa chỉ độ dời của chuỗi. Chuỗi phải đ•ợc kết thúc bằng ký tự '$' + Một chuỗi có thể khởi tạo trong bộ nhớ nh• sau: MSG DB 'Hello!$' + Lệnh LEA (Load Affective Address). Cú pháp: Lea Destination,Source Lệnh này copy địa chỉ độ dời (Offset) vào thanh ghi công dụng chung. Ví dụ: Lea DX,MSG Nạp địa chỉ độ dời của biến MSG vào thanh ghi DX Tuy nhiên để DOS có thể giải quyết đ•ợc các vấn đề khi ta chạy và dịch ch•ơng trình, ch•ơng trình cần phải thêm 2 câu lệnh sau: Mov AX,@Data Mov DS,AX. @Data là tên của đoạn dữ liệu đ•ợc định nghĩa bởi th• viện .DTA. Ch•ơng trình dịch sẽ dịch tên @Data thành số hiệu đoạn (Segment). 2 lệnh trên rất cần thiết bởi vì số hiệu của Segment có thể không di chuyển trực tiếp đến thanh ghi Segment. Khi thanh ghi DS đ•ợc khởi tạo, ta có thể in dòng chữ "Hello!" bằng cách đặt địa chỉ vào thanh ghi DX và gọi ngắt 21h của DOS. Lea DX,MSG ;Lấy thông tin Mov AH,9 ;Hàm hiện chuỗi ký tự Int 21h ; Gọi ngắt 21h của DOS để thực hiện. Toàn bộ ch•ơng trình nh• sau: Ch•ơng trình PRG02.Asm This document is created with the unregistered version of Document2PDF Pilot. Title PRG02 Print String Program .Model Small .Stack 100h .Data MSG DB 'Hello!$' ;Khai báo biến MSG .Code Main Proc ; Khởi tạo thanh ghi DS Mov AX,@Data Mov DS,AX ; Khởi tạo thanh ghi DS ;Hiện thông điệp Lea DX,MSG ;Nạp thông điệp Mov AH,9 ;Chức năng hiện chuỗi ký tự Int 21h ;Gọi ngắt DOS 21h ;Trở về DOS Mov AH,4CH Int 21h Main Endp End Main Ch•ơng trình thêm: Đổi ký tự th•ờng thành ký tự in hoa. III- Kết luận. Chúng tôi đã giới thiệu cho các bạn một số cách sử dụng lệnh đúng cú pháp và đúng quy tắc cũng nh• cách thức để các bạn có thể tạo đ•ợc một ch•ơng trìnhcó thể chạy độc lập trên nền hệ điều hành. Khi viết một ch•ơng trình đầy đủ, các bạn cần chú ý một số vấn đề nh• sau. Một số khai báo cơ bản: Khai báo bộ nhớ qua từ khoá Model .Small .Medium .Compact .Large .Huge Các kiểu dữ liệu cơ bản DB, DW, DD, DQ, DT Các câu lệnh cơ bản: MOV, XCHG, ADD, SUB, INC, DEC, NEG, INT, LEA. Cách sử dụng Ngắt 21h (Int 21h) của DOS. Function 1: Đọc ký tự từ bàn phím Function 2:Hiện ký tự Function 9: Hiện chuỗi ký tự Các b•ớc để tạo một ch•ơng trình chạy độc lập có đuôi là *.EXE Sử dụng ch•ơng trình MASM để tạo ch•ơng trình chạy. a- Sử dụng một ch•ơng trình soạn thảo text để tạo ch•ơng trình nguồn. b- Sử dụng ch•ơng trình dịch để tạo ra 1 file mã máy (Object File). This document is created with the unregistered version of Document2PDF Pilot. c- Sử dụng ch•ơng trình Link để liên kết các ch•ơng trình liên kết tạo ra file chạy (Run File). d- Chạy ch•ơng trình. Gõ tên File tại dấu nhắc DOS. Một số ch•ơng trình mẫu: PRG01.ASM, PRG02.ASM. This document is created with the unregistered version of Document2PDF Pilot. Chýừng 4: Trạng thái bộ xử lý và các loại cờ. I- Giới thiệu các cờ: Một đặc điểm đặc biệt phân biệt giữa computer và các laọi máy móc khác là khả năng quyết định công việc. Các mạch điện trong CPU có thể thực hiện đ•ợc các quyết định đơn giản dựa vào trạng thái hiện tại của bộ xử lý. Các trạng thái đ•ợc biểu hiện bởi các cờ trong thanh ghi cờ của CPU. Hình minh hoạ sau cho ta thấy cấu trúc của thanh ghi cờ (Flag Register): 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF Tại các Bit 0, 2, 4, 7, 11 là các cờ trạng thái. Tại các Bit 8,9,10 là các cờ điều khiển. Các bảng sau sẽ mô tả các loại cờ và các đặc điểm của chúng: Các cờ trạng thái: Bit Tên cờ Ký hiệu Mô tả 0 Carry Flag CF Mô tả trạng thái dữ liệu đ•ợc nhớ để dành thêm vào bit sau 2 Parity Flag PF Cờ trạng thái để kiểm tra chẵn lẻ các bits 4 Auxilary Carry Flag AF Đ•ợc sử dụng để mô tả trạng thái nhớ và trạng thái m•ợn 6 Zero Flag ZF Mô tả trạng thái dấu của chữ số +/- 11 Overflow Flag OF Mô tả trạng thái giới hạn của số. Các cờ điều khiển: Bit Tên cờ Ký hiệu Mô tả 8 Trap Flag TF Cờ bẫy 9 Interrupt Flag IF Cờ điều khiển ngắt 10 Direction Flag DF Cờ dẫn h•ớng II- Mô tả trạng thái của bộ xử lý. 1- Trạng thái tràn (Overflow) Điều cơ bản của trạng thái tràn số liên quan đến thực tế rằng giới hạn của các số có thể hiển thị trong giới hạn của Computer. Nh• đã giải thích ở các phần tr•ớc, giới hạn của một số nguyên có dấu có thể biểu diễn đ•ợc bằng Word 16 bits là -32768 32767. Với số nguyên không dấu là 0 65535. Nếu kết quả tính toán v•ợt quá giới hạn trên, trạng thái tràn sẽ xảy ra và kết quả sẽ bị cắt bớt để có thể biểu diễn đ•ợc trong thanh ghi, do đó kết quả sẽ là sai. Để có thể hiểu rõ hơn, ta có thể tham khảo ví dụ sau: Số có dấu hoặc không dấu là tùy thao quy định. Khi ta thực hiện một phép tính số học, có thể là phép cộng (+), có thể có 4 tr•ờng hợp xảy ra. + Không tràn số. + Tràn số vì dấu (+/-). + Tràn số không dấu. + Tràn số cả tr•ờng hợp có dấu và không dấu. Ví dụ sau là ví dụ tràn số không dấu. Giả định thanh ghi AX chứa giá trị FFFFh, Thanh ghi BX chứa giá trị 0001h, Sử dụng lệnh ADD để cộng 2 giá trị trên. This document is created with the unregistered version of Document2PDF Pilot. ADD AX,BX 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Kết quả đúng của phép tính trên là: FFFFh + 0001h = 100000h 65536 (V•ợt quá giới hạn của số nguyên dùng cho Word 16 bit). Kết quả đ•ợc l•u trong thanh ghi AX là 0000h (Số 1 là số nhớ và đ•ợc ghi trong cờ Carry). Vậy ta sẽ nhận đ•ợc kết quả sai. Tuy nhiên kết quả sẽ là đúng trong tr•ờng hợp số có dấu. Giải thích nh• sau: Ta có FFFFh = -1 0001h = 1 FFFFh + 0001h = 0 Vậy kết quả l•u trong AX là 0000h sẽ là đúng Tràn có dấu không xảy ra. Một ví dụ khác về tràn số có dấu: AX và BX cùng chứa giá trị 7FFFh. ADD AX,BX 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 Kết quả là FFFEh Ta có 7FFFh = 32767 Vậy 7FFFh + 7FFFh = 32767 + 32767 = 65534. Kết quả này ngoài giới hạn của số có dấu. Kết quả đ•ợc diễn giải theo số có dấu là FFFEh = -2 Tình trạng tràn có dấu xảy ra. - Cách thức bộ xử lý biểu hiện trạng thái tràn.: Bộ xử lý sẽ thiết lập cờ OF = 1 với tràn số không dấu, CF = 1 với tràn số có dấu. Điều này sẽ giúp ch•ơng tình hoạt động chính xác. nếu không có hoạt dộng gí xảy ra ngay lúc đó, các câu lệnh khác phía sau sẽ làm cho cờ tràn sẽ đ•ợc tắt OF = 0. Để xác định trạng thái tràn số, bộ xử lý không dịch kết quả là số có dấu hoặc không dấu. Hành động là sẽ sử dụng cả 2 cách thông dịch cho mỗi phép toán và bật các cờ CF và OF cho trạng thái tràn số không dấu và tràn số có dấu. Nếu Tính toán là số có dấu, chỉ có OF đ•ợc để ý và CF sẽ bị lờ đi, Ng•ợc lại, CF sẽ đ•ợc để ý và OF sẽ bị lờ đi. - Cách thức bộ xử lý xác định trạng thái tràn. Có thể có nhiều lệnh làm xảy ra trạng thái tràn số nh•ng để đơn giản vấn đề, ta chỉ giới hạn ở các lệnh cộng và trừ. + Tràn số không dấu: Trong phép toán cộng, Tràn số không dấu xảy ra khi có số nhớ trên Bit MSB (Most Significant Bit). Điều đó có nghĩa là kết quả đúng lớn hơn số không có dấu. ví dụ nh• FFFFh cho 1 Word và FFh cho 1 Byte. Trong phép trừ, Tràn số không dấu xảy ra khi phải m•ợn thêm một số hạng từ MSB và kết quả sẽ phải nhỏ hơn 0. + Tràn số có dấu: Phép cộng các số cùng dấu, trạng thái tràn số xảy ra khi kết quả có dấu khác. Điều này xảy ra nh• trong ví dụ cộng hai số 7FFFh là hai số d•ơng và đ•ợc kết quả là số âm FFFEh. Phép trừ các số khác dấu cũng giống nh• phép cộng các số cùng dấu. Ví dụ A - ( - B) = A + B và -A-(+B) = (-A) + (- B). Tràn số có dấu xảy ra nếu kết quả có dấu khác với mong muốn. This document is created with the unregistered version of Document2PDF Pilot. Trong phép cộng với các số khác dấu, hiện t•ợng tràn số không xảy ra vì kết quả bao giờ cũng nhỏ hơn. t•ơng tự nh• với phép trừ hai số cùng dấu. 2- Cách thức ảnh h•ởng của các lệnh đến các cờ Mỗi khi bộ xử lý thực thi các lệnh, các cờ đ•ợc thiết lập để phản ánh kết quả. Tuy nhiên, một vài lệnh không có chút ảnh h•ởng nào tới các cờ, chỉ ảnh h•ởng đến một số cờ hoặc để mặc chúng. Bởi vì các câu lệnh nhảy dựa vào cách thức thiết lập cờ. Điều này rất quan trọng để có thể xác định mỗi lệnh làm việc với cờ. Quay lại một số lệnh cơ bản, chúng có thể ảnh h•ởng đến các cờ theo bảng sau: Lệnh Các cờ có ảnh h•ởng MOV, XCHG Không có cờ nào ADD, SUB Tất cả các cờ INC, DEC Tất cả các cờ ngoại trừ CF NEG Tất cả các cờ (CF = 1 ngoại trừ kết quả là 0. OF = 1 nếu Word là 8000h hoặc Byte là 80h) Chúng ta nghiên cứu một ví dụ để rõ hơn các ảnh h•ởng này: AX chứa FFFFh, BX chứa FFFFh Lệnh ADD AX,BX FFFFh FFFFh 1FFFEh Kết quả l•u trong AX là FFFEh = 1111 1111 1111 1110 SF = 1 Vì MSB là 1. PF = 0 Vì có 7 bit trong Byte thấp của kết quả. ZF = 0 Kết quả khác 0. CF = 1 Vì có một số nhớ ngoài MSB tron phép cộng. OF = 0 dấu của kết quả cùng dấu với số sẽ đ•ơc cộng thêm 3- Các lệnh điều khiển hoạt động. Để có khái niệm về các lệnh nhảy, khảo sát ch•ơng trình minh hoạ sau: 1 Title PRG03: Display Character 2 .Model Small 3 .Stack 100h 4 .Code 5 Main Proc 6 Mov AH,2 ; Chức năng hiện ký tự 7 Mov CX,256 ;Số ký tự sẽ hiển thị 8 Mov DL,0 ; DL chứa mã ASCII rỗng (Null) 9 Prn_Loop ; Nhãn dành cho lệnh nhảy 10 Int 21h ; Hiện ký tự 11 Inc DL ;Lấy ký tự tiếp theo 12 Dec CX ;Giảm vòng đếm (Counter) 13 Jnz Prn_loop ;Tiếp tục xử lý từ nhãn cho tới khi nào CX=0 14 ;Thoát ra nền DOS 15 Mov AH,4CH 16 Int 21h 17 Main Endp This document is created with the unregistered version of Document2PDF Pilot. 18 End Main Có 256 ký tự trong bộ ký tự IBM, mã từ 32 127 là các mã chuẩn ASCII có thể hiển thị. Các má còn lại đ•ợc hiển thị d•ới dạng đồ hoạ (??????…). Để hiển thị các ký tự, ta sử dụng một vòng lặp (Dòng 9 dòng 13). Tr•ớc khi bắt đầu vòng lặp, thanh ghi AH đ•ợc khởi tạo là 2 (chức năng hiển thị một ký tự đơn của Ngắt 21h) và thanh ghi DL thiết lập giá trị 0 (mã ASCII đầu tiên). Thanh ghi CX đ•ợc sử dụng để làm bộ đếm vòng lặp. Nó đ•ợc khởi tạo là 256 tr•ớc khi vào vòng lặp và sẽ giảm dần khi mỗi ký tự đã đ•ợc hiển thị. Câu lệnh điều khiển vòng lặp ở đây là câu lệnh JNZ (Jump If Not Zero). Nếu giá trị của CX sau khi bị giảm đi (DEC) ch•a là 0 thì lệnh JNZ sẽ chuyển điều khiển đến nhãn Prn_Loop. Nếu CX = 0 ch•ơng trình sẽ xử lý tiếp các lệnh còn lại từ 14 trở đi. 4- Các lệnh nhảy có điều kiện. Ta có lệnh JNZ là một lệnh nhảy có điều kiện. Cú pháp của các lệnh nhảy có điều kiện nh• sau: Jxxx Destination_label Jxxx là một số lệnh nhảy bắt đầu bằng "J". Destination_Label Là nhãn mà lệnh cần điều khiển. Nếu điều kiện để nhảy là True (Đúng), Lệnh tiếp theo cần đ•ợc thực hiện là nhãn đã đ•ợc khai báo. Ng•ợc lại lệnh kế tiếp của lệnh nhảy sẽ đ•ợc thực hiện. - Cách thức CPU thực hiện lệnh nhảy có điều kiện: Để thực hiện lệnh nhảy, CPU tìm trong thanh ghi cờ. Nếu điều kiện của lệnh nhảy là đúng, CPU sẽ điều chỉnh thanh ghi con trỏ lệnh (IP) trỏ đến nhãn lệnh. Nếu điều kiện của lệnh nhảy là sai (False), CPU sẽ không điều chỉnh thanh ghi IP và dòng lệnh kế tiếp sẽ đ•ợc thực thi. 5- So sánh với các ngôn ngữ lập trình bậc cao Ta đẫ biết, các câu lệnh Jump có thể đ•ợc sử dụng để thực hiện lệnh phân nhánh và lệnh lặp. Tuy nhiên chúng t•ơng đối phức tạp nhất là đối với những ng•ời dùng mới trong việc viết mã lệnh. Ta có thể so sánh với một số cấu trúc của ngôn ngữ bậc cao hơn để có thể hiểu rõ về cách thực thi chúng. a- Cấu trúc phân nhánh: - If - Then Cấu trúc If - Then có thể đ•ợc mô tả nh• sau: If điều kiện đúng Then xử lý câu lệnh đúng theo điều kiện EndIf Điều kiện là một phát biểu có thể đúng hoặc sai. Trong tr•ờng hợp đúng, Câu lệnh bên trong sẽ đ•ợc thực thi. Ng•ợc lại, câu lện bên trong sẽ không đ•ợc thực hiện. Ví dụ: Đặt vào thanh ghi AX một số, mô tả nh• sau: If AX < 0 Then thay thế AX bằng - AX EndIf Mã nh• sau ;If AX < 0 This document is created with the unregistered version of Document2PDF Pilot. Cmp AX,0 ;So sanh AX va 0? JNL EndIf ;Khong, thoat ;Then Neg AX ; Dung, thay doi dau End_If Điều kiện AX<0 đ•ợc kiểm tra bởi lệnh CMP AX,0 Dùng lệnh nhảy JNL (jump If Not Less) để nhảy đến nhãn End_If nếu AX không nhỏ hơn không. - If - Then - Else If điều kiện đúng Then xử lý câu lệnh theo điều kiện đúng Else Then xử lý câu lệnh theo điều kiện sai EndIf Ví dụ: Thanh ghi AL và BL chứa mã ASCII hai ký tự nhau, hiển thị ký tự có số mã nhỏ hơn. If AL <= BL Then Hiển thị ký tự trong AL Else Hiển thị ký tự trong BL EndIf Mã lệnh có thể nh• sau Mov AH,2 ; Chuẩn bị hiển thị ; if AL <= BL Cmp AL,BL ; AL <= BL JNBE Else_ ; Khong, hien thi BL ;then Mov DL,AL ;Chuyen ky tu de hien thi JMP Display ; Nhay den Display Else_: Mov DL,BL ;Chan bi de hien thi BL Display: Int 21h ;Hien thi - Case: Case Phatbieu Giatri1: Lenh1 Giatri2: Lenh2 GiatriN: LenhN End_case Trong cấu trúc này, Phatbieu đ•ợc kiểm tra Nếu giá trị là thành viên của giatri1, lenh1 đ•ợc thực hiện… Ví dụ: AX chứa 1 số âm, nạp -1 vào BX, Nếu AX chứa 0, nạp 0 vào BX, Nếu AX chứa số d•ơng, Nạp 1 vào BX Case AX <0 Nạp -1 vào BX =0 Nạp 0 vào BX >0 Nạp 1 vào BX This document is created with the unregistered version of Document2PDF Pilot. End_Case Mã ch•ơng trình nh• sau: ;Case AX CMP AX,0 ;Kiem tra AX JL So_am ;AX<0 JE Bang_0 ;AX=0 JG So_duong ;AX>0 So_am: Mov BX,-1 JMP End_case Bang_0: Mov BX,0 JMP End_case So_duong: Mov BX,1 End_case - And Điều kiện và đ•ợc coi là đúng nếu cả hai thành phần so sánh đều đúng Ví dụ: Đọc ký tự, hiển thị khi chúng là Ký tự in hoa: Đọc ký tự vào thanh ghi AL If ('A' <= Kytu) And (Kytu<= 'Z') Then Hien ky tu Endif Mã ch•ơng trình nh• sau: ; Doc Ky tu Mov AH,1 ; Chuan bi doc ky tu Int 21h ; Doc ky tu vao AL ; If ('A' <= Kytu) And (Kytu<= 'Z') Cmp AL,'A' ; Ky tu >= A JNGE End_if ; Khong, thoat Cmp AL,'Z' ; Ky tu <= Z JNLE End_if ; Khong, thoat ; Hien thi ky tu Mov DL,AL ; Nhap ky tu Mov AH,2 ; Chuan bi hien thi Int 21h ; Hien thi End_if - OR Câu lệnh Or đúng khi một trong hai diều kiện thành phàn đúng, sai khi cả hai diều kiện thành phần sai. Ví dụ: Đọc ký tự. Nếu là 'y' hoặc 'Y' thì hiện chúng, nếu không phải thì thoát khỏi chuong trình. Đọc ký tự vào AL If (Kytu= 'y') OR (Kytu= 'Y') Then hiển thị Else Ng•ng ch•ơng trình This document is created with the unregistered version of Document2PDF Pilot. End_if Mã ch•ơng trình ; Doc ky tu Mov AH,1 ; Chuan bi doc Int 21h ; Ky tu trong AL ;If (Kytu= 'y') OR (Kytu= 'Y') Cmp AL, 'y' ; Ky tu la y? JE Then ; Dung, hien thi y Cmp AL, 'Y' ; Ky tu la Y JE Then ; Dung, hien thi Y Jmp Else_ Then: Mov AH,2 ; Chuan bi hien thi Mov DL,AH ; Nhan ky tu Int 21h ; Hien thi JMP End_if ; Thoat Else_: Mov AH,4Ch Int 21h ; Thoat ra DOS End_if 6- Các lệnh lặp. Các câu lệnh lặp mô tả các lệnh có thể đ•ợc thực thi nhiều lần tuỳ thuộc vào điều kiện để kết thúc vòng lặp. Lệnh lặp FOR Mô tả For Điều kiện lặp Do Các câu lệnh End_for Lệnh Loop có thể đ•ợc sử dụng cho lệnh lặp Loop Nhãn Số đếm cho lệnh lặp đ•ợc đặt trong thanh ghi CX, Các xử lý của lệnh Loop sẽ làm cho giá trị trong thanh ghi CX giảm một cách tự động cho đến khi giá trị này bằng 0. Sử dụng lệnh Loop, câu lệnh lặp For đ•ợc phat biểu nh• sau: ;Khởi tạo thanh ghi CX Top: Các Lệnh Loop Top Ví dụ: Hiển thị một hàng 80 hình sao *. Mô tả: For 80lan Do Hienthi '*' End_for Mã ch•ơng trình Mov CX,80 ; So l•ơng dau * Mov AH,2 ;Chuc năng hien thi Mov DL,'*' ; Ky tu se hien thi This document is created with the unregistered version of Document2PDF Pilot. Top: Int 21h ; Hien thi * Loop Top Bạn phải chú ý đến điều này. Khi sử dụng lệnh Loop, it nhât một lần lệnh lặp đ•ợc thực hiện. Thực sự nếu CX chứa 0 khi lệnh Loop có hiệu lực, lệnh Loop sẽ làm cho thanh ghi CX giảm tới FFFFh, và lệnh Loop lại tiếp tục xử lý FFFFh = 65535. Để tránh điều này, lệnh JCXZ (Jump if CX=0) có thể đ•ợc sử dụng Cú pháp lệnh nh• sau: JCXZ Nhãn Ta có thể phát biểu lệnh nh• sau: ……………………….. JCXZ Skip Top: Lệnh Loop Top Skip: - While. Lệnh Loop tuỳ thuộc vào điều kiện Phát biểu While dieukien Do Các câu lệnh End_while Ví dụ: Viết một vài mã lệnh để đếm số ký tự trong một hàng Mô tả: Khởi tạo vòng đếm Count Đọc ký tự While Kytu Enter do Count=Count+1 Doc ky tu End_while Mã ch•ơng trình Mov DX,0 ; Khoi tao DX=0 Mov AH,1 ; Doc ky tu Int 21h ; Ky tu trong AL While_: Cmp AL,0Dh ; Enter? JE End_while ; Dung, thoat Inc DX ; Tang DX Int 21h ; Doc ky tu Jmp While_ - Repeat. Mô tả: Repeat Các lệnh Until Điều kiện Ví dụ: Đọc các ký tự cho tới khi gặp khoảng trắng: Mô tả: This document is created with the unregistered version of Document2PDF Pilot. Repeat Doc ky tu Until Ky tu la khoang trang Mã ch•ơng trình: Mov AX,1 ; Chuan bi doc Repeat: Int 21h ;Ky tu trong AL ; Until Cmp AL, ; AL = Space JNE Repeat This document is created with the unregistered version of Document2PDF Pilot. Chýừng 5: Các lệnh Logic. I- Giới thiệu Khả năng thao tác với từng bit dữ liệu là một lợi thể của ngôn ngữ Assembly. Chúng ta có thể thay đổi từng bit đọc lập bằng cách sử dụng các lệnh logic. Giá trị nhị phân la 0 và 1 t•ơng ứng với các diều kiện Đúng (True) hoặc Sai (False) Ví dụ minh hoạ các lệnh Logic. 1 0 1 0 1 0 1 0 And 1 1 1 1 0 0 0 0 = 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 OR 1 1 1 1 0 0 0 0 = 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 Xor 1 1 1 1 0 0 0 0 = 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 Not = 0 1 0 1 0 1 0 1 II- Các lệnh Logic cơ bản. 1- Lệnh And, Or, Xor, Not: Các lệnh này thực hiện các thao tác theo tên Logic của chúng. Cú pháp lệnh: AND Dich, Nguon OR Dich, Nguon XOR Dich, Nguon Kết quả đ•ợc l•u trong Dich. Dich phai la thanh ghi hoặc ô nhớ. Nguon có thể là Thanh ghi, Bộ nhớ hoặc hằng số. Tuy nhiên việc di chuyển giữa ô nhớ và ô nhớ là không đ•ợc. - ảnh h•ởng đến Các cờ: SF, ZF, PF Phản ánh kết quả AF Không xác định CF, OF Giá trị 0. Một chức năng của các lệnh And, Or, Xor là có thể làm thay đổi từng bit của Dich. Để làm điều đó, ta phải xây dựng chức năng bit nguồn nh• là một mặt nạ (Mask). Các bit Mask đ•ợc chọn để xác định các bit tại Diak đ•ợc thay đổi đúng vị This document is created with the unregistered version of Document2PDF Pilot. trí khi lệnh đ•ợc xử lý. Để chọn Bit Mask, ta phải chọn các đặc tính của And, Or hoặc Xor. b And 1 = b b or 0 = b b Xor 0 = b b And 0 = 0 b or 1 = 1 b Xor 1 = ~b (Bù 2 của b) Từ đó ta có: + Lệnh And cho phép ta xoá các bit của DichNh•ng có thể để nguyên một số bit khác. Mask bit bằng 0 xoá bit tại vị trí t•ơng tự , Mask bit bằng 1 sẽ để nguyên các bit tại vị trí t•ơng tự. + Lệnh OR sử dụng để thiết lập các bit đích và giữ nguyên các bit còn lại. Mask bit là 1 làm thay đổi bit đích, Mask bit bằng 0 giữ nguyên các bit đích tại vị trí t•ơng ứng. + Lệnh XOR cho phép ta lập mã bù 2 dối với các bit đích và để nguyên các bit khác. Mask bit bằng 0 sẽ giữ nguyên các bit đích tại vị trí t•ơng ứng. Ví dụ: + Xoá bít dấu của thanh ghi AL, giữ nguyên các Bit khác Sử dụng lệnh AND với 01111111=7Fh là Mask And AL,7Fh + Thay đổi bit dầu tiên và cuối cùng của thanh ghi AL Sử dụng lệnh OR với 10000001=81h là Mask Or AL,81h + Thay đổi bit dấu của DX Sử dụng lệnh XOR với 8000h là Mask XOR DX,8000h Để tránh gõ sai, nên đổi từ nhị phân sang Hex nhất là các Mask 16 bits. - Chuyển đổi ký tự ASCII thành số: Chúng ta biết rằng khi ch•ơng trình đọc ký tự từ bàn phím, AL sẽ nhận ký tự mã ASCII.ví dụ, khi ta nhấn phím số 5, AL sẽ nhận mã 35h chứ không phải số 5. Để nhận số 5 trong AL, ta phải làm nh• sau Sub AL,30h Một cách khác ta sử dụng lệnh And để xoá bỏ 4 bit cao của AL. And AL,0Fh Lý do là Mã của 0 tới 9 là 30 39h, ph•ơng pháp này chuyển đổi các mã ký tự ASCII sang giá trị số. Bằng cách sử dụng lệnh And thay cho lênh Sub, chúng ta nhấn mạnh việc thay đổi đặc điểm bit của AL và điều đó giúp cho ch•ơng trình dễ đọc hơn. - Chuyển ký tự th•ờng thành ký tự in hoa: Mã ASCII của 'a' 'z' là 61h 7Ah, 'A' 'Z' là 41h 5Ah. Nếu DL chứa mã ký tự th•ờng, ta có thể đổi chúng thành ký tự in hoa nh• sau. Sub DL,20h Tuy nhiên, nếu ta so sánh mã nhị phân của các ký tự t•ơng ứng giữa chữ th•ờng và chữ in ta sẽ có Ký tự Mã Ký tự mã A 01100001 a 01000001 B 01100010 b 01000010 Z 01111010 Z 01011010 So sánh trên cho ta thấy, khi chuyển đổi kiểu ký tự ta chỉ cần xoá bit số 5. Việc chuyển đổi rất dễ dàng khi ta sử dụng lệnh Andvới Mask là 11011111b=0DFh. This document is created with the unregistered version of Document2PDF Pilot. Ta có And DL,0DFh - Xoá thanh ghi Ta đã biết có hai cách để xoá thanh ghi nh• sau Thanh ghi AX Mov AX,0 (1)hoặc Sub AX,AX (2) Theo lệnh XOR 1 Xor 1=0 và 0 Xor 0=0 vậy ta có cách thứ 3 Xor AX,AX (3) Mã máy của ph•ơng pháp 1 là 3 byte, ph•ơng pháp 2 và 3 là 2 Byte, vậy để xoá giá trị một thanh ghi ta nên sử dụng ph•ơng pháp 2 hoặc 3. Tuy nhiên để xoá bộ nhớ, ta phải sử dụng ph•ơng pháp 1. 2- Lệnh Not Lệnh not thực hiện thao tác mã bù đối với đích. định dạng nh• sau Not Dich Lệnh không ảnh h•ởng đến các thanh ghi trạng thái. Ví dụ: Not AX 3- Lệnh Test: Lệnh Test sử dụng phép toán And đối với đích và nguồn nh•ng không làm thay đổi giá trị của đích. Mục đích của lênh Test là thiết lập trạng thái cho các cờ: Cú pháp: Test Dich, nguon ảnh h•ởng đến các cờ trạng thái: SF, ZF, PF Phản ánh kết quả AF Không đinh nghĩa CF, OF Giá trị 0 Kiểm tra các bits Lệnh Test có thể đ•ợc sử dụng để kiểm tra từng bit trong một toán hạng. Mask phải chứa 1 tại vị trí cần kiểm tra. Lý do 1 And b=b và 0 and b=0 Test Dich, Mask Ví dụ: Nhảy tới nhãn Below nếu AL chứa số chẵn Byte chứa số chẵn nếu bit 0 có giá trị 0 Mask 00000001b=1 Test AL,1 ;AL Chẵn? JZ Below ; Dung, nhay den Below. This document is created with the unregistered version of Document2PDF Pilot. Chýừng 6: Các lệnh dịch chuyển và quay. I- Giới thiệu Các lệnh dịch chuyển (Shift) và quay (Rotate)sẽ dịch chuyển đích 1 hoặc nhiều vị trí sang trái hoặc phải tuỳ thuộc lệnh. Với các lệnh Shift, bit cuối cùng sẽ bị mất. Với các lệnh Rotate, bit cuối cùng sẽ dịch chuyển sang đầu bên kia. Các lệnh này cho phép ta thực hiện các phép toán nhân, chia hoặc bình ph•ơng một giá trị. Và chúng ta có thể sử dụng chúng để tiến hành các thao tác vào ra số nhị phân hoặc Hexa. II- Các lệnh cơ bản. 1- Các lệnh dịch (Shift). a- SHL (Shift Left "" Dịch sang trái) Lệnh cho phép ta dịch một hoặc nhiều bit sang bên trái Cú pháp: SHL Dich,1 Giá trị 0 sẽ đ•ợc gán vào bit 0, giá trị tạo bit cao nhất của Dich sẽ đ•ợc l•u trong cờ CF. Nếu muốn dịch nhiều bit, ta đ•a giá trị số lần dịch chuyển vào CL SHL Dich,CL ảnh h•ởng đến cờ SF, PF, ZF Phản ánh kết quả AF Không định nghĩa. CF Bit cuối cùng bị đẩy ra OF 1 là kết quả thay đổi dấu của bit cuối cùng Ví dụ: DH chứa giá trị 8Dh, CL chứa giá trị 3 . Vậy giá trị của DH và CF là bao nhiêu khi ta sử dụng câu lệnh SHL DH,CL Trả lời: Giá trị tính theo nhị phân của DH là 10001010b Sau khi dịch trái 3 lần, giá trị của DH sẽ là 01010000b=50h và giá trị của CF sẽ là 0. b- Nhân bằng lệnh SHL Giả sử ta có số 235 nếu ta dịch trái 1 lần (Thêm 0 vào số trên vào bên phải) ta sẽ đ•ợc 2350 = 235 x 10 Cũng t•ơng tự nh• vậy, Dịch trái số nhị phân giống nh• nhân cho 2. Ví dụ: AL chứa số 5=00000101b dịch trái ta sẽ có 00001010=10, dịch trái tiếp ta có 00010100=20 c- SHL (Shift Right "Dịch sang phải"): T•ng tự nh• lệnh dich trái, lệnh dich phải cũng có các thao tác t•ơng tự, Sự khác nhau là chiều dịch của các bit. 2- Các lệnh quay (Rotate). a- ROL(Rotate left "Quay trái") Lệnh thao tác dịch bit sang trái. Bit đầu tiên sẽ mang giá trị bit cuối cùng, CF sẽ chứa giá trị của bit đ•ợc đẩy ra. Cú pháp lệnh: ROL Dich,1 Và This document is created with the unregistered version of Document2PDF Pilot. ROL Dich,CL b- ROR(Rotate Right "Quay phải") T•ơng tự nh• lệnh quay trái, chỉ có điều các bit dịch chuyển qua bên phải, bit cuối cùng sẽ mang giá trị của bit đầu tiên. Cờ CF sẽ mang giá trị của bit bị đẩy ra. Cú pháp lệnh ROR Dich,1 Và ROR Dich,CL Trong các lệnh ROL và ROR, CF phản ánh bit bin đẩy ra, Khảo sát ví dụ sau đây: Ví dụ: Sử dụng lệnh ROL để đếm số l•ợng bit mang giá trị 1 cua rthanh ghi BX mà không thay đổi giá trị thah ghi BX. Giải đáp nằm trong thah ghi AX. Xor AX, AX ; AX về 0 Mov CX,16 ; Bộ đếm lặp Top: ROL BX,1 ; CF= bit bị đẩy ra JNC Next ; 0 Bit INC AX ; 1 bit, tăng số l•ợng Next: Loop Top ; Lặp cho tới khi kết thúc. Trong ví dụ này ta sử dụng JNC (Jump If No Carry) sẽ thực thi khi CF=0. c- RCL Lệnh RCL dịch chuyển các bit của Dich sang trái, Bit cao nhất chuyển vào cờ CF và giá trị trong CL sẽ đ•ợc chuyển vào bit thấp nhất. Cũng giống lệnh ROL nh•ng CF là một thành phần. Cú pháp: RCL Dich,1 và RCL Dich,CL d- RCR Giống lênh RCL nh•ng bit dịch chuyển sang bên phải. Cú pháp: RCR Dich,1 RCL Dich,CL This document is created with the unregistered version of Document2PDF Pilot. Chýừng 7: Các chế độ làm việc với mảng và đánh địa chỉ I- Giới thiệu Trong nhiều ứng dụng, việc nhóm các giá trị thành từng tập hợp là rất cần thiết. Ví dụ chúng ta cần phải đọc một tâph hợp các kết quả và tính toán ra giá trị trung bình của chúng, để làm việc này ta th•ờng phải l•u giữ các kết quả thành một dãy đ•ợc sắp xếp theo giá trị tăng dần. Trong các ngôn ngữ lập trình, có một cấu trúc dữ liệu đ•ợc gọi là mảng. Ta có các loại mảng một chiều, mảng hai chiều và mảng đa chiều. Sau đây ta sẽ lần l•ợt khảo sát các loại mảng trên để có thể hiểu đ•ợc cách tổ chức nhóm giá trị trong bộ nhớ và cách thức sử dụng ngôn ngữ lập trình để thao tác với chúng II- Các lệnh ứng dụng. 1- Mảng 1 chiều (1 Dimensional Array). Mảng 1 chiều là một danh sách các thành phần đ•ợc sắp xếp theo thứ tự, tất cả các thành phần đều có cùng một kiểu dữ liệu. Nếu A là một mảng, các thành phần th•ờng đ•ợc mô tả là A[1], A[2], A[3], A[4]…Ví dụ về khai báo một mảng MSG DB 'abcde' Địa chỉ của biến mảng đ•ợc gọi là địa chỉ cơ sở của mảng. Nếu địa chỉ độ dời (Offset) đ•ợc gán cho là W (Word) là 0200h, trong bộ nhớ, mảng đ•ợc sắp xếp nh• sau: Địa chỉ Offset Ký hiệu địa chỉ Giá trị thập phân 0200h W 10 0202h W+2h 20 0204h W+4h 30 0206h W+6h 40 0208h W+8h 50 020Ah W+2A 60 2- Toán hạng DUP Chúng ta có thể định nghĩa nhiều mảng má các thành phần chia sẻ giá trị khởi tạo bằng cách sử dụng toán hạng DUP (Duplicator). Định dạng của chúng nh• sau Repeat_Count DUP(Value) Ví dụ: Gamma DW 100 DUP(0) Tổ chức một mảng gồm 100 Words, Mởi tạo bằng 0, t•ơng tự Delta DB 212 DUP(?) Tổ chức một mảng 212 Words, không có giá trị khởi tạo. 3- Chế độ đánh địa chỉ Cách thức một toán hạng đ•ợc xác định là nhờ vào chế độ đánh địa chỉ (Addressing Modes). Chế độ đánh địa chỉ mà chúng ta khảo sát từ tr•ớc tới giờ là + Chế độ thanh ghi (Các toán hạng là thanh ghi) + Chế độ tức thì (Các toán hạng là hằng số) + Chế độ Trực tiếp (Các toán hạng là biến) Ví dụ: Mov AX,0 (Thanh ghi, hằng số) Add Alpha,AX (Biến, thanh ghi). Có 4 chế độ đánh địa chỉ trong hệ thống 8086: 1- Thanh ghi gián tiếp (Register Indirect) This document is created with the unregistered version of Document2PDF Pilot. 2- Cơ sở (Based) 3- Index 4- Base Index Các chế độ trên đ•ợc sử dụng để đánh địa chỉ bộ nhớ một cách gián tiếp. 4- Chế độ dùng thanh ghi gián tiếp Trong chế độ này, địa chỉ độ dời của toán hạng đ•ợc chứa trong thanh ghi. Ta có thể nói các thanh ghi hành động nh• một con trỏ trỏ đến bộ nhớ. Định dạng nh• sau: [Thanh ghi] Các thanh ghi BX, SI, DI hoặc BP. Với thanh ghi BX, SI, DI, số hiệu đoạn (Segment number) của toán hạng đ•ợc chứa trong DS. Với BP, SS , trực tiếp chứa số hiệu đoạn. Ví dụ: SI chứa 0100hvà Word tại 0100h chứa giá trị 1234h: Mov AX,[SI] + CPU sẽ kiểm tra SI và lấy địa chỉ Offset 100h, + Sử dụng địa chỉ DS:0100h để lấy giá trị 1234h + Chuyển giá trị 1234h sang thanh ghi AX So sánh với: Mov AX,SI + Đơn thuần là chuyển giá trị địa chỉ 0100h từ SI vào AX 5- Chế độ cơ sở và chế độ chỉ số địa chỉ. Trong các chế độ này, địa chỉ Offset của toán hạng đ•ợc tìm thấy bằng cách thêm vào một số đ•ợc gọi là Displacement đến nội dung của thanh ghi. Displacement có thể là:: + địa chỉ Offset của biến + Hằng số (D•ơng hoặc âm) + địa chỉ Offset của biến trừ đi hoặc cộng thêm một hằng số. Nếu A là biến, ta có: A (địa chỉ Offset của biến) -2 (Hằng số) A + 4 (Địac chỉ Offset của biến cộng với hằng số) Cú pháp của toán hạng: [Thanh ghi + Displacement] [Displacement + Thanh ghi] [Thanh ghi] + Displacement Displacement + [Thanh ghi] Displacement[Thanh ghi] Các thanh ghi phải là BX, BP, SI hoặc DI. Trong tr•ơng fhợp các thanh ghi BX, SI hoặc DI đ•ợc sử dụng, DS chứa số hiệu segment của địa chỉ toán hạng. Nếu sử dụng BP, SS chứa số hiệu Segment. Chế độ đánh địa chỉ đ•ợc gọi là cơ sở (Based) nếu BX hoặc BP đ•ợc sử dụng, Chỉ số (Index) nếu SI hoặc DI đ•ợc sử dụng. Ví dụ: W là mảng Word, BX chứa 4. Mov AX,W[BX] Displacement là địa chỉ Offset của biến W. Câu lệnh chuyển thành phần tại địa chỉ W + 4 vào thanh ghi AX. Đây là thanh phần thứ 3 của mảng. Câu This document is created with the unregistered version of Document2PDF Pilot. lệnh trên có thể đ•ợc viết theo các định dạng khác nh• sau: Mov AX,[W+BX] Mov AX,[BX+W] Mov AX,W+[BX] Mov AX,[BX] - W Một ví dụ khác: SI chứa địa chỉ mảng W. Mov AX,[SI + 2] Displacement là 2. Câu lệnh di chuyển nội dung của W+2 là thành phần thứ 2 của mảng vào AX. Câu lệnh có thể đ•ợc viết theo các định dạng sau: Mov AX,[2+SI] Mov AX,2+[SI] Mov AX,2[SI] Mov AX,[SI]+2 6- Chế độ đánh địa chỉ cơ sở chỉ số. Trong chế đọ này, địa chỉ Offset của toán hạng là tổng của: + Nội dung thanh ghi BX, BP. + Nội dung thanh ghi SI, DI. + Địa chỉ Offset của biến + Hằng số (âm hoặc d•ơng). Nếu BX đ•ợc sử dụng, DS chứa số hiệu Segment của địa chỉ toán hạng. Nếu BP đ•ợc sử dụng, SS chứa số hiệu Segment. Toán hạng có thể đ•ợc biểu diễn theo nhiều dạng nh• sau: + Vatiable[Base_register][Index_register] + [Base_register + Index_register + Variable + Constant] + Variable[Base_register+Index_register+Constant] + Constant[Base_register+Index_register+Variable] Thứ tự trong dấu [] có thể thay đổi. This document is created with the unregistered version of Document2PDF Pilot. Chýừng 8: Ngắt BIOS I- Giới thiệu Trong các phần tr•ớc, chúng ta đã đề cập đến việc sử dụng lệnh Int để gọi các tiểu trình. Trong ch•ơng này, chúng ta đi vào nghiên cứu nhiều loại ngắt khác nhau để tiếp cận tốt hơn vói câu lệnh Int. 1- Dịch vụ ngắt a- Ngắt cứng (hardware Interrupts) Ngắt cứng cho phép thiết bị ng•ng các thao tác của CPU. Ví dụ nh• Khi bàn phím đ•ợc bấm, CPU nhận đ•ợc tín hiệu đọc mã phím vào bộ đệm bàn phím. + Một thiết bị phần cứng cần dịch vụ để gửi tín hiệu yêu cầu ngắt (Interrupt Request) tới bộ xử lý. + CPU ng•ng công việc đang thực hiện, xử lý yêu cầu và chuyển điều khiển cho tiểu trình ngắt (Interrupt Routine). + Dịch vụ ngắt phục vụ thiết bị phần cứng bằng cách thực hiện một số thao tác vào ra. + Điều khiển đ•ợc trả về tác vụ gốc tại thời điểm nó bị ngắt (CPU xử lý tiếp ch•ơng trình bị ng•ng lúc đầu). Tín hiệu ngắt có thể đến bất cứ thời điểm nào, CPU kiểm tra tín hiệu yêu cầu ngắt ngay khi xử lý xong một lệnh. Trong quá trình kiểm tra phát hiện tín hiệu ngắt, CPU đáp trả bằng cách đ•a ra tín hiệu Nhận biết (Interrupt Acknowledge Signal). Thiết bị ngắt đáp trả bằng cách gửi một số 8 bit trên BUS dữ liệu (Interrupt Number). Mỗi thiết bị sử dụng một số hiệu ngắt đ•ợc xác định bởi chính chúng. Việc gửi và nhận tín hiệu đ•ợc gọi là Bắt tay (Hand Shaking). Điều này rất cần thiết để xác định thiết bị yêu cầu ngắt b- Ngắt mềm (Software Interrupt) Ngắt mềm đ•ợc sử dụng bởi các ch•ơng trình để yêu cầu dịch vụ hệ thống. Một ngắt mềm xảy ra khi một ch•ơng trình gọi tiểu trình ngắt sử dụng lệnh INT. Định dạng của lệnh INT nh• sau: INT Interrupt_Number CPU xử lý ngắt mềm t•ơng tự nh• xử lý với ngắt cứng c- Loại trừ xử lý (Processor Exception): Loại ngắt thứ ba mà ta đề cập đến là Loại trừ xử lý (Processor Exception). Ngắt này xảy ra khi điều kiện tăng nhanh trong CPU nh• Tràn phép chia (Chia cho 0), điều này yêu cầu điều khiển đặc biệt. Mỗi điều kiện đáp ứng một loại ngắt duy nhất. Ví dụ Tràn phép chia là 0, do đó khi việc tràn xảy ra trong lệnh chia, CPU tự động xử lý ngắt 0 để điều khiển việc tràn số. 2- Bảng Vector ngắt: Các số hiệu ngắt trong 8086 là các giá trị Byte không dấu, do đó cso tới 256 loại ngắt. Không phải số hiệu ngắt nào cúng đ•ợc đáp ứng bởi tiểu trình ngắt. Các nhà sản xuất máy tính cung cấp các dịch vụ ngắt cứng trong ROM, chúng là các tiểu trình ngắt BIOS. Các tiểu trình ngắt hệ thống bậc cao nh• Int 21h là 1 thành phần của hệ điều hành DOS đ•ợc nạp vào bộ nhớ ngay khi máy tính khởi động. Một vài số hiệu ngắt đ•ợc dành riêng bởi hệ thống của IBM dành cho công việc dau này. Các ngắt còn lại dành cho ng•ời dùng. This document is created with the unregistered version of Document2PDF Pilot. Ngắt 0 1Fh Các ngắt BIOS Ngắt2 0 3Fh Các ngắt DOS Ngắt 40 7Fh Các ngắt để dành Ngắt 80 F0h Các ngắt ROM Basic Ngắt F1h FFh Không sử dụng CPU không tạo ra địa chỉ ngắt trực tiếp từ số hiệu ngắt , vì vậy các tiểu trình ngắt phải đ•ợc l•u trữ tại một vị trí cố định trong các hệ thống máy tính. Các tiểu trình ngắt đ•ợc l•u trong một địa chỉ bộ nhớ đã đ•ợc đặt tr•ớc và đ•ợc gọi là Bảng Vector ngắt (Interrupt Vector). Các Vector ngắt đ•ợc l•u trong bảng Vector ngắt, nó chiếm vị trí tại 1 KB đầu tiên của bộ nhớ. Mỗi Vector ngắt đ•ợc đánh địa chỉ Segment:Offset và có độ dài 4 bytes. 4 Byte đầu tiên của bộ nhớ là Vector ngắt 0. Để xác định đ•ợc Vector nào cho tiểu trình ngắt, chúng ta chỉ việc nhân số hiệu ngắt với 4. Điều này xác định vị trí của bộ nhớ chứa Offset của tiểu trình ngắt. Địa chỉ Segment của tiểu trình nằm trong Word kế tiếp. Ví dụ: Ngắt 9 (Keyboard) Địa chỉ Offset đ•ợc l•u trong 9 x 4 = 36 = 00024h Địa chỉ Segment là: 24h + 2 = 26h BIOS khởi tạo các Vector ngắt khi máy tính đ•ợc bật. Các ngắt DOS đ•ợc khởi tạo khi DOS đ•ợc nạp. II- Các ngắt BIOS. 1- Ngắt loại 0h 7h Các ngắt từ 0 đến 7 đ•ợc dành riêng cho Intel. Từ 0 đến 4 đã đ•ợc định sẵn. IBM sử dụng 6 và 7. a- Ngắt 0 - Divide Overflow: Xảy ra khi sử dụng các lệnh DIV hoặc IDIV gây ra tràn số. Tiểu trình ngắt 0 hiển thị thông báo "Divide Overflow" và trả ch•ơng trình về DOS b- Ngắt 1- Single Step: Ngắt 1 xảy ra khi cờ TF đ•ợc bật. c- Ngắt 2- Nonmaskable Interrupt: Ngắt 2 là ngăt cứng và nó không thể che bằng cách xoá cờ IF, IBM sử dụng ngắt này để báo hiệu lỗi Parity cho bộ nhớ (Bad Chip). d- Ngắt 3- Breakpoint: Lệnh "Int 3" là lệnh một Byte (CCh) trong khi các lệnh khác là lệnh 2 Bytes. Ta có thể đặt lệnh Int 3 bất kì nơi nào trong ch•ơng trình để thay thế Opcode. Ch•ơng trình Debug sẽ sử dụng lệnh này để thay thế lệnh G (Go). e- Ngắt 4- Overflow: tạo ngắt bởi lệnh INTO (Ngắt nếu bị tràn) khi OF đ•ợc thiết lập. f- Ngắt 5- Print Screen: Chuyển thông tin từ màn hình ra máy in. Lệnh Int 5 sẽ đ•ợc thực thi khi nhấn PrintScreen trên bàn phím. 2- Ngắt loại 8h Eh a- Ngắt 8- Timer: Mạch Timer của hệ thống IBM tạo ra một ngắt mỗi 54.92 This document is created with the unregistered version of Document2PDF Pilot. ms. Ngắt BIOS số 8 phục vụ mạch đồng hồ. Sử dụng tín hiệu đồng hồ để l•u giữ ngày giờ hệ thống. b- Ngắt 9- Keyboard: Ngắt sinh ra mỗi khi một phím đ•ợc nhấn. Tiểu trình trong BIOS sẽ đọc mã quét và l•u trữ lênh bộ đệm bàn phím. c- Ngắt Eh- Diskette Error: Diều khiển lỗi ổ mềm. 3- Ngắt loại 10h 11h: Có thể đ•ợc gọi bởi ch•ơng trình ứng dụng để thực hiện các thao tác vào ra và kiểm tra trạng thái. a- Ngắt 10h- Video: tiểu trình ngắt BIOS 10h điều khiển hiển thị. b- Ngắt 11h- Equipment Check: kiểm tra cấu hình hệ thống PC. Mã trả về l•u trong AX. c- Ngắt 12h- Memory Size: Trả lại thanh ghi ã dung l•ợng bộ nhớ cơ sở. d- Ngắt 13h- Disk I/O: điều khiển ổ đĩa, cho phép các ứng dụng thao tác vào ra với các ổ đĩa. e- Ngắt 14h- Communication: Điều khiển truyền thông qua cổng tuần tự. f- Ngắt 15h- Cassette: Sử dụng cho giao diện Cassette của các hệ thống cũ. Với các hệ thống AT và PS/2 đ•ợc sử dụng cho rất nhiều dịch vụ. g- Ngắt 16h- Keyboard I/O:Điều khiển bàn phím. h- Ngắt 17h- Printer I/O: Điều khiển máy in. tiểu trình này gồm có 3 chức năng từ 02. Chức năng 0 gửi ký tự ra máy in. Nhập AH=0, AL=Ký tự, DX Số hiệu máy in.. Chức năng 1 Khởi tạo cổng máy in. Nhập AH=1, DX=Số hiệu máy in. Chức năng 2 nhận lại trạng thái máy in, Nhập AH=2, DX = Số hiệu máy in. Trạng thái sẽ đ•ợc l•u trong thanh ghi AH. i- Ngắt 18h- BASIC:Chuyển điều khiển cho ROM BASIC. j- Ngắt 19h- Bootstrap: Reboot hệ thống. k- Ngắt 1Ah- Time Of Day: Cho phép ch•ơng trình lấy hoặc thiết lập bộ đếm đồng hồ. l- Ngắt 1Bh- CRTL-Break:Đ•ợc gọi bởi lệnh INT 9 khi tổ hợp phím CRTL-Break đ•ợc nhấn. Tiểu trình BIOS chỉ chứa có một chức năng IRET. m- Ngắt 1Ch- Timer tick: Đ•ợc gọi bởi lệnh INT 8 mỗi khi mạch Timer sinh ngắt. n- Ngắt 1Dh - 1Fh: Các vector ngắt trỏ tới dữ liệu thay vì các lệnh. Các vector ngắt 1Dh, 1Eh và 1Fh trỏ đến các tham số khởi tạo Video, Diskette, Ký tự đồ hoạ màn hình. This document is created with the unregistered version of Document2PDF Pilot. This document is created with the unregistered version of Document2PDF Pilot.

Các file đính kèm theo tài liệu này:

  • pdfComarch08_20050429_013838.pdf