Tài liệu tham khảo về Hệ thống điều khiển chương trình số
Full description
Full description
Full description
Full description
ngon ngu lap trinh
Full description
Full description
Thuc Hanh Lap Trinh LispFull description
Full description
Full description
Full description
Full description
danh cho do an say thung quay ca phe nhan
Full description
Full description
TR ƯỜ ƯỜ NG NG ĐẠI ĐẠI HỌ HỌC C ẦN ẦN THƠ THƠ KHOA CÔNG NGHỆ NGHỆ BỘ MÔN ĐIỆN TỬ TỬ -- VIỄ VIỄN THÔNG
Giáo trình
LẬP TRÌNH HỆ THỐNG Biên soạn:
ThS. Nguyễ Nguyễn Hứ Hứ a Duy Khang Ks. Tr ần ần Hữ Hữ u Danh
-ĐHCTTháng 5-2008
Lậ p trình H ệ Thố ng ng
NỘI DUNG
Chươ ng Chươ ng 1 - TỔ CHỨ CHỨ C BỘ BỘ XỬ LÝ Ử LÝ INTEL-8086 ................... ................................. ........................... ............... 1 1.1. Bộ xử lý Intel-8086 (CPU-8086) .................. ................................ ........................... ........................... .......................... ............ 1 1.1.1. Cấu trúc tổng quát ........................... ......................................... ........................... ........................... ........................... ...................... ......... 1 1.1.2. Các thanh ghi c ủa 8086 .......................... ........................................ ........................... .......................... ........................... .................. 2 1.1.3. Tr ạng thái tràn: ............................ .......................................... ........................... ........................... ............................ .......................... ............ 5 1.2. Bộ nhớ trong của Intel-80x86............................. .......................................... ........................... ........................... .................... ....... 5 1.2.1. Tổ chức dữ liệu ........................... ........................................ ........................... ........................... ........................... ........................... ............... 5 1.2.2. Sự phân đoạn bộ nhớ trong........................... ........................................ .......................... .......................... ........................ ........... 6 1.3. Địa chỉ các ngoại vi .......................... ........................................ ........................... ........................... ........................... ........................ ...........7 1.4. Các bộ xử lý Intel khác ........................ ..................................... ........................... ........................... .......................... ...................... ......... 8 1.4.1. Bộ xử lý Intel-80386........................ Intel-80386...................................... ........................... ........................... ........................... ...................... ......... 8 1.4.2. Tậ p thanh ghi c ủa bộ xử lý Intel-80386: ........................... ......................................... ........................... ................. 8 1.4.3. Các ch ế độ vận hành của bộ xử lý Intel-80386 .......................... ........................................ .................... ...... 9 1.4.4. Bộ xử lý Intel-80486: ........................... ........................................ ........................... ............................ ............................ ................. ... 10 1.4.5. Bộ xử lý Intel PENTIUM: ............................. ........................................... ............................ ........................... ..................... ........ 11 BÀI TẬP CHƯƠ NG 1 ........................... ........................................ ........................... ........................... ........................... .......................... ............ 13 Chươ Ch ươ ng ng 2 - HỢ HỢ P NGỮ NGỮ ............ ......................... ........................... ........................... ........................... ........................... ......................... ............ 15 2.1. Ngôn ngữ máy và hợ p ngữ ........................... ......................................... ........................... ........................... .......................... ............ 15 2.2. Đặc tính tổng quát của hợ p ngữ........................... ......................................... ........................... ........................... ................... ..... 16 2.2.1. Cấu trúc của một dòng lệnh hợ p ngữ. ......................... ....................................... ........................... ..................... ........ 16 2.2.2. Macro ........................... ......................................... ............................ ............................ ........................... ........................... ............................ .............. 17 2.2.3. Chươ ng ng trình con .............................. ........................................... ........................... ............................ ............................ ..................... ....... 17 2.2.4. Biến toàn cục (global), biến địa phươ ng ng (local) ...................... .................................... ....................... ......... 18 2.2.5. Các b ảng, thông báo: .......................... ........................................ ............................ ............................ ............................ .................. .... 18 2.2.6. Hợ p ngữ chéo (cross assembler) ............................ ......................................... ........................... ........................... ............. 19 2.3. Hợ p ngữ MASM (hợ p ngữ của CPU-8086) ...................................... .................................................... .................. 19 2.3.1. Cấu trúc của một hàng lệnh .......................... ........................................ ........................... .......................... ....................... .......... 19 2.3.2. Tên ........................... ........................................ ........................... ........................... .......................... ........................... ........................... .................... ....... 19 2.3.3. Từ gợ i nhớ mã lệnh, lệnh giả.......................... ....................................... ........................... ........................... ..................... ........ 20 2.3.4. Toán hạng và toán t ử ........................... ........................................ ........................... ........................... .......................... ................... ...... 27 2.4. Cấu trúc của chươ ng ng trình hợ p ngữ MASM.......................... ....................................... .......................... ................. 30 2.4.3. Tậ p tin thi hành d ạng COM và d ạng EXE ............................ .......................................... ......................... ........... 31 2.4.4. Ví dụ ........................... ........................................ ........................... ........................... ........................... ........................... .......................... ................. .... 32 2.5. Cách tạo chươ ng ng trình hợ p ngữ ........................... ......................................... ........................... ........................... ................... ..... 33
Lậ p trình H ệ Thố ng ng
Chươ ng Chươ ng 3 - TẬ TẬP LỆ LỆNH CPU-8086 ĐƠ N GIẢ GIẢN và KIỂ KIỂU ĐỊNH ĐỊNH VỊ VỊ ................ ................ 36 3.1. Tậ p lệnh của CPU-8086 .......................... ........................................ ........................... ........................... ........................... ................. .... 36 3.1.1. Lệnh sao chép dữ liệu, địa chỉ: ......................... ....................................... ........................... ........................... ................... ..... 36 3.1.2. Lệnh tính toán số học. .......................... ....................................... ........................... ........................... ........................... .................. .... 38 3.1.3. Nhóm lệnh logic và ghi d ịch .......................... ........................................ ........................... ........................... ..................... ....... 39 3.1.4. Nhóm lệnh vào ra ngoại vi. ............................ .......................................... ........................... ........................... ..................... ....... 42 1.3.5. Nhóm lệnh hệ thống .......................... ....................................... ........................... ........................... ........................... ..................... ....... 43 3.2. Kiểu định vị ......................... ....................................... ........................... ........................... ........................... ........................... ........................ .......... 43 3.2.1. Định vị tức thì:.................................. ............................................... ........................... ........................... ........................... ...................... ........ 44 3.2.2. Định vị thanh ghi ........................... ......................................... ............................ ........................... ........................... ........................ .......... 44 3.1.3. Định vị tr ực tiế p (bộ nhớ ): ):......................... ....................................... ........................... ........................... .......................... ............ 44 3.1.4. Định vị gián tiế p thanh ghi ..................................... .................................................... ............................. ......................... ........... 45 3.1.5. Định vị nền .......................... ....................................... ........................... ........................... ........................... ........................... ..................... ........ 45 3.1.6. Định vị chỉ số........................... ......................................... ........................... ........................... ........................... ........................... ................. ... 46 3.1.7. Định vị chỉ số nền ........................... ......................................... ........................... ........................... ........................... ....................... .......... 46 3.1.8. Định vị chuỗi .......................... ....................................... .......................... .......................... .......................... .......................... .................... ....... 46 3.1.9. Định vị cổng vào/ra ........................... ......................................... ............................ ............................ ........................... ................... ...... 47 BÀI TẬP CHƯƠ NG 3 ........................... ........................................ ........................... ........................... ........................... .......................... ............ 48 Chươ Ch ươ ng ng 4 - HỆ HỆ THỐ THỐNG NGẮ NGẮT MỀ MỀM .......................... ....................................... .......................... ......................... ............ 50 4.1. Những cơ sở của ngắt mềm .......................... ........................................ ........................... ........................... .......................... ............ 50 4.2. Sử dụng ngắt trong hợ p ngữ ......................... ....................................... ........................... ........................... .......................... ............ 50 4.3. Ngắt MS-DOS ......................... ....................................... ........................... ........................... ........................... .......................... .................... ....... 51 4.4 Các ví d ụ ........................... ........................................ ........................... ........................... ........................... ........................... ........................... ................ 56 Chươ Ch ươ ng ng 5 - LỆ LỆNH NHẢ NHẢY VÀ VÒNG LẶ LẶP ........................... ......................................... ........................... ................ ... 60 5.1. Lệnh nhảy (chuyển điều khiển) ......................... ....................................... ........................... ........................... ..................... ....... 60 5.1.1. Lệnh nhảy không điều kiện .......................... ....................................... ........................... ........................... ....................... .......... 60 5.1.2. Lệnh nhảy có điều kiện: ........................... ........................................ .......................... ........................... ........................... ............... 61 5.2. Vòng lặp .......................... ........................................ ........................... ........................... ........................... ........................... ........................... ............... 64 BÀI TẬP CHƯƠ NG 5 ........................... ........................................ ........................... ........................... ........................... .......................... ............ 66 Chươ Ch ươ ng ng 6 - NGĂ NGĂN XẾ XẾP VÀ CHƯƠ CHƯƠ NG NG TRÌNH CON ................ .............................. ....................... ......... 68 6.1. Ngăn xếp .......................... ........................................ ........................... ........................... ........................... .......................... ........................... ................ 68 6.1.1. Tổ chức và vận hành.................................. ................................................ ............................ ........................... ......................... ............ 68 6.1.2. Truy xu ất ngăn xếp ......................... ....................................... ........................... ........................... ........................... ....................... .......... 69 6.2. Chươ ng ng trình con ............................... ............................................ ........................... ............................ ............................ ....................... ......... 70 6.2.1. Khai báo ch ươ ng ng trình con (Th ủ tục) ......................... ....................................... ........................... ...................... ......... 70 6.2.2. Gọi thủ tục ........................... ........................................ ........................... ........................... ........................... ........................... ..................... ........ 71 6.3. Các ví d ụ .......................... ....................................... ........................... ........................... ........................... ........................... ........................... ................ 71 BÀI TẬP CHƯƠ NG 6 ........................... ........................................ ........................... ........................... ........................... .......................... ............ 75
Lậ p trình H ệ Thố ng ng
Chươ ng Chươ ng 7 - XỬ XỬ LÝ LÝ KÝ SỐ SỐ VÀ XỬ XỬ LÝ LÝ CHUỖ CHUỖI .......................... ........................................ ....................... ......... 76 7.1. Xử lý ký tự ......................... ....................................... ........................... ........................... ........................... .......................... .......................... ............. 76 7.1.1. Nhậ p xuất số nhị phân (Binary)..................... (Binary)................................... ............................ ............................. ..................... ...... 76 7.1.2. Nhậ p xuất số thậ p lục phân (Hexa) ....................................... ..................................................... ......................... ........... 77 7.2. Lệnh xử lý chuỗi ......................... ....................................... ........................... ........................... ........................... ........................... ................. ... 78 7.2.1. Hướ ng ng xử lý chuỗi ........................... ........................................ .......................... .......................... .......................... ........................ ........... 79 7.2.2. Các tiền tố lậ p REP (Repeat) ................... ................................. ............................ ............................ ........................... ............. 79 7.2.3. Lệnh Ghi vào chu ỗi ........................... ........................................ .......................... .......................... .......................... ...................... ......... 80 7.2.4. Lệnh Nạ p từ chuỗi .......................... ........................................ ........................... ........................... ........................... ....................... .......... 81 7.2.5. Lệnh di chuyển chuỗi .......................... ....................................... .......................... ........................... ........................... ................... ...... 81 7.2.6. Lệnh So sánh hai chu ỗi.......................... ........................................ ........................... .......................... .......................... ................. .... 83 7.2.7. Lệnh dò tìm trong chu ỗi ........................... ........................................ .......................... .......................... .......................... ................. 85 BÀI TẬP CHƯƠ NG 7 ........................... ........................................ ........................... ........................... ........................... .......................... ............ 87 Phụ Phụ lục 1 - Hướ Hướ ng ng Dẫ Dẫn Sử Sử D Dụng Emu8086 ........................... ........................................ ........................... ................. ... 88 Phụ Phụ lục 2 – Tậ Tập Lệ Lệnh Intel-8086 .......................... ........................................ ........................... ........................... ...................... ........ 93 Phụ Phụ lục 3 – Bả Bảng mã ASCII ....................... ..................................... ........................... ........................... ............................ ................... ..... 117
Giớ i thiệu môn học
GIỚ I THIỆU MÔN HỌC I. MỤC ĐÍCH YÊU CẦU Môn Lậ p Trình Hệ Thống (CT143) cung cấ p cho sinh viên những kiến th ức c ơ bản về lậ p trình hệ thống trên máy tính IBM/PC thông qua H ợ p Ngữ (Assembly). Môn học này là n ền t ảng để tiế p thu hầu h ết các môn học khác trong ch ươ ng ng trình đào t ạo. Mặt khác, n ắm vững Hợ p ngữ là cơ sở để ở để phát triển các ứng dụng điều khiển thiết bị. Học xong môn này, sinh viên ph ải nắm đượ c các vấn đề sau: - Tổ chức bộ xử lý Intel-8086 - Cấu trúc chươ ng ng trình Hợ p ngữ - Tậ p lệnh của Intel-8086 - Hệ thống ngắt mềm trên máy tính IBM/PC - Lệnh nhảy và vòng lậ p trong Assembly - Ngăn xế p và Th ủ tục - Xử lý số và Chuỗi II. ĐỐI TƯỢNG MÔN HỌC Môn học đượ c dùng để giảng dạy cho các sinh viên sau: - Sinh viên n ăm thứ 3 của các chuyên ngành Điện tử III. NỘI DUNG CỐT LÕI Giáo trình đượ c cấu trúc thành 7 ch ươ ng: ng: Chươ ng ng 1: T ổ ổ chứ c bộ xử lý Intel-8086 Chươ ng ng 2: H ợ ợ p ng ữ ữ Chươ ng ng 3: T ậ p l ệnh và Kiể u định vị Chươ ng ng 4: H ệ thố ng ng ng ắ ắt mề m Chươ ng ng 5: L ệnh nhả y và Vòng l ậ p Chươ ng ng 6: Ng ă ng trình con ăn xế p và Chươ ng Chươ ng ng 7: X ử ử lý số và Chuỗ i
IV. KIẾN THỨC LIÊN QUAN Để học tốt môn Lậ p trình Hệ thống, sinh viên cần phải có các ki ến thức nền tảng sau: - Kiến thức K ỹ thuật số. - Kiến thức Kiến trúc máy tính - Kiến thức Ngôn ngữ lậ p trình c ấ p cao: C, Pascal, Delphi ... - K ỹ năng thao tác sử dụng máy tính.
Giớ i thiệu môn học
V. DANH MỤC TÀI LIỆU THAM KHẢO [1] Nguyễn Văn Linh, Lâm Hoài B ảo, Dươ ng ng Văn Hiếu, Giáo trình L ậ p trình că n bản A, Khoa Công Nghệ Thông Tin, Đại học Cần Thơ , 2005. [2] Nguyễn Đình Tê, Hoàng Đức Hải , Giáo trình lý thuy ế t và bài t ậ p ngôn ng ữ ữ C ; Nhà xuất bản Giáo dục, 1999. [3] Nguyễn Cẩn, C – Tham khảo toàn di ện, Nhà xuất bản Đồng Nai, 1996. [4] Brain W. Kernighan & Dennis Ritchie, The C Programming Language , Prentice Hall Publisher, 1988.
ng , Khoa Công Nghệ Thông Tin, Đại học ữ hệ thố ng [5] Võ Văn Chín, Bài giảng Ngôn ng ữ Cần Thơ , 1994.
T ổ ổ chứ c bộ xử lý Intel-8086
Chươ Chương ng 1 TỔ CHỨ CHỨ C BỘ BỘ XỬ LÝ Ử LÝ INTEL-8086 Mục đích: - Cấ Cấu trúc bên trong CPU Intel-8086 - Tậ Tậ p thanh ghi - Tổ Tổ chứ chức bộ bộ nh nhớ ớ và dữ dữ liliệ ệu - Khái quát các bộ b ộ xử lý Intel khác như nh ư: 80386, 80486, Pentium 1.1. BỘ XỬ LÝ INTEL-8086 (CPU-8086) 1.1.1. Cấu trúc t ổng quát Intel-8086 là mộ một CPU 16 bit (bus dữ dữ liliệ ệu ngoạ ngoại có 16 dây). Nó được ược dùng để chế chế tạo các máy vi tính PC-AT đầu tiên củ của hãng IBM vào n ăm 1981. Trong thự thực tế tế, hãng IBM đã dùng CPU 8088 (là mộ một dạng của CPU 8086 vớ với bus số số liliệ tiế p ệu giao tiế với ngoạ ngoại vi là 8 bit) để chế chế tạo máy vi tính cá nhân đầu tiên gọ gọi là PC-XT. Cho đến nay CPU 8086 đã không ngừ ngừng cả c ải tiế ti ến và đã tr ải qua các phiên bả bản 80186, 80286, 80386, 80486, Pentium (80586), Pentium Pro, Pentium MMX, Pentium II, III, 4. Các CPU trên tươ t ương thích từ trên xuố xuống (downward compatible) ngh ĩ a là tậ p lệnh của các CPU mớ m ới chế chế tạo gồm các tậ tậ p lệnh của CPU chế chế tạo tr ưóc đó ược bổ bổ sung thêm nhiề nhiều lệ lệnh mạ mạnh khác. được Cấu trúc tổ tổng quát củ của CPU-8086 có dạ dạng như như hình 1.1, gồm 2 bộ b ộ ph phậ ận chính là: Bộ Bộ thự thực hiệ hiện lệ lệnh và bộ bộ ph phậ ận giao tiế tiế p bus. 1. Bộ phận thực hiện lệnh (EU): Thi hành các tác vụ v ụ mà lệ l ệnh yêu cầ cầu nh như ư: Kiểm soát các thanh ghi ( đọc/ghi), giả giải mã và thi hành lệ l ệnh. Trong EU có bộ bộ tính toán và luậ lu ận lý (ALU) thự th ực hiệ hiện được ược các phép toán số s ố học và luậ luận lý. Các thanh ghi đa dụ dụng là các ô nhớ nh ớ bên trong CPU chứ chứa dữ liliệ ệu tương tự nh như ư ô nhớ trong bộ bộ nh nhớ ớ. Cờ cũng là một thanh ghi dùng để ghi lạ lại tr ạng thái hoạ hoạt động của ALU. Thanh ghi lệ lệnh chứ chứa nộ nội dung lệ lệnh hiệ hiện tạ tại mà CPU đang thự thực hiệ hiện. Các thanh ghi và bus trong EU đều là 16 bit. EU không k ết nố n ối tr ực titiế ế p với bus hệ hệ thố thống bên ngoài. Nó lấ lấy lệ lệnh từ t ừ hàng chờ chờ lệnh mà BIU cung cấ cấ p. Khi có yêu cầ cầu truy xuấ xuất bộ b ộ nh nhớ ớ hay ngoạ ngoại vi thì EU yêu cầ c ầu BIU làm việ việc. BIU có thể thể tái định địa chỉ chỉ để cho phép EU truy xuấ xuất đầy đủ 1 MB (8086 có 20 ường địa chỉ chỉ ngo ngoạ ại). đường 2. Bộ giao tiếp bus (BIU): BIU thự thực hiệ hiện chứ chức năng giao tiế tiế p giữ giữa EU vớ với bên ngoài (Bộ (Bộ nh nhớ ớ, thiế thiết bị ngoạ ngoại vi …) thông qua hệ h ệ thố thống BUS ngoạ ngoại (bus dữ dữ liliệ ệu và bus địa chỉ ch ỉ ). ). BIU thự thực hiệ hiện tất cả các tác vụ vụ về bus mỗ mỗi khi EU có yêu cầ c ầu. Khi EU cầ cần trao đổi dữ li liệ ệu với bên ngoài, BIU sẽ sẽ tính toán địa chỉ chỉ và truy xuấ xuất dữ liliệ ệu để phụ phục vụ vụ theo yêu cầ cầu EU. Trong BIU có 5 thanh ghi CS, DS, ES, SS và IP chứ ch ứa địa chỉ chỉ . Thanh ghi IP chứ chứa địa chỉ chỉ ccủa lệ lệnh sẽ sẽ được gọi là con tr ỏ lệnh. ược thi hành k ế titiế ế p nên gọ
T ổ ổ chứ c bộ xử lý Intel-8086 EU và BIU liên lạ lạc vớ v ới nhau thông qua hệ hệ thố thống bus nộ nội. Trong khi EU đang thự thực hi h iện lệ l ệnh thì BIU lấ lấy lệ l ệnh từ bộ nh nhớ ớ trong nạ nạ p đầy vào hàng chờ chờ lệnh (6 bytes). Do đó EU không phả phải đợi lấ lấy lệ lệnh từ từ bộ nh nhớ ớ. Đây là mộ một dạ dạng đơn giản củ của cache để tăng tố tốc độ đọc lệ lệnh.
ơ đ ồ khối củ a CPU 8086 Hình 1.1: S ơ 1.1.2. Các thanh ghi c ủa 8086 Thanh ghi (register) là thành phầ ph ần lưu trữ dữ liliệ ệu bên trong CPU, mỗ mỗi thanh ghi có độ dài nhấ nhất định (16 bit hoặ hoặc 8 bit) và được ược nhậ nhận biế biết bằ bằng mộ một tên riêng. Tùy vào độ dài và chứ chức n ăng mà thanh ghi có công dụ d ụng chứ chứa dữ d ữ liliệ ệu hoặ ho ặc k ết quả qu ả của phép toán, hoặ hoặc là các địa chỉ chỉ dùng dùng để định vị vị bộ nh nhớ ớ khi cầ cần thiế thiết. Nộ Nội dung củ của thanh ghi được ược truy xuấ xuất thông qua tên riêng củ c ủa nó, do đó tên thanh ghi là từ từ khóa quan tr ọng cầ cần phả phải lư lưu ý trong lậ p trình. CPU-8086 có 16 thanh ghi, mỗ m ỗi thanh ghi là 16 bit, có thể th ể chia 4 nhóm sau: những thanh 1. Thanh ghi đoạn: Gồm 4 thanh ghi 16 bit: CS, DS, ES, SS. Đây là nhữ ghi dùng để chứ chứa địa chỉ chỉ đoạn củ của các ô nhớ nhớ khi cầ cần truy xuấ xuất. Mỗ Mỗi thanh ghi quản lý 1 đoạn tố tối đa 64K ô nhớ nhớ trong bộ bộ nh nhớ ớ trong. Ngườ Ngườii sử sử dụng chỉ chỉ đoạn quả xuất ô nhớ nhớ dựa vào địa chỉ chỉ ttương đối. CPU (cụ (cụ thể thể là BIU) có được ược phép truy xuấ nhiệ nhi chuyển đổi địa chỉ chỉ tương đối thành địa chỉ chỉ tuy tuyệ xuất ệm vụ chuyể ệt đối để truy xuấ vào ô nhớ nhớ tuy tuyệ tương ứng trong bộ bộ nh nhớ ệt đối tươ ớ. (Xem phần t ổ chứ c bộ nhớ )
CS: Thanh ghi đoạn mã lệ lệnh, lư lưu địa chỉ chỉ đoạn chứ chứa mã lệ lệnh chươ chương trình của ngườ ngườii sử sử dụng
T ổ ổ chứ c bộ xử lý Intel-8086
DS: Thanh ghi đoạn dữ d ữ liliệ ệu, lưu địa chỉ ch ỉ đoạn chứ chứa dữ d ữ liliệ ệu (các biế biến) trong chươ chương trình. ES: Thanh ghi đoạn dữ d ữ liliệ ệu thêm, lư lưu địa chỉ ch ỉ đoạn chứ ch ứa dữ d ữ liliệ ệu thêm trong chươ chương trình. xế p, lư lưu địa chỉ chỉ đoạn củ của vùng ngăn xế xế p. SS: Thanh ghi đoạn ngăn xế 15
0
Code Segment Data Segment Extra data Segment Stack Segment
CS DS ES SS
Thông thườ thường ng bốn thanh ghi này có thể th ể chứ chứa nh nhữ ững giá tr ị khác nhau, do đó chươ chương trình có thể được ược truy cậ cậ p trên bố bốn đoạn khác nhau và chươ ch ương trình chỉ có thể thể truy cậ cậ p cùng 1 lúc tố tối đa bốn đoạn. Mặc khác, đối với nh nhữ ững chươ chương trình nhỏ, chỉ ch ỉ ssử dụng 1 đoạn duy nhấ nhất, khi đó cả c ả bốn thanh ghi đều chứ chứa cùng giá tr ị địa chỉ chỉ đoạn, gọ gọi là đoạn chung. 2. Thanh ghi đa dụng (General Register): Bao gồ gồm bốn thanh ghi đa dụng 16 bit (AX, BX, CX, DX). Mỗ M ỗi thanh ghi đa dụ dụng có thể thể được ược sử sử dụng vớ với nhiề nhiều mục đích khác nhau, tuy nhiên từ t ừng thanh ghi có công dụ dụng riêng củ của nó. 15
AX : Là thanh ghi tích l ũy cơ bản. Mọi tác vụ vụ vào/ra đều dùng thanh ghi này, tác vụ v ụ dùng số số liliệ ệu tức thờ thời, một số tác vụ vụ chuỗ chuỗi ký tự tự và các lệnh tính toán đều dùng thanh AX. nền dùng để tính toán địa chỉ chỉ ôô nhớ nhớ. BX: Thanh ghi nề thường ng dùng để đếm số lần trong mộ một lệnh vòng CX: Là thanh ghi đếm, thườ lặ p hoặ hoặc lệ lệnh xử xử lý chuổ chuổi ký tự tự. DX: Thanh ghi dữ d ữ liliệ ệu, thườ thường ng chứ chứa địa chỉ chỉ ccủa một số lệnh vào/ra, lệ lệnh tính toán số số học (k ể cả lệnh nhân và chia). Mỗi thanh ghi 16 bit có thể th ể chia đôi thành 2 thanh ghi 8 bit. Do đó, CPU-8086 có 8 thanh ghi 8 bit là: AH, AL; BH, BL; CH, CL; DH, DL (thanh ghi AH và AL tươ tương ứng vớ v ới byte cao và byte thấ th ấ p củ c ủa thanh ghi AX, tươ tương tự cho các thanh ghi 8 bit còn lạ l ại). Ví d ụ: AX = 1234h => AH = 12h, AL = 34h Chức năng chung 3. Thanh ghi con tr ỏ và chỉ số (Pointer & Index register) : Chứ của nhóm thanh ghi này là chứ ch ứa địa chỉ chỉ độ dời của ô nhớ nhớ trong vùng dữ dữ liliệ ệu hay ngăn xế xế p. chỉ ssố nguồ nguồn SI : Thanh ghi chỉ DI : Thanh ghi chỉ ch ỉ ssố đích
T ổ ổ chứ c bộ xử lý Intel-8086
BP: Thanh ghi con tr ỏ nền dùng để lấy số số liliệ ệu từ từ ngăn xế xế p. xế p luôn chỉ ch ỉ vào vào đỉ nh nh ngăn xế xế p. SP : Thanh ghi con tr ỏ ngăn xế 15
0
Source Index Reg. Destination Index Reg. Base Pointer Reg. Stack Pointer Reg.
SI DI BP SP
SI và DI chứ chứa địa chỉ ch ỉ độ dời củ của ô nhớ nhớ tương ứng trong đoạn có địa chỉ chỉ ch chứ ứa ữ liệu, còn g ọi là Biến). trong DS hoặ hoặc ES (d ữ n). Còn BP và SP chứ ch ứa địa chỉ chỉ độ dời củ c ủa ô nhớ nhớ tương ứng trong đoạn có địa chỉ ch ỉ ch chứ ứa trong SS, dùng để thâm nhậ nh ậ p số số liliệ ệu trong ngăn xế xế p. 4. Thanh ghi Đếm chương trình và thanh ghi trạng thái (Cờ): 15
0
Flag Register. Intrucstion Pointer Reg.
F IP •
•
Thanh ghi con tr ỏ lệnh IP (còn g ọi là PC – đ ếm chươ ng ng tr ình) ình) là thanh ghi 16 bit chứ chứa địa chỉ ch ỉ ccủa lệ l ệnh k ế titiế sẽ thự thực hiệ hi ện trong. Các lệ lệnh ế p mà CPU sẽ của chươ chương trình có địa chỉ chỉ đoạn trong CS. Thanh ghi Cờ Cờ (F) dài 16 bit, mỗ mỗi bit là mộ m ột cờ c ờ. Mỗ M ỗi cờ c ờ có giá tr ị 1 (g ọi là SET – Đặ hoặ ặc 0 (g ọi là CLEAR – Xóa). Xóa). Hình 1.2 mô tả tả 9 bit trong số số 16 Đặt) ho bit tươ tương ứng với 9 cờ tr ạng thái (các bit còn lạ l ại dùng cho dự dự tr ữ mở r ộng khi thiế thiết k ế các CPU khác) Thanh ghi cờ cờ được ược chia thành hai nhóm: cờ điều khiể khiển (bả (bảng 1.1) bao gồ gồm các cờ cờ dùng để điều khiể khiển o Nhóm cờ sự ho hoạ ạt động của CPU và giá tr ị của cờ được ược thiế thiết lậ p bằng các lệnh phầ phần mề mềm. cờ tr ạng thái (bả (bảng 1.2) bao gồ gồm các cờ cờ ph phả ản ánh k ết qu quả ả o Nhóm cờ thự thực hiệ hiện lệ lệnh cũng như như tr ạng thái củ của CPU 15 14 13 12 11 10
TF = 1: cho phép chươ chương ng trình chạ chạy từ từng bướ bướcc IF = 1: cho phép ngắ ngắt phầ phần cứ cứng DF = 1: thì SI và DI giả giảm 1 cho mỗ mỗi vòng lặ l ặp
T ổ ổ chứ c bộ xử lý Intel-8086 Nhóm cờ tr ạng thái
CF
Số giữ giữ (Carry)
PF
Chẳ Chẳn lẻ lẻ (Parity)
ZF
Số giữ giữ phụ phụ (Hafl) Zero
SF
Dấu (Sign)
OF
Tràn (Overflow)
AF
CF = 1: khi có số số nhớ nhớ hoặ hoặc mượ mượn n từ từ MSB trong phép cộ cộng hoặ hoặc tr ừ. (Có tthể b ị thay đổi theo l ệnh ghi d ị ch ch và quay) PF = 1: khi byte thấ thấp củ của thanh ghi kế kết quả quả một phép tính có số số lượng ch ẳn ượng bit 1 chẳ AF = 1: khi có nhớ nh ớ hoặ hoặc mượ mượn n từ từ bit 3 trong phép cộng hoặ hoặc tr ừ. Dùng trong các lệ lệnh vớ với số số BCD ZF = 1: khi kết quả quả của mộ một phép tính bằ bằng 0 SF = 1 khi kế kết quả quả phép tính là âm (MSB=1). SF = 0 khi kế kết quả quả dương ương (MSB=0) OF = 1: nế nếu kế kết quả quả vượt ượt quá khả khả năng tính toán củ c ủa CPU
Bảng 1.1: Ý nghĩ a cờ
1.1.3. Tr ạng thái tràn: Tr ạng thái tràn có thể thể không xả xảy ra (nế (nếu không tràn) hoặ hoặc xả x ảy ra (nế (nếu tràn có dấu, tràn không dấ dấu, đồng thờ thời tràn có dấ d ấu và không dấ dấu). Nói chung là có 2 tr ạng thái tràn: Tràn không dấ d ấu và Tràn có dấ d ấu. một giá tr ị có MSB=1 (bit dấ dấu) thì CPU luôn luôn cho đó là số số có dấ dấu. Lư u ý : Nếu mộ a. Tràn không dấu: CF=1 ụ : ADD AX, BX ; với AX = 0FFFFh, BX = 1 Ví d ụ - Nế Nếu xem đây là các số s ố không dấ dấu thì AX không đủ chứ chứa k ết quả qu ả nên TRÀN không dấ dấu, vậ vậy CF = 1 - Nế Nếu xem đây là các số s ố có dấ dấu thì k ết quả quả sẽ là 0 (vì AX = -1) nên không tràn, do đó OF = 0 b. Tràn có d ấu: OF = 1 Ví d ụ ụ : ADD AX, BX ; với AX = BX = 7FFFh = 32767 - Nế Nếu xem đây là các số s ố không dấ dấu thì AX = 7FFFh + 7FFFh = 0FFFEh = 65534 nên không tràn. - Nế Nếu xem đây là các số s ố có dấ d ấu thì tràn vì k ết quả qu ả vượt ượt quá phạ phạm vi cho phép đối với số có dấu (cộ (cộng 2 số số dương, kết qu quả ả lại là số số âm). Thậ Thật sự trong tr ường ường hợ hợ p này, CPU sẽ s ẽ làm cho OF = 1 theo qui tắ t ắc "Nhớ ra và vào MSB xả y ra không đ ồng thờ ii” ” ngh ĩ a là có nhớ nh ớ vào MSB như nhưng không có nhớ ra hoặ hoặc ngượ ng ượcc lạ lại thì tràn và không có hoặ ho ặc có nhớ nhớ ra và vào MSB thì không tràn. 1.2. BỘ NHỚ TRONG CỦA INTEL-80x86 1.2.1. Tổ chứ c dữ liệu Bộ nh nhớ ớ trong được ược tổ chứ chức thành mả mảng gồm các ô nhớ nh ớ 8 bit liên tự tực nhau. Các dữ dữ liliệ ệu có thể thể được ược ghi vào hoặ hoặc đọc ra (gọ (gọi là truy xuấ xu ất) từ từ bất cứ cứ vị trí ô nhớ nhớ nào. Mỗ Mỗi ô nhớ nhớ 8 bit được ược phầ phần cứ cứng quả quản lý bằ bằng mộ một địa chỉ chỉ vvật lý duy nhấ nhất. Việ Việc truy xuấ xuất nộ nội dung ô nhớ nhớ ph phả ải bằ bằng địa chỉ chỉ vvật lý này. Dữ liliệ ệu 8 bit được ược lư l ưu trữ bằng mộ m ột ô nhớ nhớ và địa chỉ ch ỉ ccủa ô nhớ nhớ chính là địa chỉ chỉ dùng để truy xuấ xuất dữ liliệ ệu. Dữ liliệ ệu nhiề nhiều hơn 8 bit được ược lưu trữ bởi nhiề nhiều ô
T ổ ổ chứ c bộ xử lý Intel-8086 nhớ liên tụ nhớ tục nhau. Theo quy ước ước Intel, byte dữ d ữ liliệ ệu cao được ược lư lưu ở ô nhớ nhớ có địa chỉ chỉ cao và byte dữ dữ liliệ ệu thấ thấ p hơ hơn lưu ở ô nhớ nhớ có địa chỉ chỉ th thấ ấ p hơ hơn. Khi đó, địa chỉ chỉ dùng dùng để ữ liệu) truy xuấ xuất dữ dữ liliệ ệu là địa chỉ chỉ ccủa ô nhớ nhớ thấ thấ p (ô nhớ chứ a byte thấ p nhất củ a d ữ Hình 1.3 mô tả tả việ việc tổ chứ chức các dữ dữ liliệ ệu có độ dài khác nhau trong bộ bộ nh nhớ ớ. Giá tr ị 5Fh (1 byte) được ược lư lưu trữ ở địa chỉ chỉ 0010h. 0010h. Giá tr ị 0A0B1h (2 byte) được ược lư lưu trữ bởi 2 ô nhớ nhớ có địa chỉ ch ỉ 0015h 0015h và 0016h, địa chỉ ch ỉ để truy xuấ xuất giá tr ị này là 0015h. Còn giá tr ị 0A2B1C0h (3 byte) được ược lư lưu trữ bởi 3 ô nhớ nhớ 0012h, 0013h và 0014h, do chỉ truy truy xuấ xuất giá tr ị ấy là 0012h. đó địa chỉ
(A0h là byte cao, B1h là byte thấ p)
Giá tr ị: 0A0B1h → (C0h byte thấ p nhất, A2h byte cao nhất)
Giá tr ị: 0A2B1C0h → Giá tr ị: 5Fh →
Bộ nhớ A0h B1h A2h B1h C0h 5Fh
Địa chỉ 0016h 0015h 0014h 0013h 0012h 0011h 0010h
ữ liệu trong bộ nhớ Hình 1.3: T ổ chứ c d ữ 1.2.2. Sự phân đoạn bộ nhớ trong CPU 8086 có không gian địa chỉ chỉ là 1MB (ứ (ứng với 20 bit địa chỉ chỉ ) Vậy CPU 20 8086 có thể thể qu quả bộ nh nhớ Bộ nh nhớ ản lý bộ ớ trong là 2 = 1MB. Bộ ớ 1 MB này được ược CPU-8086 quả qu ản lý bằ bằng nhiề nhiều đoạn 64 KB. Các đoạn có thể thể tách r ời ho hoặ ặc có thể thể chồ chồng lên nhau. Mỗi đoạn có mộ một địa chỉ chỉ đoạn 16 bit duy nhấ nhất, tùy vào mụ m ục đích sử sử dụng đoạn mà địa chỉ chỉ đoạn được ược lư lưu trữ trong thanh ghi đoạn tươ tương ứng. ngườ ườii lậ p trình, Địa chỉ chỉ ccủa ô nhớ nhớ trong bộ bộ nh nhớ ớ được ược xác định bởi Đối với ng hai thông số số 16 bit (gọ (gọi là địa chỉ chỉ logic): Địa chỉ chỉ Đoạn (segment) và địa chỉ chỉ độ dời (offset). Cách viết: Segment : Offset chỉ vvật lý củ của ô nhớ nhớ khi truy xuấ xuất sẽ sẽ được tự động chuyể chuyển đổi từ từ địa Địa chỉ ược BIU tự ứ c nhân nội dung củ a thanh ghi chỉ chỉ logic logic bằ bằng cách dị dịch trái thanh ghi đoạn bố bốn bit (t ứ đ oạn cho 16) r ồi cộ c ộng vớ v ới địa chỉ ch ỉ độ dời. Vì vậ vậy, ngườ ngườii lậ l ậ p trình không cầ cần địa chỉ ch ỉ vật lý củ của ô nhớ nhớ mà chỉ chỉ ccần biế biết địa chỉ chỉ logic logic củ của ô nhớ nhớ. ụ : đoạn CS có giá tr ị là 1002h, địa chỉ Ví d ụ chỉ độ dời củ của ô nhớ nhớ K trong đoạn CS là 500h (CS:0500h ho hoặ ặc 1002h:0500h). 1002h:0500h). Khi đó, địa chỉ chỉ vvật lý củ của ô nhớ nhớ K được ược tính như nh ư sau: ỉ đ oạn 4 bit) 10020h (d ị ch ch trái đ ị a chỉ đ + 0500h ( đ i) độ d ờ ờ i) đ ị a chỉ vật lý) 10520h ( đ Trong ví dụ dụ trên, đoạn CS có điểm bắt đầu ở địa chỉ chỉ vật lý 10020h. Độ dời 500h là khoả khoảng cách từ từ địa chỉ chỉ ccủa điểm bắt đầu của đoạn CS đến ô nhớ nhớ K (xem hình 1.4)
T ổ ổ chứ c bộ xử lý Intel-8086 Bộ nhớ Địa chỉ vật lý 10521h 10520h ← Độ dời 500h tính từ Ô nhớ nhớ K → từ điểm đầu đầu đoạn CS trong đoạn CS (CS:500h) 1051Fh --------10025h 501h ô nhớ Ô nhớ nhớ có độ dời 05h → 10024h 10023h 10022h Ô nhớ nhớ có độ dời 01h → 10021h Ô nhớ nhớ có độ dời 0h → 10020h ← Đi Điểm đầu đầu đoạn CS trong đoạn CS (CS:00h) 1001Fh
Hình 1.4: Đ ị Đ ị a chỉ vật lý củ a ô nhớ K trong đ oạn CS Khi truy xuấ xuất ô nhớ nhớ, BIU lấ lấy sẽ sẽ sử dụng địa chỉ chỉ đoạn trong thanh ghi đoạn tương ứng vớ với tính chấ chất củ của ô nhớ nhớ cần truy xuấ xuất: - Ô nhớ nhớ là Code (Mã lệ l ệnh) thì đoạn tươ tương ứng là CS. - Ô nhớ nhớ là Data (dữ (dữ liliệ ệu) thì đoạn tươ tương ứng là DS. - Ô nhớ nhớ nằm trên ngăn xế xế p thì dùng đoạn SS. - Khi truy xuấ xuất chuỗ chuỗi, DI và SI luôn chứ ch ứa độ dời củ của ô nhớ nhớ trong đoạn DS hay ES Khi khở khởi động, CPU 8086 nhả nhảy đến địa chỉ ch ỉ vvật lý cao nhấ nh ất củ c ủa bộ b ộ nh nhớ ớ trong ờ i 0) để lấy lệ ( đ lệnh. Địa chỉ chỉ này này ứng vớ với địa chỉ chỉ ccủa ROMđo ạn CS = 0FFFFh và đ ộ d ờ BIOS củ của bộ bộ nh nhớ ớ trong nơ nơi chứa chươ chương trình khởi động máy tính.
1.3. Địa chỉ các ngoại vi Các ngoạ ngoại vi đều có địa chỉ chỉ riêng riêng từ từ 0 đến 64K. CPU 8086 dùng các lệ l ệnh riêng biệ biệt để truy xuấ xuất ngoạ ngoại vi và bộ b ộ nh nhớ ớ trong. Muố Muốn truy xuấ xuất ngoạ ngoại vi, BIU chỉ ch ỉ cần đưa địa chỉ chỉ ccủa ngoạ ngoại vi lên 16 bit thấ th ấ p củ của bus địa chỉ chỉ (không (không có đoạn).
6 8 0 8 l e t n I
Memory 1 MByte
I/O 64 kByte
T ổ ổ chứ c bộ xử lý Intel-8086 Hình 1.5: C ấu trúc đ ơ ơ n gi ản củ a máy tính
1.4. CÁC BỘ XỬ LÝ INTEL KHÁC Ngoài CPU-8086, Intel đã cho ra đời thế thế hệ CPU mớ mới hơn, nhiều tính năng hơn và mạnh hơn như: 80186, 80286, 80386, 80486, Celeron và Pentium (80586). Ngày nay, sức mạ m ạnh và tính n ăng của CPU Intel tăng vượt ượt bậc nh nhờ ờ công nghệ nghệ mới như nh ư: Centrino, Hyper Threading, Core Duo. Bắt đầu từ t ừ CPU 80286, hãng Intel đã đưa vào một số số cải tiế tiến có ý ngh ĩ a như như tăng bus địa chỉ chỉ lên lên 24 bit và có thể th ể vận hành vớ với chế chế độ bảo vệ (protected mode). Chế Chế độ này cho phép CPU 80286 vậ v ận hành trong mộ một hệ điều hành đa nhiệ nhiệm (multitasking). 1.4.1. Bộ xử lý 80386 Hãng Intel đã thành công lớ lớn khi chế chế tạo CPU 80386. Đây vẫn còn là mộ một CPU CISC thuầ thuần túy có bus địa chỉ ch ỉ 32 32 bit và bus số số liliệ ệu 32 bit (ta gọ g ọi CPU 80386 là một CPU 32 bit). Các thanh ghi củ của CPU 80386 đều là thanh ghi 32 bit (Hình 1.5). Mộ M ột số số thanh ghi đa dụ dụng có thể thể chia thành thanh ghi 16 bit hoặ ho ặc chia thành thanh ghi 8 bit để đảm bả bảo tính tươ tương thích với các CPU chế chế tạo tr ước ước đó. Với bus địa chỉ chỉ 32 32 bit, không gian địa chỉ chỉ ccủa CPU 80386 là 4 GB tứ tức 4096 MB. CPU 80386 có 64K cử cửa vào/ra 8 bit, 16 bit và 32 bit. CPU 80386 cũng có thể thể ho hoạ ạt động với bộ đồng xử lý toán họ học 80387 (math coprocessor). Bộ Bộ đồng xử lý toán họ học dùng xử xử lý các phép tính trên các số s ố có dấu chấ chấm động (số (số lẻ). I.4.2. Tập thanh ghi c ủa bộ xử lý 80386: Hình 1.6 mô tả tả đầy đủ tậ p thanh ghi củ c ủa CPU-80386. Các thanh ghi đa dụ d ụng và thanh ghi con tr ỏ được ược mở m ở r ộng thành thanh ghi 32 bit được ược gọi tên là: EAX, EBX, ESP, EDI... . Tuy nhiên ta v ẫn có thể thể sử dụng các thanh ghi 16 bit (AX, BX, ... ) hoặ ho ặc 8 bit (AH, AL, BH, BL ... ) gi ống như như các thanh ghi 16 bit hoặc 8 bit củ của bộ bộ xử lý 8086. Chiề Chiều dài các thanh ghi đoạn vẫ vẫn giữ gi ữ nguyên 16 bit như nhưng có thêm hai thanh ghi đoạn thêm là FS và GS. Các thanh ghi FS và GS được ược dùng giố giống như như thanh ghi bốn đoạn dữ dữ liliệ ES. Ngh ĩ a là CPU‐80386 quản lý được ược bố ệu. Thanh ghi tr ạng thái SR (Status register) và thanh ghi đếm chươ chương trình PC (program counter) cũng được ược nâng lên 32 bit. Ngoài các bit tr ạng thái đã thấ th ấy trong thanh ghi tr ạng thái củ của CPU-8086 (C, Z, S, ... ) thanh ghi tr ạng thái củ của CPU-80386 còn có thêm các bit tr ạng thái như như sau: • IOP (Input/Output protection: bả b ảo vệ vào/ra): Đây là hai bit tr ạng thái dùng trong chế chế độ bảo vệ v ệ để xác định mức ưu tiên mà một tiế ti ến trình phả phải có để có thể thể thâm nhậ nhậ p mộ một vùng vào ra. Chỉ Ch ỉ hhệ điều hành mớ mới có quyề quyền dùng các bit này. • N (Nested task: tiế tiến trình lồ lồng vào nhau): Trong chế chế độ bảo vệ v ệ, các hệ hệ điều hành dùng bit này để biế biết có nhiề nhiều tiế tiến trình đang vậ vận hành và ít nhấ nhất có mộ một titiế ến trình đang bị bị gián đoạn. • R (Resume: tả tải tr ục): Bit này cho phép mộ m ột tiế tiến trình được ược tiế tiế p tụ tục vậ vận hành lại sau khi bị bị gián đoạn.
T ổ ổ chứ c bộ xử lý Intel-8086 •
V (Virtual 8086 mode: chế ch ế độ 8086 ảo): Bit này cho phép 80386 đang vậ vận hành ở chế chế độ bảo vệ vệ, chuyể chuyển sang chế chế độ 8086 ảo. 31
16 15
EAX EBX ECX EDX ESP EBP ESI EDI ESR EPC
87 AH BH CH DH
0 AL BL CL DL
SP BP SI DI SR PC CS DS SS ES FS GS
Hình 1.6a: Thanh ghi đ a d ụ ụng ng và thanh ghi con tr ỏ 15
0 31
0 19
0
TR LDTR IDTR GDTR
Hình 1.6b: Thanh ghi quản lý bộ nhớ 31
16 15
0
CR3 CR2 CR1 CR0
Hình 1.6c: Thanh ghi đ iều khiển 31
16 15
TR7 TR6
Hình 1.6d: Thanh ghi kiểm tra
0
31
16 15
0
DR7 DR6 DR5 DR4 DR3 DR2 DR1 DR0
ỡ r ối Hình 1.6e: Thanh ghi g ỡ
Hình 1.6: Các thanh ghi c ủ a CPU 80386 1.4.3. Các ch ế độ vận hành của bộ xử lý 80386 CPU-80386 có thể thể vận hành theo mộ một trong ba chế ch ế độ khác nhau: chế chế độ thự thực (real mode), chế ch ế độ bảo vệ vệ (protected mode) và chế ch ế độ 8086 ảo (virtual 8086 mode). Chế Chế độ vận hành củ của CPU phả phải được ược thiế thiết lậ lậ p tr ước ước bằ bằng phầ phần cứ cứng.
T ổ ổ chứ c bộ xử lý Intel-8086
Chế độ thực: chế chế độ thự thực củ của bộ bộ xử lý 80386 hoàn toàn tươ tương thích với chế chế độ vận hành củ của bộ xử lý 8086. Trong chế chế độ này, không gian địa chỉ chỉ của 20 80386 bị bị giớ giới hạn ở mức 2 = 1MB giố giống như như không gian địa chỉ chỉ của 8086 mặc dù bus địa chỉ chỉ ccủa 80386 có 32 đường ường dây. • Chế độ bảo vệ: (Còn gọ gọi là chế chế độ đa nhiệ nhiệm) chế chế độ bảo vệ đã được ược đầu tiên đưa vào bộ xử lý 80286. Chế Chế độ này cho phép bộ bộ xử lý 80386 dùng hế hết 32 không gian địa chỉ chỉ ccủa nó là 2 = 4096 MB và cho phép nó vậ v ận hành dướ dướii mộ một hệ điều hành đa nhiệ nhiệm. Trong hệ hệ điều hành đa nhiệ nhiệm, nhiề nhiều tiế tiến trình có thể th ể chạ chạy đồng thờ thời và được ược bả bảo vệ vệ chố chống lạ lại các thâm nhậ nh ậ p trái phép vào vùng ô nhớ nh ớ bị cấm. Trong chế chế độ bảo vệ, các thanh ghi đoạn không được ược xem như như địa chỉ chỉ bắt ch ọn (selector) gán các ưu tiên khác nhau cho đầu của đoạn mà là thanh ghi chọ các tiến trình. Phầ Phần ưu tiên khác nhau cho các tiến trình. Phầ Phần cốt lõi củ của hệ hệ nhấ ất và ngườ ngườii sử sử dụng có ưu tiên thấ p nhấ nhất. điều hành có ưu tiên cao nh • Chế độ này cho phép thiế thiết lậ lậ p mộ một kiể kiểu vậ vận hành đa nhiệ nhiệm Chế độ 8086 ảo: Chế trong đó các chươ chương trình dùng trong chế độ thự thực, có thể thể chạ chạy song song vớ với các tiế tiến trình khác. 1.4.4. Bộ xử lý Intel 80486: CPU-80486DX được ược phát hành năm 1989. Đó là bộ bộ xử lý 32bit chứ chứa 1.2 triệ triệu transistor. Khả Khả năng quả quản lý bộ bộ nh nhớ ớ tối đa gi g iống như như 80386 nhưng tốc độ thi hành lệnh đạt được ược 26.9 MIPS (Mega Instructions Per Second - triệu l ệnh mỗi giây) tại xung nhị nh p ịp 33 MHz Nế Nếu bộ xử lý 80386 là bộ bộ xử lý CISC thuầ thuần túy vớ với bộ b ộ đồng xử x ử lý toán họ học 80387 nằ nằm bên ngoài bộ bộ xử lý 80386, thì bộ bộ xử lý 80486 là mộ một bộ xử lý hỗn tạ p CISC và RISC vớ với bộ b ộ đồng xử x ử lý toán họ học và vớ với 8K cache nằ nằm bên trong bộ bộ xử lý 80486. Trong bộ bộ xử lý 80486, mộ một số s ố lệnh thườ thường ng dùng, ví dụ dụ nh như ư lệnh MOV, dùng mạch điện (k ỹ thu thuậ ật RISC) để thự thực hiệ hiện lệnh thay vì dùng vi chươ chương trình như trong các CPU CISC thuần túy. Như Như thế thì các lệ lệnh thườ thường ng dùng này được ược thi hành với tố tốc độ nhanh hơ hơn. Kỹ thu thuậ ật ống dẫ dẫn cũng được ược đưa vào trong bộ bộ xử lý 80486. Với các k ỹ thu thuậ ật RISC được ược đưa vào, bộ xử lý 80486 nhanh hơ hơn bộ xử lý 80386 đến 3 lầ lần (nế (nếu tố tốc độ xung nhị nh p ịp là như như nhau). Bộ xử lý 80486 hoàn toàn tươ t ương thích với 2 bộ bộ xử lý 80386 và 80387 cộ cộng lạ lại và như như thế nó có các chế ch ế độ vận hành giố giống như như 80386. Bộ xử lý 80486 tỏ tỏ ra r ất mạ m ạnh đối vớ v ới các chươ chương trình cần tính toán nhiề nhiều và các chươ chương trình đồ họa, vì bộ bộ đồng xử lý toán họ h ọc nằm ngay trong bộ b ộ xử lý 80486. Hàng chờ chờ lệnh củ của bộ bộ xử lý 80486 là 32 byte. •
Hình 1.7: CPU-80386
Hình 1.8: CPU-80486
T ổ ổ chứ c bộ xử lý Intel-8086
1.4.5. Bộ xử lý Intel PENTIUM: ược đưa ra thị tr ường ường vào giữ giữa n ăm 1993, các bộ b ộ xử lý Pentium được ược chế ch ế Được tạo với hơn 3 triệu transistor, thụ thụ hưởng ưởng các tính n ăng k ỹ thu thuậ ật của các bộ bộ xử lý 80486 DX/2 và được ược có thêm nhiề nhiều tính năng mớ mới. Theo hãng sả sản xu xuấ ất Intel, nế n ếu ho hoạ ạt động ở với xung nhị nh p ị p 66 MHz thì tố tốc độ thi hành lệ lệnh của Pentium là 112 MIPS thay vì 54 MIPS cho b ộ xử lý 80486 DX/2 cùng xung nhị nh p. ịp. Các tính năng nổi bật của bộ x ử ử lý Pentium là : • Hoàn toàn tươ tương thí ch ch vớ với các bộ bộ xử lý được ược chế chế tạo tr ước ước đó (8086, 80286, 80386, 80486). • Dùng k ỹ thu thuậ ật ống dẫ d ẫn tố t ốt hơ h ơn với 2 ống dẫ d ẫn số s ố nguyên độc lậ l ậ p và mộ một ống dẫn số lẻ. K ỹ thu thuậ ật siêu vô hướ h ướng ng và tiên đoán lệ lệnh nhả nhảy cũng được ược đưa vào.
Dùng cache lệ lệnh và cache dữ dữ liliệ ệu riêng biệ biệt. Bus số số liliệ ệu là 64 bit vớ v ới cách vậ vận chuyể chuyển theo từ từng gói. • • Dùng cách quả quản lý hệ hệ thố thống cho phép tiế tiết kiệ kiệm n ăng lượ l ượng ng tiêu hao trong bộ bộ xử lý Pentium. Có tố tối ưu hóa các chuỗi mã lệ lệnh. • Petium MMX: Các lệ l ệnh xử lý multimedia được ược đưa vào tậ p lệnh của CPU nên việ việc thi hành chươ chương trình multimedia được ược cả cải thiệ thiện r ất nhiề nhiều. •
Pentium Celeron
T ổ ổ chứ c bộ xử lý Intel-8086
Hình 1.9: Hình ảnh các loại bộ xử lý Intel
T ổ ổ chứ c bộ xử lý Intel-8086
BÀI TẬP CHƯƠ NG NG 1 1. Chọ Chọn các thanh ghi đa dụ dụng để lưu trữ các dữ dữ liliệ ệu sau đây, sao cho mỗ mỗi thanh ghi lưu trữ 1 giá tr ị và không trùng nhau (Giả (Giải thích việ việc chọ ch ọn thanh ghi): 15h, 0AFh, 01234h, 230, 257, ‘H’, 8086. Ghi chú: Số Số có tậ tận cùng bằ bằng h (hay H) là số s ố thậ thậ p lụ lục phân (Hexa); ‘H’ : Ký tự tự H 2. Các thanh ghi đang lư lưu trữ giá tr ị nh như ư sau: AH = 11h AL = 22h CL = 15 CH = 10 BX = 0A1D4h DX = 8086 Hãy cho biế biết giá tr ị thậ thậ p lụ lục phân củ của nhữ những thanh ghi sau và giả giải thích: AX, CX, BH, BL, DH, DL 3. Mô tả tả các cách có thể th ể sử dụng được ược để lưu trữ giá tr ị vào thanh ghi sau: a. 1234h vào thanh ghi SI b. 5678h vào thanh ghi AX c. 100 vào thanh ghi DI d. 100 vào thanh ghi DX 4. Sử dụng mô hình bộ bộ nh nhớ ớ gồm 17 ô nhớ nhớ nh như ư hình A1 để ghi các dữ dữ liliệ ệu sau đây vào bộ bộ nh nhớ ớ sao cho các giá tr ị không chồ chồng lên nhau (sinh viên tự tự chọ chọn địa chỉ chỉ ôô nhớ nh ớ để lưu trữ): 15h, 0AFh, 01234h, 230, 257, ‘H’, 8086, 3A4B5h, 0F1D2E3h Ô nhớ …..
Địa chỉ 00010h ….. 00002h 00001h 00000h
Hình A1: Mô hình b ộ nhớ 5. Vớ V ới mô hình bộ bộ nh nhớ ớ k ết quả qu ả của câu 4, hãy cho biế bi ết giá tr ị dữ liliệ ệu 8/16/24/32 bit tại mỗ mỗi địa chỉ chỉ sau sau đây ở dạng thậ thậ p lụ lục phân: a. 00004h b. 00008h c. 0000Bh d. 0000Dh 6. Đổi sang địa chỉ chỉ vvật lý tươ tương ứng vớ với mỗ mỗi địa chỉ chỉ logic logic sau: a. 0000:0001h b. 0100:1234h c. ABCD:3AFFh d. AF70:00CFh 7. Viế Viết ra 4 địa chỉ chỉ logic logic khác nhau đối vớ với mỗ mỗi địa chỉ chỉ vvật lý sau: a. 40000h b. 0D32FCh 8. Tìm tấ tất cả c ả các địa chỉ chỉ logic logic khác nhau có thể th ể có của mỗi ô nhớ nhớ có địa chỉ chỉ vvật lý sau đây: a. 00000h b. 0000Fh c. 00010h d. 0001Fh Có nhậ nhận xét gì về v ề các k ết quả quả trên? 9. Cho mộ một chươ ch ương trình bao gồm 100 byte lệ lệnh (Code), 200 byte dữ dữ liliệ ệu (Data) và 16 KB ngăn xế x ế p (Stack). Vẽ Vẽ hình mô tả tả tổ chứ chức vùng nhớ nhớ của chươ ch ương trình trên
T ổ ổ chứ c bộ xử lý Intel-8086 trong bộ
nhớ có mô hình như nhớ như hình A2 theo hai cách sau (sinh viên tự gán địa chỉ chỉ vật lý và logic thích hợ h ợ p vớ với đầu và cuố cuối cho từ từng vùng): a. Dùng chung 1 đoạn duy nhấ nhất cho cả cả 3 vùng Code, Data và Stack b. Dùng 3 đoạn riêng biệ biệt không chồ chồng nhau cho Code, Data, Stack Địa chỉ logic ….:…. …..:… ….:… ….:… ….:…
Ô nh ớ …..
Địa chỉ vật lý …. ….. …. …. ….
Hình A2: Mô hình t ổ chứ c bộ nhớ 10. Bằ Bằng mô hình bộ bộ nh nhớ ớ k ết quả qu ả của câu 9a, hãy thiế thi ết lậ l ậ p giá tr ị các thanh ghi sao cho CPU-8086 truy xuấ xuất được ược nhữ những ô nhớ nhớ trong mỗ mỗi tr ường ường hợ hợ p sau: a. Byte lệ lệnh đầu tiên b. Byte lệnh thứ thứ 20 c. Byte dữ d ữ liliệ ệu đầu tiên d. Byte dữ liliệ ệu thứ thứ 10
H ợ ợ p Ng ữ ữ
Chương 2 HỢ P NGỮ Mục Đích -
So sánh ngôn ng ữ máy và hợ p ngữ
-
Lệnh giả của MASM
-
Các cấu trúc chươ ng ng trình Hợ p ngữ
-
Cách tạo chươ ng ng trình hợ p ng ữ
2.1. NGÔN NG Ữ MÁY VÀ H ỢP NGỮ Chươ ng ng trình là một t ậ p h ợ p các lệnh đượ c đưa vào bộ nhớ trong của máy tính để bộ xử lý thực hiện. Các lệnh có thể đượ c thể hiện ở những d ạng (ngôn ng ữ) khác nhau. Bộ xử lý hoạt động dựa trên k ỹ thuật số nên chỉ hiểu đượ c những giá tr ị nhị phân ( để đơ để đơ n giản, giá tr ị nhị phân còn đượ c viế t thành giá tr ị thậ p l ục phân). Do đó, ngôn ngữ máy máy (Machine language). Mỗi bộ xử lý có ngữ mà CPU hiểu đượ c ấy gọi là ngôn ngữ tậ p giá tr ị phân trong đó m ỗi giá tr ị nhị phân sẽ điều khiển CPU thực hi ện m ột tác vụ (gọi là mã l ệnh), tậ p hợ p các mã l ệnh nhị phân ấy gọi là tậ p lệnh. Những bộ xử lý khác nhau sẽ có tậ p lệnh khác nhau, do đó ngôn ngữ máy của CPU nào thì chỉ thực hiện ng trình ngôn ng ữ máy viết cho họ đượ c trên CPU đó. Bảng 2.1 trình bày đoạn chươ ng Intel-8086.
Thứ tự lệnh 1 2 3
Giá tr ị thập lục phân B4 09 BA 03 01 40
Mã lệnh nhị phân 10110100 00001001 10111010 00000011 00000001 01000000
Bảng 2.1: Đoạn chươ ng ng trình ngôn ng ữ ữ máy họ Intel-80x86
Đối vớ i CPU có ki ến trúc CISC, chiều dài các lệnh có thể khác nhau do đó trong đoạn chươ ng ng trình trên gồm 3 lệnh, có chiều dài lần lượ t là 2 byte, 3 byte và 1 byte. Byte đầu tiên của mỗi lệnh là Tác vụ (Op-Code) mà CPU phải thực hiện còn các byte còn lại là Tác tử (Operand) xác định dữ liệu hoặc nơ i chứa dữ liệu mà lệnh tác động vào. Để có thể lậ p trình vớ i ngôn ng ữ máy này, ngườ i lậ p trình phải hiểu rõ tổ chức phần cứng của máy đang sử dụng. Vì là ngôn ngữ riêng của CPU và đượ c CPU thực hiện ngay khi đọc đượ c lệnh nên chươ ng ng trình viết bằng ngôn ngữ máy thực hiện r ất nhanh và chi ếm ít bộ nhớ trong. Tuy nhiên, d ạng nhị phân của ngôn ngữ máy r ất khó nhớ dễ nhầm l ẫn nên khó viết. Để khắc phục nhượ c điểm khó nhớ của dạng nhị phân, ngườ i ta dùng nh ững từ ngữ dễ nhớ để thay thế cho những mã lệnh nhị phân (gọi là từ gợ i nhớ mã lệnh – Ngữ (Assembly). mnemonic). Chươ ng ng trình viết bằng Từ gợ i nhớ mã lệnh gọi là Hợ p Ngữ Mỗi mã lệnh nhị phân sẽ có một lệnh tươ ng ng ứng trong H ợ p ngữ và mỗi CPU khác nhau sẽ có Hợ p ngữ khác nhau. Các tài li ệu tham khảo về tậ p lệnh của CPU thườ ng ng cung cấ p cho lậ p trình viên tậ p lệnh của CPU ở dạng Hợ p Ng ữ.
H ợ ợ p Ng ữ ữ
Bảng 2.2 viết lại đoạn chươ ng ng trình trong b ảng 2.1 ở dạng Hợ p ngữ. Qua đó ngườ i đọc có thể hiểu đượ c phần nào chức năng của mỗi dòng l ệnh trong đoạn chươ ng ng trình đó thông qua l ệnh Hợ p ng ữ.
Thứ tự lệnh 1 2 3
Giá tr ị thập lục phân Hợp Ngữ B4 09 MOV AH, 09h BA 03 01 MOV DX, 0103h 40 INC AX
Ý ngh ĩ a AH ← 09h DX ← 0103h AX ← AX + 1
Bảng 2.1: Đoạn chươ ng ng trình H ợ ợ p ng ữ ữ cho họ Intel-80x86
Như vậy, Hợ p ngữ sẽ làm cho lậ p trình viên dễ dàng hơ n trong việc viết chươ ng ng trình nhưng CPU thì không hi ểu đượ c những t ừ gợ i nhớ mã l ệnh đó. Do đó, t ừng l ệnh trong chươ ng ng trình viết bằng hợ p ngữ phải đượ c dịch sang ngôn ngữ máy tươ ng ng ứng (hình 2.1). Chươ ng ng trình làm nhi ệm vụ này gọi là Trình hợ p dịch (Assembler)
Khi mớ i ra đờ i, i, các chươ ng ng trình hợ p ngữ chỉ làm việc đơ n thuần là dịch những từ gợ i nhớ mã lệnh sang mã máy nhưng dần dần các trình hợ p dịch bổ sung thêm các l ệnh riêng của trình hợ p d ịch cho phép dùng các nhãn, các ký hi ệu, biến đổi d ạng lệnh, khai báo biến, phân phối bộ nhớ , macro… nhằm giúp cho ngườ i lậ p trình viết chươ ng ng trình hợ p ngữ dễ dàng hơ n, n, các lệnh riêng đó gọi là lệnh giả (pseudo code). Các lệnh giả không có mã máy nhị phân tươ ng ng ứng nên bản thân các lệnh giả không điều khiển CPU thực hiện tác vụ mà chỉ dùng để hướ ng ng dẫn trình hợ p dịch trong quá trình dịch chươ ng ng trình. Do đó, khi gặ p từ gợ i nhớ mã lệnh, trình hợ p dịch sẽ dịch sang mã máy nhị phân; còn khi gặ p lệnh giả, trình hợ p dịch không dịch thành mã nhị phân.
2.2. ĐẶC TÍNH TỔNG QUÁT C ỦA HỢP NGỮ 2.2.1. Cấu trúc của một dòng lệnh hợp ngữ. Đối vớ i hợ p ngữ, trên một dòng văn bản chỉ cho phép viết m ột dòng lệnh duy nhất. Hình 2.2 trình bày b ốn thành phần có thể có trong cấu trúc của dòng lệnh hợ p ngữ. Tên
Mã lệnh
Toán hạng
Chú thích
Hình 2.2: C ấ ấu trúc dòng l ệnh hợ p ng ữ ữ
Bốn thành phần của dòng lệnh hợ p ngữ đượ c sắ p xế p theo thứ tự trên một hàng lệnh và đượ c phân cách nhau b ằng một ký tự đặc biệt gọi là ký tự ngăn cách (delimiter). Các ký tự ngăn cách có thể gồm: Khoảng tr ống, hai chấm, chấm phẩy, dấu
H ợ ợ p Ng ữ ữ
phẩy, d ấu hỏi... tùy theo hợ p ngữ. Chính các ký t ự ngăn cách này giúp cho trình h ợ p dịch phân biệt đượ c các vùng khác nhau trong dòng l ệnh. Vì vậy, khi khảo sát một hợ p ngữ nào đó, chúng ta phải chú ý và s ử dụng đúng các ký tự ngăn cách.
1. Tên (name) Vùng tên cho phép gán tên cho m ột địa chỉ (nhãn) hay một dữ liệu (Biến, hằng). Khi đó ta có thể sử dụng tên này để thay thế địa ch ỉ hay dữ liệu khi tham khảo đến địa chỉ hay dữ liệu ấy. Mỗi tên chỉ đượ c thay thế cho duy nhất một địa chỉ hoặc một trong chươ ng ng trình và đượ c đặt theo quy cách của trình hợ p dịch.
2. Mã lệ lệnh Đây là vùng duy nh ất không thể thiếu đượ c c ủa hàng lệnh, có thể chứa m ột từ gợ i nhớ mã lệnh hoặc một lệnh giả. - Từ gợ i nhớ mã lệnh đượ c trình bày ở chươ ng ng 3 (Tậ p lệnh CPU-8086). - Mỗi trình hợ p dịch có thể xây dựng tậ p lệnh giả riêng, nên trong phần 2.3 sẽ trình bày các l ệnh giả thườ ng ng dùng của trình hợ p dịch MASM. 3. Toán hạ hạng: Chứa các toán hạng mà lệnh cần. Số toán hạng tùy vào mã l ệnh 4. Chú thích: Dùng để ghi chú, giải thích cho dòng l ệnh. 2.2.2. Macro Macro là một nhóm lệnh nào đó đượ c dùng nhiều lần trong cùng m ột chươ ng ng trình nên ta gán cho nó một tên. Mỗi khi sử dụng nhóm lệnh ấy chỉ cần gọi tên đã gán cho nhóm lệnh đó. 2.2.3. Chương trình con Hợ p ngữ thườ ng ng cho phép d ịch riêng biệt các chươ ng ng trình con, nó s ẽ đánh dấu các tham khảo đến chươ ng ng trình con trong ch ươ ng ng trình chính và ch ươ ng ng trình liên k ết (linker) sẽ gán các địa chỉ của các chươ ng ng trình con. Một số hợ p ngữ còn cho phép làm một thư viện chươ ng ng trình con để sử dụng chung cho nhiều chươ ng ng trình khác nhau. Muốn sử dụng chươ ng ng trình con thì phài dùng l ệnh CALL hay lệnh JUMP để chuyển điều khiển đến chươ ng ng trình con đó. Do đó phải lưu địa chỉ tr ở ng trình ở về chươ ng chính ở ngăn xế p và làm chậm đi việc thực hiện chươ ng ng trình chính. ng trình chính g ọi macro để thực hi ện thì toàn Đối v ớ i macro, thì m ổi l ần ch ươ ng bộ nhóm lệnh trong macro đượ c xen vào ngay điểm g ọi, không cần dùng lệnh CALL hay JUMP, nên ch ươ ng ng trình chính đượ c thực hiện nhanh hơ n . Tuy nhiên mỗi lần gọi macro thì đoạn mã lệnh trong macro đượ c xen vào chươ ng ng trình chính làm cho ch ươ ng ng trình chính ngày càng dài ra và chi ếm nhiều ô nhớ trong hơ n. n. Chươ ng ng trình con ch ỉ chiếm một vùng ô nh ớ nhất định. Khi chươ ng ng trình chính gọi nó thì ch ươ ng ng trình chính l ưu tr ữ địa chỉ tr ở ở về, nhảy đến địa chỉ bắt đầu của chươ ng ng trình con để thực hiện chươ ng ng trình này và khi th ực hiện xong thì lấy lại địa chỉ tr ở ng trình chánh. Dùng chươ ng ng trình con ít chi ếm bộ ở về để tiế p tục thực hiện chươ ng nhớ trong.
H ợ ợ p Ng ữ ữ S ử ng trình con ử d ụng Chươ ng CT con A → Lệnh 1
CT chính → Gọi CT con A→ Gọi CTC A→
Lệnh 2 Lệnh 3 Lệnh 4 Lệnh i CALL A Lệnh ii CALL A Lệnh iii
S ử ử d ụng Macro
Lệnh 1 Lệnh 2 Lệnh 3 Lệnh 4 Lệnh i -Lệnh -Lệnh -Lệnh -Lệnh Lệnh ii -Lệnh -Lệnh -Lệnh -Lệnh Lệnh iii
← Macro A
1 2 3 4 1 2 3 4
← CT chính ← Gọi MacroA
← Gọi MacroA
Dài hơ hơ n!!! n!!!
Hình 2.3: So sánh ch ươ ng ng trình dùng Ch ươ ng ng trình con và Macro
Tr ướ ướ c đây, do bộ nhớ trong của máy tính còn hạn hẹ p và tốc độ chưa cao nên việc dùng macro hay chươ ng ng trình con đượ c xem xét r ất cẩn thận đảm bảo đượ c chươ ng ng trình ngắn và hoạt động không chậm. Ngày nay, dung l ượ ng ng bộ nhớ trong khá lớ n và vớ i t ốc độ nhanh của b ộ xử lý đã làm cho ngườ i l ậ p trình thoải mái hơ n trong việc sử dụng macro hay chươ ng ng trình con.
2.2.4. Biến toàn cục (global), bi ến địa phương (local) Các biến đượ c khai báo trong ch ươ ng ng trình chính đượ c gọi là biến toàn cục. Các biến này có thể dùng cho chươ ng ng trình chính, trong macro và các ch ươ ng ng trình con. Các biến đượ c khai báo bên trong macro hay ch ươ ng ng trình con đượ c gọi là biến ng và chỉ đượ c dùng cho n ội b ộ một macro hoặc ch ươ ng ng trình con. Nói cách địa ph ươ ng khác, nếu có 2 bi ến cùng tên đượ c khai báo ở 2 ch ươ ng ng trình con khác nhau là 2 bi ến hoàn toàn khác nhau. Việc hi ểu bi ết c ặn k ẽ về biến toàn cục và địa phươ ng ng giúp cho ng ườ i lậ p trình quản lý biến và sử dụng biến hiệu quả hơ n, n, tránh tr ườ ng hợ p không bị trùng lấ p khi sử ườ ng dụng tên biến trong chươ ng ng trình lớ n. n.
2.2.5. Các b ảng, thông báo: Đa số các trình hợ p ngữ khi tiến hành hợ p dịch có thể cung cấ p các bảng và thông báo cho ng ườ i lậ p trình. Các bảng thông báo đượ c cung cấ p dướ i dạng tậ p tin văn bản, bao gồm các bảng như sau: ng trình hợ p ngữ và mã máy tươ ng ng ứng. Liệt kê chươ ng ng trình gốc. Liệt kê các lỗi trong chươ ng Liệt kê các tên đượ c dùng trong ch ươ ng ng trình gốc. ng trình khác, bên ngoài ch ươ ng ng trình Danh sách các tham kh ảo ở chươ ng (chươ ng ng trình con, bi ến dùng ở bên ngoài) Các macro, chươ ng ng trình con và độ dài của chúng
H ợ ợ p Ng ữ ữ
2.2.6. Hợp ngữ chéo (cross assembler) Một hợ p ngữ chạy trên một máy tính nào đó để dịch ra mã máy cho chươ ng ng trình viết phục vụ một CPU khác chủng loại vớ i CPU của máy tính mà h ợ p ngữ đó đang dùng thì đượ c gọi là hợ p ngữ chéo. Ví d ụ, hiện nay r ất khó tìm đượ c một máy tính dùng CPU-Z80. Mu ốn dịch m ột chươ ng ng trình hợ p ngữ P1 thành chươ ng ng trình mã máy P2 dùng cho CPU-Z80, ngườ i ta phải dùng h ợ p ngữ chéo chạy trên máy IBM-PC (có CPU-8086) thông dụng. Chươ ng ng trình P2 không ch ạy đượ c trên máy IBM-PC mà chỉ chạy đượ c trên máy tính ho ặc hệ vi xử lý do CPU-Z80 điều khiển. 2.3. HỢP NGỮ MASM (HỢP NGỮ CỦA CPU-8086) MASM (Microsoft Macro Assembler) là trình h ợ p ngữ do hãng phần mềm Microsoft phát tri ển cùng vớ i phiên bản h ệ điều hành DOS. Ngoài ra, hãng Borland – chuyên xây dựng các chươ ng ng trình dịch – cũng phát hành ch ươ ng ng trình dịch h ợ p ngữ gọi là TASM (Turbo Assembler). Các phiên b ản này chỉ cho phép viết chươ ng ng trình trên hệ điều hành DOS, cho nên không vi ết đượ c chươ ng ng trình cho Windows b ằng các phiên bản này. Hiện nay, đã có các phiên b ản cho phép viết chươ ng ng trình trên Windows, như MASM32 (MASM 32 bits). Ta dùng các từ gợ i nhớ mã lệnh, các lệnh giả, các ký hiệu ... do trình h ợ p ngữ MASM qui định để viết ra một chươ ng ng trình mà ta g ọi là chươ ng ng trình hợ p ngữ nguồn (source file). Chươ ng ng trình ngu ồn đượ c lưu tr ữ trong đĩ a từ dướ i một tên tậ p tin có ng trình ngu ồn thành chươ ng ng trình đối tượ ng ng có đuôi là ASM. MASM sẽ dịch chươ ng đuôi OBJ (Object file). Chươ ng ng trình đối tượ ng ng sẽ đượ c liên k ết (LINK) thành ch ươ ng ng trình có thể chạy đượ c có đuôi là EXE (Executive file). Các loại hợ p ngữ khác nhau đều có cú pháp gi ống nhau, nh ưng cũng có những đặc điểm riêng th ể hiện kh ả năng m ạnh m ẽ của nó. Sau đây chúng ta nghiên c ứu các qui định, các cú pháp thườ ng ng dùng cho vi ệc viết một chươ ng ng trình h ợ p ngữ. 2.3.1. Cấu trúc của một hàng lệnh : Một hàng lệnh gồm có bốn thành phần: Tên
Từ gợi nhớ mã lệnh hoặc lệnh giả
Toán hạng hoặc biểu thức
Ghi chú
Hình 2.4: C ấ ấu trúc dòng l ệnh hợ p ng ữ ữ MASM Ví d ụ:
BDAU: MOV DX, 3F8h ; 3F8H là địa chỉ cổng vào ra n ối tiế p Trong đ ó: ó: BDAU
– Tên vớ i vai trò là nhãn
:
– (Dấu 2 chấm) phân cách Tên và T ừ gợ i nhớ
MOV
– Từ gợ i nhớ mã lệnh
DX, 3F8h – Hai toán hạng, phân cách b ằng dấu phẩy 3F8H là địa chỉ cổ ng ng vào ra n ố i tiế p – Câu chú thích ;
– (Dấu ; ) Phân cách Toán h ạng và Chú thích
2.3.2. Tên: Tên có thể là nhãn, biế n hay ký hiệu (hằ ng) ng).
H ợ ợ p Ng ữ ữ
Tên có chiều dài tối đa là 31 ký t ự và phải bắt đầu bằng một chữ cái. Các khoảng tr ống và ký hi ệu toán học không đượ c dùng để đặt tên.
1. NHÃN: Nhãn dùng để đánh dấu một địa chỉ mà các lệnh như: lệnh nhảy, gọi chươ ng ng trình con, lệnh lậ p cần đến. Nó cũng đượ c dùng cho các l ệnh giả LABEL hoặc PROC hoặc EXTRN Ví d ụ:
NH: MOV AX, DS ; NH là nhãn đánh dấu một địa chỉ ô nhớ FOO LABEL near ; đặt tên cho địa chỉ ô nhớ sau lệnh giả này CTCON PROC FAR ; địa chỉ bắt đầu của chươ ng ng trình con EXTRN NH near ; NH là nhãn ngoài chươ ng ng trình gốc nầy 2. BIẾ BIẾN: Biến dùng làm toán h ạng cho lệnh hoặc biểu thức. Biến tượ ng ng tr ưng cho một địa chỉ nơ i đó có giá tr ị mà ta cần. Ví d ụ: TWO DB 2 ; khai báo biến TWO có giá tr ị là 2 3. KÝ HIỆ HIỆU: Ký hiệu là một tên đượ c định ngh ĩ a để thay cho một bi ểu th ức, m ột t ừ gợ i nh ớ lệnh. Ký hiệu có thể dùng làm toán h ạng trong biểu th ức, trong lệnh hay trong lệnh giả. Ví d ụ: FOO EQU 7h ; ký hiệu FOO thay thế giá tr ị 07h = 0Fh ; ký hiệu TOTO thay th ế giá tr ị 0Fh TOTO 2.3.3. Từ gợi nhớ mã lệnh, lệnh giả: Từ gợ i nhớ mã l ệnh sẽ đượ c trình bày trong các ch ươ ng ng sau về tậ p lệnh c ủa bộ xử lý 8086. Trong ph ần này sẽ trình bày các lệnh giả thườ ng ng dùng của MASM. Lệnh giả có thể đượ c chia thành 5 nhóm: c ấu trúc chươ ng ng trình, khai báo d ữ liệu, dịch có điều kiện, Macro và Li ệt kê A. Nhóm cấu trúc chương trình: SEGMENT và ENDS: Khai báo đoạn. SEGMENT [align] [combine] [‘class‘] ….. ; nội dung của đoạn ENDS [align] xác định nơ i bắt đầu của đoạn như sau, gồm các giá tr ị : Byte : Đoạn có thể bắt đầu ở đị ở địa chỉ bất k ỳ. Word : Đoạn phải bắt đầu ở đị ở địa chỉ chẳn. Para : Đoạn phải bắt đầu ở đị ở địa chỉ là bội số của 16. Page : Đoạn phải bắt đầu ở đị ở địa chỉ là bội số của 256. [combine] xác định cách k ết hợ p phân đoạn này vớ i phân đoạn khác: PUBLIC: các đoạn cùng tên và cùng class đượ c ghép nối tiế p nhau khi liên k ết. COMMON: các đoạn cùng tên và cùng class đư đượ ợ c ghép phủ lấ p lên nhau khi liên k ết. Cú pháp:
H ợ ợ p Ng ữ ữ
AT c> : Đoạn đượ c đặt t ại m ột địa chỉ là b ội s ố của 16 và đượ c ghi trong biểu thức. STACK : Giống như Public, tuy nhiên con tr ỏ ngăn xế p SP chỉ vào địa chỉ đầu tiên của ngăn xế p đầu tiên. PRIVATE: các đoạn cùng tên và cùng class không đượ c ghép vào nhau Ví d ụ: Khai báo hai đoạn có tên là DSEG và CSEG: Không phủ lấ p lên nhau DSEG
SEGMENT …… ; Khai báo d ữ ữ liệu ENDS SEGMENT …… ; Các l ệnh trong đ oạn
DSEG CSEG CSEG
ENDS
ASSUME: Chỉ định loại của một đoạn. Cú pháp: ASSUME
: , : Ví d ụ: Chỉ định đoạn có tên DATA là đoạn dữ liệu (DS) và đoạn có tên CODE là đoạn lệnh (CS): ASSUME
DS: DATA, CS: CODE
Lư u ý: Lệnh ASSUME chỉ đượ c viết trong đoạn lệnh. Ví d ụ: Báo cho hợ p ngữ biết là không có đoạn nào đượ c chỉ định loại. Khi đó, mỗi lần liên h ệ đến một nhản (biến) phải dùng cả địa chỉ đoạn của chúng:
ASSUME
NOTHING
COMMENT: ghi chú chươ ng ng trình. Có th ể viết trên nhiều dòng Cú pháp:
COMMENT * chú> *
EVEN : Làm cho thanh ghi đếm chươ ng ng trình PC là giá tr ị chẳn EXTRN: Cho biết một tên hay một ký hiệu đã đượ c định ngh ĩ a bên ngoài ở một module khác đượ c sử dụng ở module chươ ng ng trình hi ện tại. END: Điểm cuối chươ ng ng trình nguồn và xác định điểm bắt đầu END Ví d ụ: END begin ; điểm bắt đầu chạy CT là nhãn begin
Cú pháp:
GROUP: Nhóm các đoạn khác nhau có một tên nhóm dùng chung Ví d ụ: Nhóm 3 đoạn có tên DATA1, DATA2 và DATA3 có tên nhóm dùng chung là CGROUP:
CGROUP GROUP
DATA1,DATA2,DATA3
H ợ ợ p Ng ữ ữ
INCLUDE : xen một tậ p tin hợ p ngữ khác vào tậ p tin hi ện hành Ví d ụ: Xen tậ p tin THEM.ASM trên ổ đĩ a C:\ASM vào t ậ p tin hiện hành ngay t ại vị trí của lệnh giả INCLUDE:
INCLUDE
C:\ASM\THEM.ASM
LABEL : đánh dấu một địa chỉ là địa chỉ của lệnh hay số liệu k ế Ví d ụ: NHF LABEL FAR ; nhản xa, đánh dấu vị trí NH của lệnh k ế NH: MOV AX, DATA CH DW 100 DUP (0) ; chuỗi từng từ
NAME : đặt tên cho một module hợ p ngữ Ví d ụ: NAME Cursor ; đặt tên cho modun là cursor
ORG: ấn định địa chỉ bắt đầu cho đoạn chươ ng ng trình Ví d ụ: ORG 100h MOV AX,code ; Lệnh này đượ c đặt tại địa chỉ CS:100h
PROC và ENDP: Khai báo chươ ng ng trình con PROC [Near/Far] ENDP
Cú pháp: Ví d ụ:
CTCON PROC
Near MOV AX, 10 ; Bắt đầu chươ ng ng trình con ADD DX, AX ở về CT chính RET ; Tr ở CTCON ENDP
PUBLIC : khai báo các tên trong module hi ện hành mà các module khác có thể sử dụng. Ví d ụ : PUBLIC
FOO, NH, TOTO
B. Nhóm khai báo d ữ liệu: Tất cả dữ liệu trong ch ươ ng ng trình hợ p ngữ đượ c trình hợ p dịch chuyển sang dạng nhị phân. Do đó giá tr ị của d ữ liệu có thể đượ c vi ết ở các dạng như: ký tự, th ậ p phân, nhị phân, bát phân hay th ậ p lục phân. B.1. Cách vi ết số: - Hệ thậ p phân: 10, 150, 1234 - Hệ bát phân: k ết thúc bằng ký tự O (hay o), như: 10o, 35O, 1230O - Hệ thậ p lục phân: phải k ết thúc b ằng ký tự H (hoặc h) và bắt đầu là số, như: 10h, 13H, 2Fh, 0D4E1h
H ợ ợ p Ng ữ ữ
- Hệ nhị phân: k ết thúc bằng ký tự B (hoặc b), như: 10b, 01100100B
ự B.2. Chu ỗi ký t ự Ký tự hay chuỗi ký tự phải đượ c k ẹ p giữa cặ p dấu nháy đơ n (‘) hoặc cặ p dấu nháy kép (“), như: ‘A’, “b”, ‘Hello Assembly’, “This is a string” Trình hợ p dịch chuyển ký tự sang dạng nhị phân tươ ng ng ứng vớ i mã ASCII, do đó ‘A’, “A”, 41h hay 65 đều có ngh ĩ a như nhau khi lưu tr ữ. B.3. Đị nh nh ngh ĩ a d ữ ữ li ệu (Khai báo bi ến) Cú pháp chung: [Tên Biến]
[Tên biế n] n] đặt theo quy cách của Tên.
Tên biến (tên vùng nhớ ), ), thực ch ất là địa ch ỉ tượ ng ng tr ưng c ủa vùng nhớ và ng trình. đượ c chuyển thành địa chỉ thật sau khi dịch chươ ng n> xác định kích thướ c của biến theo byte, bao g ồm:
DB (Define Byte): khai báo biến 1 byte (1 ô nh ớ ) byte (1 từ máy tính) DW (Define Word): khai báo bi ến 2 byte DD (Define Double word): khai báo bi ến 4 byte (từ đôi) DQ (Define Quad word): khai báo biến 8 byte (bốn từ). DT (Define Ten byte): khai báo biến 10 byte. bao g ồm các dạng: - Số hay biểu thức: 01100b, 0A1D3h, 15 hay (50+10h)*9 - Ký tự hay chuỗi: 'A', 'CHAO BAN' ướ c giá tr ị): ? - R ỗng (không gán tr ướ - Mãng có n giá tr ị khác nhau:
,
, …,
- Mãng có X giá tr ị giống nhau: X DUP() Lư u ý: - Độ l ớ ng l ư ã định ngh ĩ a ớn của Tr ị không vượ t quá khả nă ng ưu tr ữ ữ của vùng nh ớ đ ớ đ ã bằ ng ng n> - Biế n chuỗ i ký t ự ng DB ự phải khai báo b ằ ng
Các ví dụ dụ: - Khai báo bi ế n 1 byte, tên là SO và gán tr ướ ướ c tr ị là 14: SO DB 14
SO 1 byte nhớ→
0Eh
(Tên bi ến/ đị a chỉ ô nhớ ) (Tr ị c ủ ủa Bi ến/ nội dung ô nhớ )
- Khai báo mãng M g ồm 5 phần t ử ử có tr ị l ần l ượ ượ t 1, 3, 5, 7, 9: M DB 1, 3, 5, 7, 9
M 01h
M+1 03h
M+2 05h
M+3 07h
M+4 09h
- Khai báo bi ế n 2 byte, l ư ưu tr ữ ữ giá tr ị 10, tên là WA: WA DW 10 ; 10 = 000Ah
WA 0Ah
WA+1 00h
WB 34h
WB+1 12h
H ợ ợ p Ng ữ ữ - Khai báo bi ế n l ư ưu tr ữ ữ giá tr ị 1234h, đặ t tên là WB: WB DW 1234h - Khai báo bi ế n, n, l ư ưu tr ữ ữ chuỗ i “Hello”, tên là str: str DB ‘Hello’ ; Lư u trong b ộ nhớ bằ ng ng các mã ASCII
str
str+1 65h
48h
str+2 6Ch
str+3 6Ch
str+4 6Fh
- Khai báo bi ế n mãng Str2 l ư ưu tr ữ ữ l ần l ượ ượ t các tr ị ‘ABC’, 0Ah, 0Dh, ‘$’: Str2 DB ‘ABC’, 0Ah, 0Dh, ‘$’ ; Mãng 6 ph ần tử 1 byte Str2
Str2 +1
41h
Str2 +2
42h
Str2 +3
43h
Str2 +4
0Ah
Str2 +5
0Dh
24h
- Khai báo bi ế n mãng 7 ph ần t ử ử có cùng giá tr ị là ‘$’, tên là Str3: Str3 DB 7 DUP(‘$’) ; Mãng 7 phần tử 1 byte
Str3 24h
Str3+1 24h
Str3+2 24h
Str3+3 24h
Str3+4 24h
Str3+5 24h
Str3+6 24h
Trong hợ p ngữ, kiểu của biến đượ c hiểu đơ n giản hơ n thông qua số lượ ng ng ô nhớ n>. của biến và đượ c thể hiện bằng . Các biến phải đượ c khai báo trong đoạn dữ liệu (DS), một vài tr ườ ng hợ p đặt ườ ng biệt vẫn đượ c khai báo trong đoạn lệnh, nhưng phải luu ý đến tổ chức chươ ng ng trình sao cho CPU không xem các biến như là lệnh. Các biến sẽ đượ c phân phối bộ nhớ theo thứ tự đượ c khai báo lần lượ t t ừ ô nhớ có địa thấ p đến cao. Trong một đoạn có nhiều biến đượ c khai báo, bi ến đượ c khai báo đầu tiên sẽ có địa chỉ độ dờ i trong đoạn dữ liệu bắt đầu là 0h và tiế p theo cho các bi ến đượ c khai báo tiế p theo sau.
B.4. Dữ liệu có cấu trúc: RECORD và STRUC: Khai báo biến kiểu có cấu trúc mẫu tin. Cú pháp:
[Tên Biến]
ườ ng: [tr ườ ng: d] [,…]
d : Số nguyên dươ ng, ng, xác định độ lớ n của tr ườ ng . ườ ng
:
RECORD: d tính bằng bít. Cấu trúc dài tối đa là 16 bít STRUC: d tính b ằng byte. Ví d ụ: Hình 2.5 mô t ả quản lý vùng nh ớ cho 2 bi ế n có cấ u trúc sau:
B.5. Khai báo h ằng EQU và = : gán tr ị cho 1 ký hiệu. EQU để gán tr ị cho ký hiệu (hằng số) chỉ một lần khi khai báo. Muốn gán lại giá tr ị nhiều lần, ta dùng lệnh “=“ Ví d ụ: FOO EQU 2*10 ; gán tr ị 20 vào FOO FOO = 2*10 ; gán tr ị 20 vào FOO C. Nhóm l ệnh giả về dịch (compile) có điều kiện: Các lệnh giả về dịch có điều kiện nhằm báo cho hợ p ngữ tiến hành dịch một nhóm lệnh nếu một điều kiện đượ c thỏa mãn (đúng). Ngượ c lại sẽ không dịch khi điều kiện không thoả mãn (sai) ; Điều kiện dịch chươ ng ng trình Cú pháp chung: <Điều kiện> Nhóm l ệnh A
[ ELSE ] Nhóm l ệnh B
ENDIF
; Hết điều kiện dịch
<Điều kiệ kiện> có thể có những hình thức sau: IFE : Nếu = 0 thì nhóm l ệnh A đượ c dịch. Nếu ≠ 0 thì nhóm l ệnh B đượ c dịch (nế u có l ệnh giả ELSE)
IF1 : Nếu đang dịch lần 1 thì nhóm l ệnh A đượ c dịch IF2 : Nếu đang dịch lần 2 thì nhóm l ệnh A đượ c dịch IFDEF : Nếu ký hiệu đã định ngh ĩ a thì dịch nhóm lệnh A. IFNDEF : Nếu ký hiệu không đượ c định ngh ĩ a thì dịch nhóm lệnh A IFB <ĐốiSố> : N ếu đối s ố là khoảng tr ống hoặc không có đối số thì dịch nhóm lệnh A. IFNB <ĐốiSố> : Nếu có đối số thì dịch nhóm lệnh A IFIDN <ĐốiSố1>, <ĐốiSố2>: Nếu ĐốiSố1=ĐốiSố2 thì dịch nhóm lệnh A IFDIF <ĐốiSố1>,<ĐốiSố2>: Nếu ĐốiSố1 ≠ ĐốiSố2 thì dịch nhóm lệnh A
H ợ ợ p Ng ữ ữ
D. Nhóm lệnh giả về MACRO
Cú pháp:
MACRO
[tham số]
….
; đoạn chươ ng ng trình
ENDM
; chấm dứt Macro
Ví d ụ : Viết MACRO tên gen vớ i 3 tham số vào X, Y, Z nh ư sau :
gen
MACRO X, Y, Z MOV AX, X ; AX ← X ADD AX, Y ; AX ← AX + Y ADD AX, Z ; AX ← AX + Z ENDM Trong chươ ng ng trình, gọi macro gen bằng lệnh: gen 10, 20, 30 ; X=10, Y=20, Z=30 Một đoạn chươ ng ng trình sau đây đượ c xen vào ngay lệnh gọi macro: MOV ADD ADD
AX, 10 AX, 20 AX, 30
; AX ← 10 ; AX ← AX + 20 ; AX ← AX + 30
Ngoài ra, trong Macro ta có th ể dùng lệnh giả LOCAL, EXITM:
EXITM : Thoát ra khỏi MACRO tr ướ ướ c khi gặ p lệnh ENDM. ng trong các MACRO khi ch ươ ng ng LOCAL: Định ngh ĩ a các nhãn địa phươ ng trinh muốn gọi macro nhiều lần. Ví d ụ: WAIT
MACRO MOV next: ADD LOOP ENDM
count CX, count AX, 1 next
MACRO nầy ch ỉ đượ c phép gọi m ột l ần vì nhãn next chỉ có thể xuất hi ện trong chươ ng ng trình một lần. Nếu muốn gọi macro WAIT nhiếu lần thì ta ph ải thêm lệnh giả local như sau: WAIT
MACRO
Local MOV next: ADD LOOP ENDM
count next ; nhãn địa phươ ng ng CX, count AX,1 next
E. Nhóm lệ lệnh giả giả về liliệệt kê (listing) Nhóm lệnh n ầy dùng để điều khiển in ấn chươ ng ng trình theo 1 định d ạng v ăn b ản ng trình ở đầ ở đầu mỗi trang, như: Số trang, số cột, Tựa đề chươ ng PAGE số hạng, số cột Ví d ụ : PAGE 58, 60 ; mỗi trang liệt kê có 58 hàng, 60 c ột. TITLE (đề tựa) : cho phép đặt đề tựa chươ ng ng trình
H ợ ợ p Ng ữ ữ Ví d ụ : TITLE chươ ng ng trình h ợ p ng ữ t . ữ thứ nhứ t
SUBTTL (Subtitle: đề tựa con): liệt kê tựa đề con ở mỗi đầu trang. % OUT : v ăn b ản đượ c liệt kê khi h ợ p ngữ dịch chươ ng ng trình. Bao gồm các chỉ thị loại văn bản sau: .LIST : Liệt kê tất cả dòng lệnh vớ i mã của nó (mặc nhiên) .XLIST : Không cho li ệt kê .XALL : Liệt kê mã do MACRO tạo nên .LALL : Liệt kê toàn bộ MACRO .SALL : Không liệt kê MACRO .CREF : Liệt kê bảng đối chiếu chéo .XCREF : Không liệt kê bảng đối chiếu chéo 2.3.4. Toán hạng và toán tử A. Toán hạng: Hợ p ngữ phân biệt 3 loại toán hạng: tức thì, thanh ghi và ô nh ớ . Để phân biệt, mỗi loại toán h ạng có cách viết khác nhau hoàn toàn. A.1. Toán hạ hạng tứ c thì: có thể là một số, biểu thức hay một ký hiệu đã đượ c định ngh ĩ a (bằng lệnh EQU hay =). Toán hạng t ức thì có th ể đượ c sử dụng theo 4 dạng: thậ p phân, nhị phân, thậ p lục phân, bát phân và Ký t ự Cách viế t: t: 10, ‘B’, 10b, 10h Ký hiệu t ổ n ổng g quát đại diện cho toán h ạng t ứ ức thì: Immed Immed8 Immed16 Immed32
: Toán hạng tức thì nói chung : Toán hạng tức thì 8 bit : Toán hạng tức thì 16 bit : Toán hạng tức thì 32 bit
A.2. Toán hạ hạng thanh ghi: dùng để truy xuất đến nội dung thanh ghi. Cách viế t: t: AX, BX, CX, DX, AL, AH, SI, DS, ... Ký hiệu t ổ n ổng g quát đại diện cho toán h ạng thanh ghi: Reg Reg8 Reg16 SegReg
: Toán hạng thanh ghi đa dụng nói chung : Toán hạng thanh ghi đa dụng 8 bit : Toán hạng thanh ghi đa dụng 16 bit : Toán hạng thanh ghi đoạn
A.3. Toán hạ hạng ô nhớ nhớ : dùng để truy xuất đến nội dung ô nhớ . Toán hạng ô nhớ thườ ng ng đượ c tượ ng ng tr ưng một địa chỉ của ô nhớ . Địa chỉ đó luôn luôn là địa chỉ độ dờ i trong một đoạn tươ ng ng ứng. Các cách viế t cơ bản:
Tên_Biế Tên_Biến : Truy xuất đến nội dung của Biến. [Immed16] : Truy xuất nội dung của ô nhớ trong đoạn DS, ô nhớ đ ớ đó có địa chỉ độ dờ i là Immed16 . Còn gọi là tr ực tiế p ô nhớ .
H ợ ợ p Ng ữ ữ
: Truy xuất n ội dung của ô nhớ trong đoạn DS, mà ô nh ớ đ ớ đó có địa chỉ độ dờ i lưu trong Reg16 . Còn gọi là gián ti ế p thanh ghi.
[Reg16] Ví d ụ:
MOV AH, FOO ; AH ← nội dung bi ế n FOO MOV DH, [1234h] ; DH ← nội dung ô nh ớ có địa chỉ là 1234h MOV AL, [BX] ; AL ← nội dung ô nh ớ có địa chỉ trong BX Ký hiệu t ổ n ổng g quát đại diện cho toán h ạng ô nhớ : Mem Mem8 Mem16 Mem32
: Toán hạng ô nhớ nói chung : Toán hạng ô nhớ 8 bit : Toán hạng ô nhớ 16 bit : Toán hạng ô nhớ 32 bit
Ví d ụ các cách viế t khác c ủa toán h ạng ô nhớ :
FOO+5 , FOO[5] , 5[FOO] : chỉ đến địa chỉ “FOO cộng 5” (FOO là tên c ủa 1 biế n) n)
FOO
FOO+1
FOO+2
FOO+3
FOO+4
FOO+5
5[BX][SI] , [BX+5][SI] , [BX]5[SI] : tươ ng ng đươ ng ng vớ i [BX+SI+5].
B. Toán tử: Có 4 loại toán tử: Thuộc Tính, Số Học, Quan Hệ và Logic. Cú pháp chung:
Toán tử tác động lên toán hạng để cho ra k ết quả, k ết quả này dùng làm toán hạng trong lệnh.
B.1. Toán tử tử thu thuộộc tính (attribute): PTR (pointer): dùng thay đổi kiểu của các địa chỉ, số liệu Ví d ụ : CALL Word PTR [BX+SI] ; Gọi CT Con [BX+SI] mặc nhiên tr ỏ tớ i ô nhớ (dữ liệu) 1 byte, nhưng n ếu mu ốn l ấy d ữ liệu 2 byte thì ph ải dùng WORD PTR để đổi.
: (Dấu hai chấm): dùng thay đổi đoạn mặc nhiên. Ví d ụ : MOV AH, ES : [BX+SI] ; AH ← ES:[BX+SI] [BX+SI] mặc nhiên là địa chỉ độ dờ i của d ữ liệu trong đoạn DS nhưng n ếu dữ liệu trong đoạn ES thì ph ải viết ES :[BX+SI] SHORT: dùng để thay đổi kiểu mặc nhiên là Near của l ệnh JMP (lệnh nhảy) và báo cho h ợ p ngữ biết chỉ nhảy trong vòng t ừ -128 đến +127 so vớ i vị trí lệnh JMP THIS : tạo một toán hạng có giá tr ị tùy thuộc vào tham số của THIS Ví d ụ: NH EQU THIS BYTE SCH = THIS NEAR
NH LABEL BYTE SCH LABEL NEAR
SEG : tr ả về địa chỉ đ oạn của một nhãn hay biến Ví d ụ: lấy địa chỉ đoạn của biến TENB vào AX MOV AX, SEG TENB
H ợ ợ p Ng ữ ữ
ời của một nhãn hay biến OFFSET: tr ả về địa chỉ độ d ờ Ví d ụ: MOV BX, OFFSET FOO ; độ dờ i của biến FOO TYPE: Xác định kiểu của biến hay nhãn TYPE : cho số byte ô nhớ mà loại biến đó đượ c khai báo (BYTE = 1, WORD= 2, DWORD = 4 ... ) TYPE : 0FFFFh nếu nhãn Near; 0FFFEh n ếu nhãn Far
LENGTH : Tr ả về số phần tử của biến mãng khai báo b ằng DUP() SIZE : tr ả về tổng số byte mà một biến chiếm Ví d ụ: FOO MOV MOV MOV MOV
B.2. Toán tử tử ssố học: Ngoài các toán tử số học thông dụng (+, -, *, /) còn có các toán t ử:
MOD MOD : chia lấy số dư SHR : dịch sang trái SHL : dịch sang phải – : Dấu tr ừ đứng tr ướ ướ c một số để chỉ đó là số âm: -5, -300 Ví d ụ:
MOV AX, 100 MOD 17
; AX ← 15
MOV AX, 1100000b SHR 5 ; AX ← 11b
B.3. Toán tử tử quan quan hệ h ệ: Toán tử quan hệ dùng so sánh 2 toán h ạng và thườ ng ng đượ c dùng trong việc d ịch chươ ng ng trình có điều kiện Cú pháp: : >: EQ (Equal): tr ả về 1 (TRUE) nếu 2 toán hạng bằng nhau NE (not equal): tr ả về TRUE nếu 2 toán hạng không b ằng nhau LT (less than): tr ả về TRUE nếu (toán hạng 1) < (toán h ạng 2). GT (greater than): tr ả về TRUE nếu (toán hạng 1)> (toán hạng 2) LE (less than or equal): tr ả về TRUE nếu (t.hạng 1) ≤ (t.hạng 2) GE (greater than or equal): tr ả về TRUE nếu (t.hạng 1) ≥ (t.hạng 2) ng ứng giữa 2 toán hạng. B.4. Toán tử tử logic: logic: so sánh từng bit tươ ng NOT : tr ả về TRUE nếu hai toán hạng logic bên trái và ph ải khác nhau AND : tr ả về TRUE nếu cả hai toán hạng logic đều là TRUE. OR : tr ả về TRUE nếu một trong hai toán h ạng là TRUE XOR : tr ả về TRUE nếu hai toán h ạng khác nhau.
H ợ ợ p Ng ữ ữ Ví d ụ: MOV AH, 10 MOV AL, 15 MOV DH, AH EQ AL MOV DL, AH EQ 10 MOV CH, AL LT AH MOV BH, AH AND 0Ah
2.4. CẤU TRÚC CỦA CHƯƠNG TRÌNH H ỢP NGỮ MASM Một chươ ng ng trình hợ p ngữ có thể gồm nhiều module. Các module có th ể viết riêng lẽ bằng một chươ ng ng trình xử lý văn bản và dịch riêng lẽ bằng MASM để cho các chươ ng ng trình đích. Các chươ ng ng trình đích sẽ đượ c chươ ng ng trình liên k ết (LINK) nối lại vớ i nhau thành m ột chươ ng ng trình chạy đượ c có đuôi EXE. Mỗi module có th ể viết theo một cấu trúc tổng quát như sau: PAGE
60, 132
TITLE
; chọn tiền đề cho module.
….
; các phát biểu EXTRN hay PUBLIC (nếu có).
MCR
ếu có MACRO ; N ế …..
; viế t macro
ENDM STACK SEGMENT PARA STACK ‘STACK’ DB 64 DUP (?) STACK ENDS DSEG DSEG
SEGMENT PARA PUBLIC ‘DATA’ …. ; Khai báo D ữ liệu ENDS
CSEG
SEGMENT PARA PUBLIC ‘CODE’ ASSUME CS:CSEG, DS:DSEG, SS:STACK BATDAU:MOV AX, DSEG ; khở i động DS MOV DS, AX ….
CTC
; (chươ ng ng trình chính)
PROC NEAR ; N ế ếu có ….
; viế t chươ ng ng trình con
CTC
ENDP
CSEG
ENDS t đầu ứt CTrình và ch ọn địa chỉ bắ t END BATDAU ; Chấ m d ứ
H ợ ợ p Ng ữ ữ
2.4.3. Tập tin thi hành d ạng COM và dạng EXE Hợ p ngữ MASM cho phép t ạo 2 loại tậ p tin thi hành. Tậ p tin dạng COM dùng cho các chươ ng ng trình nh ỏ và tậ p tin d ạng EXE dùng để xây dựng các chươ ng ng trình lớ n. n. Mỗi loại có cấu trúc chươ ng ng trình khác nhau. 1. Dạng COM: - Chỉ dùng một đoạn duy nhất, các thanh ghi CS, DS, ES và SS đều có giá tr ị giống nhau. - Kích thướ c chươ ng ng trình tối đa là 64K. - Tậ p tin COM đượ c nạ p vào bộ nhớ trong và thực hi hiện nhanh hơ n tậ p tin EXE. Khi DOS th ực hi ện t ậ p tin COM, nó tạo m ột vùng ô nhớ từ độ dờ i 0 đến 0FFh để chứa thông tin c ần thiết cho DOS. Vùng này gọi là vùng PSP (program segment prefix) và tất c ả các thanh ghi đoạn đều ph ải ch ỉ tớ i vùng PSP này. Vì th ế địa ch ỉ bắt đầu của tậ p tin COM phải có địa chỉ độ dờ i là 100h. C ấ ng trình đ i iể ấu trúc chươ ng ể n hình của t ậ p tin d ạng COM như sau: ….. ; Khai báo h ằng số (Nếu có) MNAME MACRO ….. ; Vi ế ết Macro (N ế ếu có) ENDM CSEG SEGMENT ASSUME CS: CSEG, DS: CSEG ORG 100h start: MOV AX, CSEG MOV DS, AX ; khở i động DS … ; (Chươ ng ng trình chính) INT 20h ; thoát … ; Khai báo d ữ ữ li ệ ệu (N ế ếu có) CT_CON PROC ….. ; Vi ế ết Thủ t ục (N ế ếu có) RET CT_CON ENDP CSEG ENDS END start 2.4.3.2. Dạng EXE: - Chươ ng ng trình lớ n và nằm ở nhiều đoạn khác nhau. - Có thể gọi các chươ ng ng trình con d ạng Far. - Kích thướ c tậ p tin tùy ý. - Có header ở đầ ở đầu tậ p tin để chứa các thông tin điều khiển cần thiết. - Thi hành chậm hơ n tậ p tin dạng COM. Tậ p tin dạng EXE, không dùng l ệnh ORG 100h ở đầ ng trình. ở đầu chươ ng
H ợ ợ p Ng ữ ữ C ấ ng trình đ i iể ấu trúc chươ ng ể n hình của t ậ p tin d ạng EXE như sau:
; hay MOV AX,4C00h ; thoát ; Vi ế ết các Thủ t ục (N ế ếu có)
RET ENDP
CT_CON CSEG ENDS END start
2.4.4. Ví dụ: ng trình hợ p ngữ sau thực hiện việc in ký tự ‘B’ lên màn hình (sử Đoạn chươ ng dụng hàm 02h c ủa ngắt 21h – Ng Ng ắ ng 4) ắ t này đượ c trình bày c ụ thể trong chươ ng MOV AH, 02h MOV DL, ‘B’ INT 21h
; S ử ử d ụ ụng n g hàm in ký t ự ự c ủ ủa ng ắt 21h ; DL chứ a ký t ự ự c ần in ; Gọi ng ắt để thự c công vi ệc
1. Muốn đoạn chươ ng ng trình này th ực thi trên máy tính ở dạng COM thì ph ải dùng cấu trúc chươ ng ng trình dạng COM để viết, như sau:
H ợ ợ p Ng ữ ữ
CSEG SEGMENT ASSUME CS: CSEG
ORG 100h MOV DL, ‘B’
; S ử ử d ụ ụng n g hàm in ký t ự ự c ủ ủ a ng ắt 21h ; DL chứ a ký t ự ự c ần in
INT
; Gọi ng ắt để thự c công vi ệc
Begin: MOV AH, 02h 21h
INT 20h CSEG ENDS END Begin 2. Muốn đoạn ch ươ ng ng trình này thực thi trên máy tính ở dạng EXE thì phải dùng cấu trúc chươ ng ng trình dạng EXE để viết, như sau: DSEG SEGMENT ; Vì không có bi ế n để khai báo nên đ oạn DSEG có th ể bỏ đ i DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG Begin: MOV AX, DSEG MOV DS, AX MOV AH, 02h MOV DL, ‘B’ INT 21h
; S ử ử d ụ ụng n g hàm in 1 ký t ự ự c ủ ủa ng ắt 21h ; DL chứ a ký t ự ự c ần in ; Gọi ng ắt để thự c công vi ệc
MOV AH, 4Ch INT 21h CSEG ENDS END Begin 3. Viết lại chươ ng ng trình trên nhưng không khai báo đoạn DSEG, khi đó chươ ng ng trình chỉ có 1 đoạn duy nhất, như sau: CSEG SEGMENT ASSUME CS: CSEG, DS: CSEG Begin: MOV AX, CSEG MOV DS, AX MOV AH, 02h MOV DL, ‘B’ INT 21h
MOV AH, 4Ch INT 21h CSEG ENDS END Begin
; S ử ử d ụ ụng n g hàm in ký t ự ự c ủ ủ a ng ắt 21h ; DL chứ a ký t ự ự c ần in ; Gọi ng ắt để thự c công vi ệc
H ợ ợ p Ng ữ ữ
II.5. CÁCH T ẠO CHƯƠNG TRÌNH H ỢP NGỮ: ng trình vi ết bằng hợ p ngữ chạy trên máy tính PC, bạn cần phải Để tạo một chươ ng có bộ trình hợ p dịch MASM (hay TASM). Trình h ợ p dịch MASM đượ c cung cấ p gồm các 2 tậ p tin cơ bản: MASM.EXE (h ợ p dịch) và LINK.EXE (liên k ết). Ngoài ra còn một số tậ p tin khác như EXE2BIN.COM dùng để chuyển sang dạng COM và DEBUG.COM dùng để gở r ối chươ ng ng trình. Các t ậ p tin này đượ c thực thi dướ i MSDOS. Cần ba hoặc bốn bướ c để tạo chươ ng ng trình hợ p ngữ chạy đượ c trên máy tính PC. Hình 2.6 và 2.7 mô t ả các bướ c và lưu đồ thực hiện qui trình này. DSEG SEGMEMNT … DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG BD: MOV AX,DSEG MOV DS,AX … … CSEG ENDS END BD
EDIT
File nguồn
MASM
*.ASM Bướ c 1
Bướ c 2
File đối tượng
LINK
*.OBJ
File thi hành *.EXE
Bướ c 3
Hình 2.6: Các b ướ c t ạo chươ ng ng trình h ợ p ng ữ ữ
BƯỚ C 1: Thảo chươ ng, ng, tạo tậ p tin nguồn (*.ASM) Dùng bất k ỳ trình soạn thảo văn bản dạng TEXT quen thu ộc để viết chươ ng ng trình nguồn hợ p ngữ, lưu thành file có ph ần mở r ộng là *.ASM, Ví d ụ: HELLO.ASM BƯỚ C 2: Hợ p dịch file ASM thành file đối tượ ng ng (HELLO.OBJ) C:\> MASM Trình hợ p dịch kiểm tra lỗi cú pháp trên t ừng dòng lệnh. Nếu có lỗi thì phải quay về bướ c 1 để sửa chữa và dịch lại cho đến hết lỗi.
BƯỚ C 3: Liên k ết một hay nhiều file OBJ thành file thi hành (*.EXE) C:\> LINK LINK [ …] [] []
BƯỚ C 4: Đổi từ EXE sang COM (Dành cho chươ ng ng trình vi ết dạng COM) C:\> EXE2BIN Ví d ụ: Dịch file nguồn HELLO.ASM thành file th ực thi HELLO.EXE, t ừng bướ c thực hiện các lệnh như sau
C:\>MASM HELLO; C:\>LINK HELLO;
H ợ ợ p Ng ữ ữ
Thảo chương
MASM (Hợp dịch)
CÓ LỖI?
Đ
S LINK (Liên kết)
DẠNG *.COM ? S
Đ Thi hành !!!
EXE2COM Hình 2.7: L ư u đồ thự c hiện qui trình
Ngày nay, hầu hết các máy tính đều sử dụng hệ điều hành Windows, nên các lậ p trình viên đã phát tri ển các phần mềm chạy trên Windows 98/2000/XP để làm môi tr ườ ng phát triển Hợ p ngữ, như RadASM Assembly IDE (http://www.radasm.com ( http://www.radasm.com). ). ườ ng Khi đó, việc sử dụng các phần mềm này đơ n giản hơ n r ất nhiều thông qua giao di ện đồ họa, nó cung cấ p sẳn giao diện soạn thảo chươ ng ng trình nguồn mạnh và các bướ c hợ p dịch, liên k ết đều đượ c thực hiện trên thanh công c ụ hay bằng phím tắt.
T ậ p l ệnh Intel-8086 và Kiể u định vị
Chương 3 T ẬP LỆNH INTEL-8086 và KI Ể U ĐỊNH V Ị 3.1. TẬP LỆNH CỦA CPU-8086 Bộ xử lý 8086 có tậ p lệnh gồm 111 lệnh vớ i chiều dài của lệnh từ 1 byte đến vài byte. Tậ p lệnh của họ các bộ xử lý Intel 80x86 càng ngày càng có nhi ều lệnh mạnh và phức tạ p (CPU-80386 có 206 lệnh, Pentium có hơ n 400 lệnh). Lệnh của CPU-8086 có tối đa 2 toán h ạng, mỗi lệnh có số toán hạng và loại toán hạng đã đượ c xác định tr ướ c. Cú pháp t ổng quát như sau: ướ c. TH1, TH2 Tác vụ lệnh cho biết công việc mà CPU s ẽ thực hi ện (là thành phần b ắt bu ộc), các toán hạng (TH1 và TH2) phải cách nhau bở i dấu phẩy (,). ng TH2 sẽ là toán hạng nguồn còn Đối vớ i lệnh có hai toán h ạng, thông thườ ng TH1 là toán hạng đích và cũng là toán hạng nguồn còn lại. Kích th ướ c của hai toán hạng phải bằng nhau: - Nếu TH1 là 8 bit thì TH2 c ũng phải là 8 bit và ng ượ c lại. - Nếu TH2 là 16 bit thì TH1 c ũng phải là 16 bit và ng ượ c lại. Tậ p lệnh CPU-8086 đượ c sắ p xế p theo các nhóm nh ư sau: • Sao chép dữ liệu và địa chỉ • Tính toán s ố học • Tính toán logic, ghi d ịch và quay • Truy xuất ngoại vi • Lệnh hệ thống • R ẽ nhánh và vòng lậ p • Chươ ng ng trình con • Xử lý chuỗi Chươ ng ng này chỉ trình bày các nhóm l ệnh đơ n giản và thườ ng ng dùng . Các nhóm lệnh phức t ạ p như: r ẽ nhánh, vòng lậ p, chươ ng ng trình con và xử lý chuỗi) sẽ đượ c trình bày trong những chươ ng ng sau (chươ ng ng 5, 6 và 7). T ậ p lệnh đầy đủ của bộ xử lý Intel8086 sẽ đượ c giớ i thiệu trong phụ lục 1. 3.1.1. Lệnh sao chép dữ liệu, địa chỉ:
T ậ p l ệnh Intel-8086 và Kiể u định vị Ý nghĩ a: a: Sao chép dữ liệu (xác định bở i toán hạng nguồn) vào vùng nhớ hoặc thanh ghi (xác định bở i toán hạng đích). Sau khi th ực hiện xong thì giá tr ị toán hạng nguồn và toán h ạng đích bằng nhau. Lư u ý: - Lệnh MOV không ảnh hưở ng ng đến thanh ghi tr ạng thái. - Một trong hai toán h ạng phải là thanh ghi. Ví d ụ: MOV CX, BX ; Sao chép nội dung thanh ghi BX vào thanh ghi CX. Sau khi thực hiện xong, BX=CX. MOV DX, 1234h ; DL ← 34h, DH ← 12h MOV DS, AX
; DS ← AX
MOV AH, [1234h]
; AH ← M[DS:1234h]
MOV [1235h], DX
; M[DS:1235h] ← DL, M[DS:1236h] ← DH
; SAI vì AH có 8 bit trong khi CX là 16 bit.
MOV AH, CX
Bộ Nhớ DS:1237h DS:1236h DS:1235h
DX
DH
DL
DS:1234h
1235h ], DX Hình 3.1: Mô t ả l ệnh MOV [ 1235h Hình 3.1 mô tả cách sao chép dữ liệu 16 bit giữa thanh ghi và ô nhớ . Byte th ấ p của dữ liệu trong DX (là DL) đưa vào ô nhớ địa chỉ thấ p (DS:1235h), còn byte cao trong DX (là DH) đưa vào ô nhớ có địa chỉ cao hơ n (DS:1236h)
2. XCHG – Hoán chuyể n dữ liệu ; Đích ↔ Nguồn Đích, Nguồn Nguồn, đ ích: ích: Reg, Mem. Ý nghĩ a: a: Lệnh XCHG hoán chuyển dữ liệu giữa nguồn và đích. Cả hai toán hạng không đồng thờ i là Mem.
Cú pháp: LEA Reg16, Mem16 ; Reg16 ← Địa chỉ độ dờ i Ý nghĩ a: a: Lấy địa chỉ độ dờ i của biến hay nhãn (mem16) đưa vào thanh ghi đích Reg16.
Ví d ụ:
LEA DX, bienA ; Lấy độ dờ i của biến bienA lưu vào DX Theo hình 3.1, bienA đượ c cấ p phát tại vùng nhớ có sau khi thực hiện lệnh thì thanh ghi DX = 1A2Bh.
địa chỉ độ dờ i là 1A2Bh,
T ậ p l ệnh Intel-8086 và Kiể u định vị Bộ Nhớ
Địa Chỉ DS:1A2C6h
bienA→
DX
1Ah
2Bh
DS:1A2Bh DS:1A2Ah
Hình 3.2: Mô t ả l ệnh LEA DX, bienA 3.1.2. Lệnh tính toán s ố học. 1. ADD - Cộng hai số nguyên
đích, nguồn ; đích ← đích – nguồn Nguồn : Reg, Mem, Immed. Đích : Reg, Mem. Ý nghĩ a: a: Lấy toán hạng đích (số bị tr ừ) tr ừ toán hạng nguồn (số tr ừ) và lưu k ết qu ả ở toán hạng đích. Ví d ụ: ADD AL, 15 ; AL ← AL + 15 ADD AX, DX ; AX ← AX + DX SUB BX, 15h ; BX ← BX – 15h SUB DX, CL ; SAI vì DX là 16bit trong khi CL ch ỉ có 8bit ADD 15h, AL ; SAI vì đích là Immed
Cú pháp:
SUB
3. INC - Tăng 1 đơn vị (Increment)
Cú pháp:
đích ; đích ← đích + 1 Đích : Reg, Mem. Ý nghĩ a: a: Tăng nội dung của toán hạng đích thêm 1 đơ n vị. INC
4. DEC - Giảm 1 đơn vị (Decrmemt)
Cú pháp:
DEC đích
đích ← đích – 1 Đích : Reg, Mem. Ý nghĩ a: a: Giảm nội dung của đích đi 1 đơ n vị. Ví d ụ: INC AL ; AL ← AL + 1 DEC AX ; AX ← AX - 1 INC bienC ; bienC ← bienC + 1 ;
5. MUL - Nhân hai số nguyên
Cú pháp:
MUL nguồn
Nguồn: Reg, Mem
T ậ p l ệnh Intel-8086 và Kiể u định vị Ý nghĩ a: a: Nhân thanh ghi tích l ũy vớ i toán hạng nguồn. Tùy vào kích thướ c của toán hạng nguồn mà CPU thực hiện phép nhân 8 hay 16 bit. - Nhân 8 bit: dành cho toán h ạng nguồn là 8 bit. Khi đó, CPU sẽ lấy thanh ghi AL nhân vớ i toán hạng nguồn và lưu k ết quả vào AX. - Nhân 16 bit: dành cho toán hạng nguồn là 16 bit. Khi đó, CPU sẽ nhân thanh ghi AX vớ i toán hạng nguồn và lưu k ết quả vào cặ p thanh ghi DX:AX (nghĩ a là ết quả có 32 bit, 16 bit cao l ư ưu vào DX, còn 16 bit th ấ p l ư ưu vào AX) k ế Ví d ụ: MUL BL ; AX ← AL * BL (nhân 8 bit) MUL BX ; DX:AX ← AX * BX (nhân 16 bit) MUL [1235h] ; AX ← AL * M[DS:1235h] (nhân 8 bit) 6. DIV - Chia hai số nguyên
Cú pháp:
DIV nguồn
Nguồn: Reg, Mem Ý nghĩ a: a: lấy thanh ghi tích l ũy (số bị chia) chia cho ngu ồn (số chia). Tùy vào kích thướ c của toán hạng nguồn mà CPU thực hiện phép chia 8 hay 16 bit. - Chia 8 bit: dành cho toán hạng nguồn là 8 bit. Khi đó, CPU sẽ lấy thanh ghi AX chia cho toán hạng nguồn. Thươ ng ng s ố của k ết qu ả đượ c l ưu vào AL còn phần dư lưu vào AH. - Chia 16 bit: dành cho toán h ạng nguồn là 16 bit. Khi đó, CPU lấy DX:AX (số 32 bit) chia cho toán h ạng nguồn. Thươ ng ng số của k ết qu ả đượ c l ưu vào AX còn phần dư thì lưu vào DX. Ví d ụ: DIV DL DIV BX
; AL, AH ← AX ÷ DL ; AX, DX ← DX:AX ÷ BX
3.1.3. Nhóm lệnh logic và ghi d ịch 1. AND, OR, XOR, TEST: Và, Ho ặc, Cộng không nhớ, Kiể m tra bit Cú pháp:
Nguồn: Reg, Mem hay Immed. Đích: Reg, Mem. Ý nghĩ a: a: Thực hiện phép toán logic (and, or, xor) theo t ừng bit tươ ng ng ứng giữa toán hạng đích và toán hạng nguồn, lưu giữ k ết quả ở toán hạng đích. - Lệnh TEST thực hiện kiểm tra bit, gi ống lệnh AND nhưng không lưu giữ lại k ết quả mà k ết quả của phép toán ch ỉ ảnh hưở ng ng đến các cờ tr ạng thái. Ví d ụ: MOV AL, 01101110b ; AL ← 01101110b AND AL, 00110110b ; AL ← AL ∧ 01101110b (AL=00100110b) XOR AX, AX ; AX ← AX ⊕ AX (K ế ết quả: AX = 0)
T ậ p l ệnh Intel-8086 và Kiể u định vị AND DL, 11000011b ; Xóa 4 bit giữa trong thanh ghi DL TEST DH, 00010000b ; Kiểm tra giá tr ị của bit 4 trong thanh ghi DH. K ết quả kiểm tra s ẽ ảnh hưở ng ng lên cờ Zero (ZF)
2. NOT – Đảo bit (Lấ y Bù 1)
đích ; đích ← đích Đích: Reg, Mem Ý nghĩ a: a: Đảo ngượ c từng bit (hay lấy bù 1) toán h ạng đích. Ví d ụ: MOV AH, 0Fh ; AH ← 0Fh (00001111b)
Cú pháp:
NOT
NOT AH
; AH = 0F0h (11110000b)
3. SHL – Dịch trái logic (logical SHift Left)
Cú pháp:
SHL đích, 1
; dịch toán hạng đích sang trái 1 bit.
SHL đích, CL ; dịch sang trái CL bít
Đích: Reg, Mem
Ý nghĩ a: a: Dịch toán hạng đích sang trái, có th ể dịch 1 bit hay nhiều bit hơ n (CL chứa số bit dịch). LSB đượ c nạ p vào logic 0, còn MSB đượ c dịch sang cờ Carry (CF). CF
7
2
1
0
0
Hình 3.3: Dịch toán hạng đ ích ích 8 bit sang trái 1 bit Ví d ụ:
MOV AL, 01101101b
; AL = 01101101b
SHL AL, 1
; AL = 11011010b và CF=0
4. SHR (logical shift right) d ịch phải logic.
Cú pháp:
SHR đích, 1
; dịch trái toán h ạng đích 1 bit.
SHR đích, CL ; dịch trái đích vớ i số bít trong CL
Ý nghĩ a: a: Giống lệnh SHL nhưng bay giờ dịch toán hạng đích sang phải 7
6
1
0
CF
0
Hình 3.4: Dịch toán hạng đ ích ích 8 bit sang phải 1 bit Ví d ụ:
MOV AL, 01101101b
; AL = 01101101b
SHR AL, 1
; AL = 00110110b và CF=1
5. SAL (Shift arithmetic left): dịch trái số học
Cú pháp:
SAL đích, 1
; dịch toán hạng đích sang trái 1 bit.
SAL đích, CL ; dịch sang trái CL bít
Đích: Reg, Mem
Ý nghĩ a: a: Lệnh nầy giống SHL nhưng LSB (bit th ấ p nhất) vừa đượ c dịch lên bít 1 và giữ nguyên (bảo toàn bit 0).
T ậ p l ệnh Intel-8086 và Kiể u định vị CF
7
2
1
0
Hình 3.5: Dịch toán hạng đ ích ích 8 bit sang trái 1 bit Ví d ụ:
MOV AL, 01101101b
; AL = 01101101b
SHL AL, 1
; AL = 11011011b và CF=0
6. SAR (Shift arithmetic right) : d ịch phải số học
Cú pháp:
SAR đích, 1
; dịch toán hạng đích sang trái 1 bit.
SAR đích, CL ; dịch sang trái CL bít
Đích: Reg, Mem
Ý nghĩ a: a: Lệnh nầy giống SHR nhưng MSB (bit cao nh ất) vừa đượ c dịch xuống bit th ấ p hơ n và giữ nguyên (bảo toàn bit MSB – Bit Bit d ấ ấu ). 7
6
0
CF
Hình 3.6: Dịch toán hạng đ ích ích 8 bit sang phải 1 bit Ví d ụ:
MOV AL, 01101101b
; AL = 01101101b
SAR AL, 1
; AL = 00110110b và CF=1
7. ROL (Rotate left) : quay vòng sang trái
Cú pháp:
ROL đích, 1
; quay vòng toán hạng đích sang trái 1 bit.
ROL đích, CL ; quay vòng sang trái số lần quay bằng CL.
Ý nghĩ a: a: Giống SHL, nhưng thực hiện việc quay vòng, MSB d ịch vào LSB CF
7
2
1
0
Hình 3.7: Quay toán hạng đ ích ích 8 bit sang trái 1 bit Ví d ụ:
MOV AL, 01101101b
; AL = 01101101b
ROL AL, 1
; AL = 11011010b và CF=0
8. ROR (Rotate right) : Quay vòng sang phải
Cú pháp:
ROR đích, 1
; Quay vòng toán hạng đích sang phải1 bit.
ROR đích, CL ; Quay vòng vớ i số lần quay bằng CL
Đích: Reg, Mem
Ý nghĩ a: a: Lệnh nầy giống ROL nhưng quay vòng sang phải, ngh ĩ a là LSB (bit th ấ p nhất) vừa đượ c dịch đến MSB. 7
6
0
CF
Hình 3.8: Quay toán h ạng đ ích ích 8 bit sang phải 1 bit
T ậ p l ệnh Intel-8086 và Kiể u định vị Ví d ụ:
MOV AL, 01101101b
; AL = 01101101b
SAR AL, 1
; AL = 00110110b và CF=1
9. RCL (Rotate through carry left): Quay trái qua c ờ Carry
Cú pháp:
RCL đích, 1
; quay vòng TH. đích qua cờ sang trái 1 bit.
RCL đích, CL ; quay vòng qua cờ sang trái số lần bằng CL.
Ý nghĩ a: a: Giống như lệnh ROL nhưng có sự tham gia của cờ carry (CF). Xem hình 3.9. Như vậy CF c ũng là 1 bit tham gia vào vòng quay CF
7
2
1
0
Hình 3.9: Quay toán hạng đ ích ích 8 bit qua cờ sang trái 1 bit 10. RCR (Rotate through carry right): Quay vòng qua c ờ sang phải
Cú pháp:
RCR đích, 1
; Quay vòng TH. đích qua cờ sang phải 1 bit.
RCR đích, CL ; s ố lần quay bằng CL
Đích: Reg, Mem
Ý nghĩ a: a: Lệnh nầy giống RCL nhưng quay vòng sang phải. 7
6
0
CF
Hình 3.10: Quay toán hạng đ ích ích 8 bit qua cờ sang phải 1 bit 3.1.4. Nhóm lệnh vào ra ngo ại vi. 1. IN - Lấ y số liệu từ ngoại vi.
Cú pháp:
IN AL, địa chỉ cổng 8 bít IN AL, DX
; DX chứa địa chỉ cổng 16 bit
Ý nghĩ a: a: Lấy dữ liệu ở ngoại vi có địa chỉ 8 bit đưa vào thanh ghi AL. N ếu địa chỉ của ngoại vi là 16 bít thì ph ải dùng DX chứa địa chỉ này. Ví d ụ : - Đọc dữ liệu ở ngoại vi 3Fh IN AL, 3Fh ; AL ← port(3Fh) (3Fh là địa chỉ cổ ng ng 8 bít) - Đọc dữ liệu ở ngoại vi 3F8h MOV DX, 3F8h ; DX ← 3F8h (3F8h là địa chỉ cổ ng ng 16 bit) IN AL, DX ; AL ← port(DX) 2. OUT - Đư a số liệu ra ngoại vi.
Cú pháp:
OUT địa chỉ cổng 8 bít, AL
; port(8 bit) ← AL
OUT DX, AL
; port(DX) ← AL
Ý nghĩ a: a: Giống lệnh IN nhưng là xuất dữ liệu trong AL ra ngoại vi. Ví d ụ: MOV DX, 04A5h ; DX ← 04A5h OUT DX, AL ; port(DX) ← AL
T ậ p l ệnh Intel-8086 và Kiể u định vị
1.3.5. Nhóm lệnh hệ thống Nhóm lệnh h ệ thống bao gồm các lệnh điều khiển hoạt động c ủa CPU hay thiết lậ p giá tr ị các cờ . Các lệnh này không có toán hạng do đó cú pháp của lệnh r ất đơ n giản chỉ gồm các tác v ụ lệnh sau: CLC ; Xóa cờ CF (CF = 0) – Clear Carry flag CMC ; Đảo ngượ c cờ CF – Complement Carry flag CLD ; Xóa cờ hướ ng ng (DF=0) – Clear Diretion flag STD ; Đặt cờ hướ ng ng (DF=1) – Set Diretion flag CLI ; Xóa cờ ngắt (IF=0) – Clear Interrupt flag STI ; Đặt cờ ngắt (IF=1) – Set Interrupt flag HLT ; Dừng mọi hoạt động của CPU (treo máy) – Halt Halt INT ; Gọi ngắt phần mềm – Interrupt Interrupt IRET ; Tr ở ng trình chính từ chươ ng ng trình phục v ụ ngắt – Return Return from ở về chươ ng Interrupt LOCK ; Khóa Bus ngoài. CPU s ẽ không giao tiế p vớ i BUS NOP ; Không có tác vụ – No No operation WAIT ; Tạm d ừng CPU cho đến khi có tín hi ệu điện (mức th ấ p) ở chân TEST của CPU-8086 thì ho ạt động tiế p. 3.2. KIỂU ĐỊNH VỊ Kiểu định vị (Addressing mode) là cách thức xác định vị trí của dữ liệu đượ c mô tả trong câu lệnh. Thông qua kiểu định vị, CPU biết đượ c v ị trí lưu tr ữ toán hạng để truy xuất đến đúng giá tr ị mà lệnh cần xử lý. Tùy vào loại toán hạng, CPU-8086 cung cấ p các ki ểu định vị sau: - Định vị thanh ghi (register addressing) - Định vị tức thì (immediate addressing) - Định vị tr ực tiế p (direct addressing) - Định vị gián tiế p thanh ghi (register indirect addressing) - Định vị nền (based offset addressing) - Định vị chỉ số (index offset addressing) - Định vị chỉ số nền (based index offset addressing) - Định vị chuỗi (string addressing) - Định vị vào ra (port in/out addressing). Trong các kiểu định vị trên thì kiểu định vị thanh ghi và tức thì có t ốc độ truy xuất nhanh nhất. Đối v ớ i toán hạng t ức thì, dữ liệu n ằm ngay trong l ệnh và giá tr ị của của nó n ó đượ c chèn tr ực tiế p vào trong mã máy; còn đối v ớ i ki k iểu định vị thanh ghi, do thanh ghi là một b ộ phận bên trong của CPU, nên CPU không mất th ờ i gian truy xu ất bộ nhớ trong. 3.2.1. Định vị tức thì: Là kiểu định vị trong đó phải có toán h ạng nguồn là toán h ạng tức thì và toán hạng đích phải là toán h ạng thanh ghi.
T ậ p l ệnh Intel-8086 và Kiể u định vị Ví d ụ:
; AX ← 15
(AH=0; AL=15) ADD AH, ‘A’ ; AH ← AH + 41h (‘A’ = 41h) MOV DX, 3*1Ah ; DX ← 4Eh (DH=0; DL=4Eh) IN AL, 0Fh ; Không phải kiểu định vị tức thì ức thì là: 15, ‘A’ và 004Eh Các giá tr ị t ứ Toán hạng tức thì là d ữ liệu nằm ngay trong mã l ệnh. Khi khi CPU th ực hiện lệnh, mã lệnh đượ c đọc vào thanh ghi lệnh (IR) do đó giá tr ị tức thì c ũng tồn t ại trong CPU khi lệnh đượ c thi hành (Xem hình 3.11) MOV AX, 15
AX
00
15
15
IR
15
Hình 3.11: V ị trí toán hạng t ứ ức thì khi CPU thi hành l ệnh 3.2.2. Định vị thanh ghi Định v ị thanh ghi là kiểu định v ị mà tất c ả các toán hạng đều ph ải là toán h ạng thanh ghi. Kiểu định v ị này đượ c s ử dụng phổ biến vì có t ốc độ nhanh và ít chiếm b ộ nhớ . Ví d ụ: MOV AX, CX ; AX ← CX INC AX ; AX ← AX +1 OUT DX, AL ; Không phải kiểu định vị thanh ghi Trong đ ó AX và CX đề u là 2 toán h ạng thanh ghi. AX
0A
12
0A 12
0A
12
CX
Hình 3.12: Hoạt động của l ệnh MOV AX, CX 3.1.3. Định vị tr ực tiếp (bộ nhớ): Địa ch ỉ hiệu dụng (EA - Effective Address): Là địa chỉ độ dờ i (Offset) mà EU ớ để có thể truy xuất n ội dung toán hạng bộ nhớ đ ớ đó. tính toán cho một toán hạng bộ nhớ để EU có thể tính địa chỉ hiệu dụng theo nhiều cách. Tùy theo cách tính mà ta có các ki ểu định vị bộ nhớ khác nhau. Định v ị tr ực tiế p là kiểu định vị trong đó chỉ có một toán hạng là địa chỉ độ dờ i của ô nhớ chứa d ữ liệu, toán h ạng kia là toán h ạng thanh ghi. Địa chỉ hiệu dụng nằm ngay trong lệnh. Địa chỉ hiệu d ụng EA k ết hợ p vớ i nội dung hiện tại của thanh ghi DS trong BIU để tính toán ra địa chỉ vật lý c ủa ô nhớ theo công th ức : PA = Segment * 10h + EA
Ví d ụ: MOV AH, 12h MOV FOO, AH
; FOO ← AH (=12h)
MOV BX, [1234h] ; BL ← M[DS:1234h], BH ← [DS:1235h] Giả sử thanh ghi đoạn d ữ liệu có địa chỉ segment là DS=0200h. Vậy địa chỉ vật lý (Physical Address) của toán hạng nguồn đượ c tính như sau: PA = DS*10h + EA = 200h * 10h +
1234h = 03234h
T ậ p l ệnh Intel-8086 và Kiể u định vị Chú ý không có lệnh nào cho phép cả hai toán hạng đều tham chiếu đến vị trí bộ nhớ . Muốn làm đượ c điều này chúng ta ph ải dùng kiểu định vị gián tiế p thanh ghi.
3.1.4. Định vị gián tiếp thanh ghi Địa chỉ hiệu dụng là nội dung của một trong các thanh ghi BX, BP, SI, DI. Định vị gián tiế p thanh ghi cũng tươ ng ng tự như định vị tr ực tiế p, địa chỉ hiệu dụng EA k ết hợ p vớ i nội dung của thanh ghi phân đoạn DS để hình thành một địa chỉ vật lý của toán hạng. Tuy nhiên c ũng có sự khác nhau về cách tính độ dờ i. i. Địa chỉ hiệu dụng EA là nội dung trong các thanh ghi BP, BX, SI và DI bên trong CPU 8086. Ví d ụ: MOV AL, [BX] ; AL ← M[DS:BX] ADD CX, [BP] ; CX ← CX + M[DS:BP] MOV [SI], DX ; M[DS:SI] ← DL, M[DS:SI+1] ← DH Giả sử SI = 1234h và DS = 0300h, địa chỉ vật lý đượ c tính là: PA = DS * 10h + EA = 0300h*10h + 1234h = 04234h
(vớ i EA = SI = 1234h)
3.1.5. Định vị nền Giống như định vị gián tiế p thanh ghi, nhưng địa chỉ hiệu dụng EA trong tr ườ ng h ợ p này là tổng c ủa n ội dung của thanh ghi BX hoặc BP vớ i độ dờ i (giá tr ị 16 ườ ng bit có d ấu): EA = BX + Độ Dờ i hay EA = BP + Độ Dờ i Địa ch ỉ vật lý là t ổng giá tr ị độ dờ i đô d ịch chuyển tr ực ti ế p hoặc gián tiế p n ội dung của thanh ghi BX ho ặc BP vớ i giá tr ị chứa trong thanh ghi phân đoạn DS hoặc SS tươ ng ng ứng. Ví d ụ: MOV AL, [BX + 20h] ; AL← M[DS:BX+20h] MOV [BX].beta, CX
; M[DS:BX+beta] ← CL ; M[DS:BX+beta+1] ← CH
Giả sử DS = 0200h, BX = 1000h còn beta = 0FA34h. V ậy toán hạng đích trong tr ườ ng hợ p này là: ườ ng
địa chỉ vật lý của
PA = 0200h*10h + 1000h + 0FA34h = 10C34h Nếu thanh ghi BP đượ c sử dụng thay vì s ử dụng thanh ghi BX thì vi ệc tính toán địa ch ỉ vật lý của toán hạng đích khi đó s ẽ phải s ử dụng thanh ghi phân đoạn SS thay vì là DS nh ư trên. Điều này cho phép truy xu ất đến d ữ liệu trong phân đoạn ng ăn x ế p của bộ nhớ .
3.1.6. Định vị chỉ số Địa chỉ hiệu dụng là tổng của độ dờ i 16 bit và thanh ghi SI ho ặc DI EA = SI + Độ dờ i hoặ c EA = DI + Độ dờ i Cũng tươ ng ng tự như kiểu định v ị nền, địa ch ỉ vật lý là t ổng độ dịch chuyển tr ực tiế p hoặc gián tiế p n ội dung của thanh ghi SI hoặc DI vớ i giá tr ị chứa trong thanh ghi phân đoạn DS hoặc ES tươ ng ng ứng. Ví d ụ: MOV DL, [ SI+ 25h] ; DL ← M[DS:SI+25h]
T ậ p l ệnh Intel-8086 và Kiể u định vị MOV AL , ARRAY[SI]
; AL ← M[DS:SI+ARRAY]
Giả sử DS = 0200h, SI = 2000h còn ARRAY là độ dờ i có giá tr ị là 1234h. Vậy ng hợ p này là: địa chỉ vật lý của toán hạng đích trong tr ườ ườ ng EA = SI + ARRAY = 2000h + 1234h = 3234h PA = 0200h*10h + EA = 2000h + 3234h = 05234h Nếu thanh ghi DI đượ c s ử dụng thay vì sử dụng thanh ghi SI thì vi ệc tính toán địa ch ỉ vật lý c ủa toán hạng đích khi đó s ẽ phải s ử dụng thanh ghi phân đoạn ES thay vì là DS nh ư trên. MOV AL, [DI +1Fh] ; AL ← M[ES:DI+1Fh]
Ví d ụ:
PA = ES * 10h + DI + 100h
3.1.7. Định vị chỉ số nền Đây là kiểu định vị k ết h ợ p từ kiểu định vị nền và định vị chỉ số. Địa chỉ hiệu dụng là tổng của thanh ghi nền (BX hay BP), thanh ghi ch ỉ số (SI hay DI) và độ dờ i 16 bit. EA = BX + SI + Độ Dờ i
⇒
PA = DS * 10h + EA
EA = BX + DI + Độ Dờ i
⇒
PA = ES * 10h + EA
Ví d ụ: MOV DL, [BX+SI+100] ; PA = DS * 10h + BX + SI + 100 MOV AL, [BX+DI+200] ; PA = ES * 10h + BX + DI + 200 3.1.8. Định vị chuỗi Các lệnh x ử lý chuỗi không dùng kiểu định v ị bộ nhớ thông thườ ng ng mà dùng 2 thanh ghi chỉ số SI và DI để chứa địa chỉ độ dờ i của chuỗi nguồn và chuỗi đích. Các lệnh xử lý chuỗi trong 8086 tự động dùng các thanh ghi chỉ mục nguồn và đích để tính toán địa chỉ của toán hạng nguồn và đích tươ ng ng ứng. Kiểu định vị này gọi là định vị chuỗi và chỉ áp dụng cho các lệnh xử lý chuỗi. Các lệnh xử lý chuỗi của Intel-8086 đượ c trình bày k ỹ trong chươ ng ng 6, bao gồm: MOVSB/W, SCASB/W, CMPSB/W, STOSB/W, LODSB/W. LOD SB/W. ử. Sau khi Lệnh sẽ xử lý 1 lần 1 Byte hoặc 2 byte (Word) - còn g ọi là phần t ử thực hi ện xong lệnh, SI và DI t ự động điều ch ỉnh t ăng/giảm 1 đơ n v ị để chỉ đến ph ần tử k ế tiế p cần xử lý. SI và DI tự động cùng tăng hay cùng giảm đượ c quyết định bở i cờ Hướ ng ng (DF). Nếu DF = 0 thì x ử lý theo chiều tăng địa chỉ, còn DF = 1 thì x ử lý theo chiều giảm địa chỉ. Tùy vào cách x ử lý chuỗi mà ngườ i lậ p trình ch ọn hướ ng ng xử lý thích hợ p. Khi đó: •
DS:SI phải chỉ đến byte đầu tiên cần xử lý của chuỗi nguồn.
•
ES:DI phải chỉ đến byte đầu tiên c ần xử lý của chuỗi đích.
Hình 3.13 mô tả vị trí 2 chuỗi Nguồn và nhớ vớ i chiều xử lý tăng địa chỉ.
Đích (mỗi chuỗi 256 byte) trong bộ
T ậ p l ệnh Intel-8086 và Kiể u định vị Địa chỉ đầu chuỗi Ngu ồn
1AF4:0000h
Chuỗi Nguồn 1AF4:00FFh
256 byte
(DS ← 1AF4h và SI
←
0000h)
Địa chỉ cuố i chuỗi Ngu ồn
….
Địa chỉ đầu chuỗi Đích
1AD4:0100h
Chuỗi Đích
(ES ← 1AD4h và DI
←
0100h)
256 byte
Địa chỉ cuố i chuỗi Đích Hình 3.13: Mô hình b ộ nhớ chứ a chuỗ i Nguồn và Đích 3.1.9. Định vị cổng vào/ra Định vị cổng vào/ra chỉ áp dụng các lệnh vào ra ngoại vi trong t ậ p lệnh của 8086 (IN và OUT) để truy xuất đến các port vào/ra c ủa thiết bị ngoại vi. Có 2 cách truy xuất đến không gian địa chỉ của Port vào ra: 1AD4:01FFh
Trự c tiếp: Chỉ dùng cho cổng có địa chỉ 8 bit. Địa chỉ cổng đượ c cung cấ p tr ực tiế p trên dòng lệnh. Ví d ụ: IN AL, 0F8h ; Đọc dữ liệu tại cổng 0F8h đưa vào AL OUT 01h, AL ; Xuất giá tr ị AL ra cổng có địa chỉ 01h • Gián tiếp: Đối vớ i những cổng có địa chỉ 16 bit thì không sử dụng cách tr ực tiế p để truy xuất đượ c, c, khi đó thanh ghi DX đượ c dùng để chứa địa chỉ của thiết bị ngoại vi. Ví d ụ: IN AL, DX ; AL ← port(DX) •
OUT DX, AL
; port(DX) ← AL
T ậ p l ệnh Intel-8086 và Kiể u định vị
BÀI TẬP CHƯƠNG 3 3.1. Cho biết nội dung của các toán h ạng đích và giá tr ị các cờ CF, SF, ZF, PF, OF sau khi thực hiện mỗi lệnh sau: a. ADD AX, BX b. SUB AL, BL c. DEC AL d. NEG AL e. XCHG AX, BX f. ADD AL, BL g. SUB AX, BX h. NEG AX
; Vớ i AX = 7FFFh, BX = 1 ;V ớ i AL = 1, BL = 0FFh ; Vớ i AL = 0 ; Vớ i AL = 7Fh ; Vớ i AX = 1ABCh, BX = 712Ah ; Vớ i AL = 80h, BL = 0FFh ; Vớ i AX = 0, BX = 8000h ; Vớ i AX = 1
3.2. Cho biết k ết qu ả sau khi thực hi ện lệnh ADD AX, DX và tr ạng thái cờ tràn (OF) trong các tr ườ ng hợ p sau: ườ ng a. AX = 512Ch , DX = 4185h c. AX = 0E1E4h, DX = 0DAB3h e. AX = 6389h , DX = 1176h
b. AX = 0FE12h, DX = 1ACBh d. AX = 7132h , DX = 7000h
3.3. Cho biết k ết quả sau khi thực hiện lệnh SUB CX, BX và tr ạng thái cờ tràn (OF) trong các tr ườ ng hợ p sau: ườ ng a. CX = 2143h , BX = 1986h b. CX = 81FEh , BX = 1986h c. CX = 19BCh , BX = 81FEh d. CX = 02h , BX = FE0Fh e. CX = 8BCDh , BX = 71ABh 3.4. Cho AL = 0CBh và CF = 1. Cho bi ết giá tr ị AL sau khi th ực hiện lệnh: a. c. e. g.
SHL ROL SAR RCR
AL, 1 AL, CL AL, CL AL, CL
; Vớ i CL =2 ; Vớ i CL = 2 ; Vớ i CL = 3
b. SHR AL, 1 d. ROR AL, CL f. RCL AL, 1
; Vớ i CL = 3
3.5. Dùng lệnh TEST để thiết lậ p giá tr ị các cờ sau: a. ZF = 1 nếu AX = 0 b. ZF = 0 nếu AX lẻ c. SF = 1 nếu DX < 0 d. ZF = 1 nếu DX >= 0 e. PF = 1 nếu BL chẵn. 3.6. Viết đoạn lệnh thực hiện từng yêu cầu sau: a. Xóa các bit ở vị trí chẵn của AX, giữ nguyên các bit khác. b. Đặt LSB và MSB c ủa BL, giữ nguyên các bit khác. c. Đảo MSB của AL, giữ nguyên các bit khác. d. Xóa bốn bít cao của DL, giữ nguyên các bit khác. 3.7. Cho biết nội dung DX, AX và các c ờ OF, CF sau khi th ực hiện lệnh: a. MUL BX ; vớ i AX = 08h, BX = 03h b. MUL BX ; vớ i AX = 0FFFFh, BX = 1000h c. DIV BX ; vớ i AX = 07h, BX = 02h, DX = 0h d. DIV CX ; vớ i AX = 0FFFEh, CX = 10h, DX = 0h
T ậ p l ệnh Intel-8086 và Kiể u định vị 3.8. Cho biết nội dung AX và các c ờ OF, CF sau khi th ực hiện lệnh: a. MUL BL ; vớ i AL = 0ABh, BL = 10h b. MUL AH ; vớ i AL = 0ABh, AH = 01h c. DIV BL ; vớ i AX = 0Dh, BL = 03h d. DIV DL ; vớ i AX = 0FEh, DL = 10h 3.9. Xem mô hình b ộ nhớ trong hình C1. Cho AX = 500h, BX = 1000h, SI = 1500h, DI = 2000h, BETA là biến kiểu word nằm ở đị ở địa chỉ 1000h. Trong các lệnh sau đây, nếu hợ p lệ thì hãy cho biết địa chỉ của các toán h ạng nguồn ho ặc thanh ghi và k ết qu ả lưu trong toán hạng đích. Nếu không hợ p lệ thì giải thích tại sao? a. MOV DL, SI b. MOV DX, [DI] c. ADD AX, [SI] d. SUB BX, [DI] e. LEA BX, BETA[BX] f. ADD [SI], [DI] g. ADD BH, [BL] h. ADD AH, [SI] i. MOV AX, [BX+DI+BETA]
Ô nhớ
Địa chỉ
03h
DS:3001h
00h
DS:3000h
02h
DS:2501h
50h
DS:2500h
02h
DS:2001h
00h
DS:2000h
01h
DS:1501h
50h
DS:1500h
01h
DS:1001h
00h
DS:1000h
Hìn Hìnhh C1: C1: Mô hình hình b nhớ
3.10. Vớ i khai báo dữ liệu: A B C MSG
DB 1, 2, 3 DW 4, 5, 6 LABEL WORD ; C chỉ là 1 nhãn kiểu word ; (không chiếm vùng nhớ ) DB ‘ABC’
và giả sử BX chứa địa chỉ của C. Hãy cho bi ết lệnh nào hợ p lệ (nếu không thì giải ườ ng thích) và tr ị của các toán h ạng đích sau khi thi hành l ệnh trong các tr ườ ng hợ p sau: a. MOV AH, BYTE PTR A
b. MOV
AX, WORD PTR B
c. MOV AX, C
d. MOV
AX, MSG
e. MOV AH, BYTE PTR C 3.11. Dùng thanh ghi BP và ki ểu định vị nền để viết các lệnh thực hiện yêu cầu sau (không đượ c dùng các lệnh PUSH và POP) a. Đưa 0 vào hai word
ở đỉ ở đỉnh ngăn xế p. b. Sao chép 5 word ở đỉ ở đỉnh ngăn xế p vào mãng ARR lần lượ t theo thứ tự (ngh ĩ a là ở đỉnh ngăn xế p vào phần tử 1 của ARR, phần tử k ế trong ngăn xế p phần tử ở đỉ vào phần tử thứ 2 của ARR, ...)
H ệ thố ng ng ng ắ ắt mề m
Chương 4 HỆ THỐNG NG ẮT M ỀM 4.1. NHỮNG CƠ SỞ CỦA NGẮT MỀM Một bí quyết để lậ p trình thành công và hiệu quả cao trên máy tính ki ểu IBMPC là việc sử dụng có hiệu quả các chươ ng ng trình phục vụ của BIOS (Basic Input Output System) đượ c cài đặt sẳn ngay trong vùng nhớ ROM-BIOS của máy tính hay các chươ ng ng trình phục vụ của hệ điều hành DOS. Ngắt mềm (hay Ngắt) là cách g ọi tên ngắn gọn của các chươ ng ng trình phục vụ này. Ngắt mềm là chươ ng ng trình mã máy nh ị phân (chính xác hơ n là chươ ng ng trình con) đượ c thiết k ế sẳn và tồn tại trong bộ nhớ của máy tính nh ằm th ực hi h iện các chức năng điều khiển phần cứng máy tính m ỗi khi đượ c gọi thực hiện. Khi đó, để điều khiển phần cứng nào thì ngườ i lậ p trình chỉ cần gọi các ngắt tươ ng ng ứng để thực hiện công việc mà không cần phải biết đến cấu trúc của phần cứng là như thế nào, nguyên lý vận hành của phần cứng đó ra sao…. đây là công việc r ất khó khăn đối vớ i ngườ i làm phần mềm không quen thuộc vớ i phần cứng là những mạch điện tử. Các ngắt mềm xem như là cầu nối giữa phần cứng và các ngôn ngữ lậ p trình (k ể cả hệ điều hành). Chúng làm việc tr ực tiế p vớ i phần cứng và các thiết bị ngoại vi, th ực hiện những chức n ăng c ơ bản nh ất c ủa h ệ thống như đọc/ghi từng byte dữ liệu ở bàn phím, ra màn hình ho ặc ở đĩ ở đĩ a từ… Hình 4.1 trình bày các cách giao tiế p v ớ i phần cứng c ủa ngôn ngữ lậ p trình thông qua các ngắt hay tr ực tiế p. Giao tiế p tr ực tiế p sẽ khó khăn hơ n r ất nhiều so vớ i giao tiế p thông qua các Ngắt.
Ngôn Ngữ Lập Trình (Hợp Ngữ )
Ngắt DOS
Ngắt ROM BIOS
Ph ần Cứ ng ng - Ngo ại Vi
Các ngắt của BIOS thì luôn s ẳn có trong Hình 4.1: Giao ti ế p phần cứ ng ng máy tính IBM-PC, còn các ng ắt DOS chỉ tồn tại đối vớ i hệ điều hành DOS. Ngh ĩ là, nếu máy tính IBM-PC đượ c cài đặt hệ điều hành UNIX thì trên máy đó không tồn tại các ngắt DOS. Hệ điều hành Windows đượ c phát triển trên cơ sở của hệ điều hành DOS nên các ng ắt DOS vẫn sử dụng đượ c trên hệ điều hành Windows. Tất nhiên có một vài ngắt DOS không đượ c phép sử dụng vì đảm bảo độ an toàn cho vận hành của hệ điều hành Windows. Toàn bộ tài liệu v ề các ngắt mềm đượ c nhiều sách về lậ p trình hợ p ngữ nêu lên ng dùng. đầy đủ. Giáo trình này ch ỉ giớ i thiệu những ngắt r ất cơ bản và thườ ng
4.2. SỬ DỤNG NGẮT TRONG HỢP NGỮ Khi sử dụng ngắt cần lưu ý một số yếu tố: - Chức năng của ngắt/hàm. - Tên ngắt/hàm: Dùng số hex từ 0h đến 0FFh - Tham số vào: Thanh ghi hay b ộ nhớ do hàm qui định. - Tham số ra: Thanh ghi hay b ộ nhớ do hàm qui định.
H ệ thố ng ng ng ắ ắt mề m Lệ nh nh g ọi 1 ng ắ ắt hay 1 hàm:
MOV AH,
…. ; Khai báo tham s ố vào (nế u có) INT
…. ; Lư u tr ữ ữ tham số ra (nế u có) Ví d ụ: Hàm 02h của ng ắt 21h th ực hi ện vi ệc in ký t ự trong thanh ghi DL ra màn hình. Như vậy, khi muốn hiển thị ký tự B trên màn hình, ta viết như sau đoạn lệnh như sau: MOV AH, 02h MOV DL, ‘B’ INT 21h
; Chọn hàm 02h ; DL chứa ký tự cần in ‘B’ ; Gọi ngắt thực hiện để in ký tự
Lư u ý: Việc sử dụng thanh ghi DL để chứa ký tự cần in là do hàm 02h qui định, không thể sử dụng thanh ghi khác để thay thế.
4.3. NGẮT MS-DOS Các ngắt của DOS đượ c đánh số từ 20h đến 0FFh. Ngắt quan tr ọng nhất là ngắt 21h – gồm nhiều chức năng (hàm) của DOS.
INT 20h: Chấ m dứ t chương trình và trở v ề DOS từ một chương trình có đuôi COM. INT 23h: Chặn tổ hợp phím Ctrl- Break Ngườ i sử dụng có thể chấm dứt sớ m một chươ ng ng trình bằng cách bấm tổ hợ p phím Ctrl-Break. Tổ hợ p phím nầy làm CPU nh ảy tớ i chươ ng ng trình phục vụ ngắt 23h và sau đó đến một thủ tục của DOS để k ết thúc chươ ng ở về DOS. ng trình đang chạy và tr ở Nếu muốn không cho phép chươ ng ng trình k ết thúc s ớ m bằng Ctrl-Break, ta có thể cho ngắt 23h tr ỏ đến m ột ch ươ ng ng trình đặt bi ệt nào đó để thông báo lên màn hình r ằng không cho chươ ng ng trình đang chạy k ết thúc sớ m. m.
ết thúc và đặt thường trú INT 27h: K ế Ngắt này cho phép để trong bộ nhớ trong một ch ươ ng ng trình nào đó cho đến khi tắt máy. Để sử dụng ngắt 27h, ta cho ch ạy một chươ ng ng trình gồm 2 phần. Một phần sẽ phụ trách việc thườ ng ng trú cho phần kia.
INT 21h: Các chứ c năng của DOS Hàm 01h
Đợ i đọc 1 ký tự từ bàn phím (có hiện trên màn hình)
Vào Không Ra AL : Mã ASCII c ủa phím nhận đượ c
Đợ i đọc một ký tự từ bàn phím (phím nhận đượ c sẽ hiển thị trên màn hình). Khi một phím đượ c ấn thì ký tự tươ ng ng ứng vớ i phím đó đượ c lưu trong thanh ghi AL. N ếu phím đượ c ấn là một phím đặt biệt thì AL=0. T ổ hợ p phím Ctrl-Break k ết thúc công việc của hàm này.
H ệ thố ng ng ng ắ ắt mề m
Hàm 02h
Hiển thị 1 ký tự tại vị trí con tr ỏ trên màn hình
Vào DL ← Mã ASCII c ủa ký tự cần hiển thị Ra Không
Hàm 03h
Đọc dữ liệu vào từ cổng nối tiế p chuẩn (COM1)
Vào Không Ra AL : byte dữ liệu đọc đượ c
Hàm 04h
Xuất ký tự ra cổng nối tiế p chuẩn (COM1)
Vào DL ← ký tự cần xuất Ra Không
Hàm 05h
Xuất byte d ữ liệu ra cổng máy in chu ẩn (LPT1)
Vào DL : Byte d ữ liệu cần xuất Ra Không
Hàm 06h
Nhậ p / Xu ất từ thiết bị chuẩn (không đợ i) i)
DL ← Mã ASCII ký tự cần xuất lên màn hình Nếu DL ← 0FFh : Thực hiện chức năng nhậ p ký t ự Nếu ZF = 0 thì thì AL AL chứa Mã ASCI ASCIII ký tự nhận đượ c Ra Nếu ZF = 1 thì không nh ận đượ c ký tự
Vào
Hàm 07h
Giống hàm 1, nh ưng không hiện ký tự ra màn hình
Vào Không Ra AL : Mã ASCII ký t ự nhận đượ c
Hàm 08h
Giống hàm 1, nh ưng không hiện ký tự ra màn hình
Vào Không Ra AL : Mã ASCII ký t ự nhận đượ c Lư u ý: Ctrl-Break không ảnh hưở ng ng đến hoạt động của hàm 07h và 08h
Hàm 09h
Xuất 1 chuỗi ký tự lên màn hình
Vào DS:DX ← địa chỉ logic của chuỗi ký tự cần xuất Ra Không
H ệ thố ng ng ng ắ ắt mề m Lư u ý: DS ← địa chỉ segment của chuỗi trong bộ nhớ
DX ← địa chỉ offset của chuỗi trong bộ nhớ Chuỗi ký tự phải chấm dứt bằng ký tự ‘$’ Ví d ụ: In chuỗi “Hello Assembly” ra màn hình.
Khai báo bi ế n chứ a chuỗ i trong đ oạn d ữ ữ liệu DS: chuoi
DB ‘Hello Assembly$’
Viế t chươ ng ng trình trong đ oạn l ệnh: MOV AH, 09h LEA DX, chuoi INT 21h
Hàm 0Ah
; Gọi hàm 09h ; DX ← Offset(chuoi) ; Thực hiện hàm
Đợ i đọc 1 chuỗi ký tự từ bàn phím, k ết thúc bằng Enter
Vào DS:DX ← địa chỉ của vùng đệm bàn phím trong bộ nhớ Ra
LEN: Tổng số ký tự nhận đượ c BUFF: Mã ASCII c ủa các ký t ự nhận đượ c
Hàm 0Ah nhận 1 chuỗi ký tự từ bàn phím, k ết thúc bằng phím Enter (Mã ASCII là 0Dh). Hàm tr ả về chuỗi nhận đượ c và chiều dài chuỗi trong vùng đệm bàn phím. Vùng đệm bàn phím là 1 bi ến mãng trong bộ nhớ gồm 3 phần MAX, LEN và BUFF có cấu trúc như sau: MAX
LEN
BUFF
BUFF+1 BUFF+2
……..
…..
…… ……
BUFF+n
…..
MAX: Phần tử chứa số ký tự tối đa có thể nhận đượ c gán khi khai báo. LEN: Phần tử chứa tổng số ký tự của chuỗi nhận đượ c, c, do hàm tr ả về sau khi nhận đượ c chuỗi. BUFF: Phần tử chứa mã ASCII của từng ký tự trong chuỗi nhận đượ c (mỗ i ký t ự ự chiế m 1 byte nh ớ ). Như vậy, số byte của BUFF phải bằng hay lớ n hơ n giá tr ị của MAX. Ví d ụ: Nhận chuỗi tối đa 30 ký tự từ bàn phím
Khai báo vùng đệm trong đ oạn d ữ ữ liệu: MAX DB LEN DB BUFF DB
30 ? 31 DUP(?)
; Tạo biến MAX ; Tạo biến LEN ; Vùng nhớ lưu tr ữ ký tự
Viế t chươ ng ng trình trong đ oạn l ệnh: MOV AH, 0Ah LEA DX, MAX INT 21h
; DX ← Đ/c vùng đệm bàn phím
Cách khai báo biến vùng đệm bàn phím khác: BANPHIM
DB
30, ?, 31 DUP(?)
H ệ thố ng ng ng ắ ắt mề m
Hàm 0Bh
Cho tr ạng thái bàn phím
Vào DS:DX ← địa chỉ logic của vùng đệm bàn phím trong b ộ nhớ Ra
Hàm 3Ch
LEN: Tổng số ký tự nhận đượ c BUFF: Mã ASCII c ủa các ký t ự nhận đượ c Tạo tậ p tin m ớ i
DS:DX ← Địa chỉ chuỗi tên của tậ p tin m ớ i. i. ng, 1: chỉ đọc, 2: ẩn, Vào CX ← thuộc tính của tậ p tin (0: bình th ườ ng, 4: tậ p tin h ệ thống)
Ra AX : Thẻ tậ p tin
Hàm 3Dh Vào
Mở tậ p tin trên đĩ a DS:DX ← Địa chỉ chuỗi tên của tậ p tin m ớ i. i. AL ← kiểu truy xuất tậ p tin (0: ch ỉ đọc, 1: ch ỉ ghi, 2: đọc/ghi)
Ra AX : Thẻ tậ p tin Khai báo tên t ậ p tin và bi ến chứa thẻ file: Tenf Thef
DB “C:\DULIEU\DATA.TXT”,0 DW ?
Chuỗi Tên tậ p tin có chứa c ả tên đườ ng ng dẫn của file. N ếu không có tên đườ ng ng dẫn thì sẽ truy xuất trong thư mục hiện hành. Thẻ tậ p tin là thành phần quan tr ọng trong việc truy xuất file nên sau khi m ở hay tạo file ph ải lưu tr ữ lại để sử dụng trong việc đọc/ghi file. M ỗi file phải có một thẻ file, biến thẻ file phải là 2 bytes. MOV Thef,AX MOV BX,Thef
;Lưu tr ữ thẻ file vào biến. ;Đưa thẻ file vào BX để truy xuất file
Có thể mở hay tạo nhiều tậ p tin khác nhau trong cùng chươ ng ng trình để xử lý. Khi đó, mỗi thẻ tậ p tin phải đượ c lưu tr ữ trong mỗi biến khác nhau.
Hàm 3Eh
Đóng tậ p tin đang mở .
Vào BX ← Thẻ tậ p tin Ra AX : Mã l ỗi (nếu có)
ướ c khi thoát kh ỏi chươ ng Sau khi xử lý xong tậ p tin và tr ướ ng trình, t ậ p tin phải đượ c đóng lại để cậ p nh ật thông tin ho ặc nội dung mớ i của tậ p tin. Đọc nội dung tậ p tin vào b ộ nhớ DS:DX ← Địa chỉ vùng nhớ chứa dữ liệu đọc đượ c Vào BX ← Thẻ tậ p tin c ần đọc CX ← số byte cần đọc Ra AX : Số byte đọc đượ c
Hàm 3Fh
H ệ thố ng ng ng ắ ắt mề m Ghi dữ liệu trong bộ nhớ vào tậ p tin
Hàm 40h
DS:DX ← Địa chỉ vùng nhớ chứa dữ liệu cần ghi Vào BX ← Thẻ tậ p tin c ần đọc CX ← số byte cần ghi
Ra AX : Số byte ghi đượ c Các hàm 3Fh và 40h c ũng có thể đượ c sử dụng đọc ho ặc ghi dữ liệu cho ngoại vi, vì DOS quản lý việc truy xuất ngoại vi bằng thẻ Xóa tậ p tin trên đĩ a
Hàm 41h
Vào DS:DX ← Địa chỉ chuỗi tên tậ p tin Ra AX : Mã lỗi (nếu có)
Đờ i con tr ỏ tậ p tin hi ện hành
Hàm 42h
Vào AL ← Hướ ng ng dờ i CX:DX ← Cự ly dờ i = (CX*65536) + DX BX ← Thẻ tậ p tin Ra DX:AX : Vị trí con tr ỏ mớ i = (DX*65536)+AX Cấu trúc dữ liệu trong tậ p tin: 0 ‘C’
1
2 ‘h’
3 ‘a’
4 ‘o’
5 ‘‘
6 ‘C’
7
8 ‘a’
9 ‘c’
10 ‘‘
11 ‘B’
12 ‘a’
Con tr ỏ tậ p tin hiện hành
Đọc hoặc thay đổi thuộc tính tậ p tin trên đĩ a DS:DX ← Địa chỉ chuỗi tên tậ p tin AL ← 0 Vào N ế ếu Đọc thuộc tính: N ế ếu Thay đổ i thuộc tính: AL ← 1 và CX ← thuộc tính mớ i Ra N ế u Đọc thuộc tính: CX : chứa thuộc tính tậ p tin
Hàm 43h
Hàm 4Ch
ở về DOS K ết thúc chươ ng ng trình và tr ở
Vào Không Ra Không
Đổi tên tậ p tin DS:DX ← Địa chỉ chuỗi tên tậ p tin c ũ Vào ES:DI ← Địa chỉ chuỗi tên t ậ p tin m ớ i
Hàm 56h
Ra Không
‘n’
EOF
H ệ thố ng ng ng ắ ắt mề m
4.4 CÁC VÍ DỤ: 4.4.1. Chươ ng ng trình nhận 1 ký t ự từ bàn phím, sau đó cất ký tự nhận đượ c vào 1 biến. DSEG SEGMENT msg DB ‘Hay nhap 1 ky tu tu ban phim: $’ kytu DB ?
4.4.2. Chươ ng ng trình nhận 1 ký t ự từ bàn phím, sau đó in ra màn hình ký t ự k ế sau của ký tự nhận đượ c. c. DSEG SEGMENT msg1 DB ‘Hay nhap 1 ky tu tu ban phim: $’ msg2 DB 10,13,‘Ky tu ke sau ky tu nhan duoc la: $’ kytu DB ? DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG MOV DS, AX MOV AH, 09
; Hàm 9 in chu ỗi ký tự ra màn hình
LEA DX, msg1
; DX ch ứa địa chỉ chuỗi msg1
INT 21h
; gọi ngắt thực hiện
MOV AH, 01
; Hàm nh ập 1 ký tự, AL chứa Ký tự
INT 21h MOV kytu, AL
; cất ký tự vào biến
MOV AH, 09
; Hàm 9 in chu ỗi ký tự ra màn hình
LEA DX, msg2
; DX ch ứa địa chỉ chuỗi msg2
INT 21h
; gọi ngắt thực hiện
H ệ thố ng ng ng ắ ắt mề m MOV DL, kytu ADD DL, 1
; Ký t ự kế sau
MOV AH, 02
; In ký t ự
INT 21h MOV AH, 4Ch
; thoát kh ỏi chương trình
INT 21h CSEG ENDS END start
4.4.3. Chươ ng ng trình nhận chuỗi A và B từ bàn phím, sau đó in ra màn hình B trướ c, c, chuỗi A sau. DSEG SEGMENT msg1 DB ‘Hay nhap vao chuoi A: $’ msg2 DB 10,13, ‘Hay nhap vao chuoi B: $’ msg3 DB 10,13,‘Cac chuoi nhan duoc la: $’ max1 DB 30 len1 DB ? strA DB 31 DUP(‘$’) max2 DB 30 len2 DB ? strB DB 31 DUP(‘$’) DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG MOV DS, AX MOV AH, 09
; Hàm 9 in chu ỗi ký tự ra màn hình
LEA DX, msg1
; DX ch ứa địa chỉ chuỗi msg1
INT 21h
; gọi ngắt thực hiện
MOV AH, 0Ah
; Nhập chuỗi A
LEA DX, max1 INT 21h MOV AH, 09
; Hàm 9 in chu ỗi ký tự ra màn hình
LEA DX, msg2
; DX ch ứa địa chỉ chuỗi msg2
INT 21h
; gọi ngắt thực hiện
MOV AH, 0Ah
; Nhập chuỗi B
LEA DX, max2 INT 21h MOV AH, 09
; Hàm 9 in chu ỗi ký tự ra màn hình
LEA DX, msg3
; DX ch ứa địa chỉ chuỗi msg3
INT 21h
; gọi ngắt thực hiện
MOV AH, 09
; Hàm 9 in chu ỗi ký tự ra màn hình
H ệ thố ng ng ng ắ ắt mề m LEA DX, strB
; DX ch ứa địa chỉ chuỗi B
INT 21h
; gọi ngắt thực hiện
MOV AH, 09
; Hàm 9 in chu ỗi ký tự ra màn hình
LEA DX, strA
; DX ch ứa địa chỉ chuỗi A
INT 21h
; gọi ngắt thực hiện
MOV AH, 4Ch
; thoát kh ỏi chương trình
INT 21h CSEG ENDS END start
4.4.4. Chươ ng ng trình ghi chuỗi “Welcome to Assembly!” vào t ập tin mớ i có tên là W2A.TXT. DSEG SEGMENT msg1 DB ‘Da ghi xong file.$’ msg2 DB ‘Welcome to Assembly!’ tenfile DB ‘D:\W2A.TXT’,0 thefile DW ? DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG MOV DS, AX MOV AH, 3Ch
; Tạo file mới
LEA DX, tenfile MOV CX, 0
; thuộc tính bình th ường
INT 21h MOV thefile, BX ; c ất thẻ file MOV AH, 40h
; ghi file
MOV BX, thefile MOV CX, 20
; số byte cần ghi
LEA DX, msg2
; chu ỗi cần ghi
INT 21h MOV AH, 09
; Hàm 9 in chu ỗi ký tự ra màn hình
LEA DX, msg1
; DX ch ứa địa chỉ chuỗi msg1
INT 21h
; gọi ngắt thực hiện
MOV AH, 3Eh
; Đóng file
MOV BX, thefile INT 21h MOV AH, 4Ch INT 21h CSEG ENDS END start
; thoát kh ỏi chương trình
H ệ thố ng ng ng ắ ắt mề m 4.4.5. Chươ ng ng trình xóa tập tin trên đĩ a. a. Tên file đượ c nhập từ bàn phím khi chạy chươ ng ng trình. DSEG SEGMENT msg1 DB ‘Ten file can xoa: $’ msg2 DB ‘Da xoa xong file.$’ max
Chươ Chương ng 5 LỆNH NH Ả NH Ả Y VÀ VÒNG L Ặ L ẶP P 5.1. LỆNH NHẢ Y (CHUY ỂN ĐIỀU KHIỂN) Cách thực hiện các lệnh trong chươ ng ng trình c ủa bộ xử lý là tuần tự thực hiện các lệnh từ trên xuống, hết lệnh này đến lệnh khác. Lệnh nhảy là lệnh làm thay đổi thứ tự thực hiện lệnh của bộ xử lý. Đây cũng là cơ sở của việc xây dựng các cấu trúc r ẽ nhánh trong hợ p ngữ. Có 2 loại lệnh nhảy: nhảy không có điều kiện và nhảy có điều kiện.
5.1.1. Lệnh nhảy không điều kiện Đích : IP ← Đích Cú pháp: JMP Đích: Immed16, Reg16, Mem16 Ý nghĩ a: a: Luôn luôn nhảy đến thực hiện lệnh có địa chỉ là Đích. Phạm vi nhảy là trong đoạn (near jump). Ví d ụ: Xem đoạn chươ ng ng trình sau 1. 2. 3. 4. 5. 6.
MOV AX, 1 JMP cong2 ; nhảy đến lệnh có nhãn cong2 cong1: INC AX JMP setAX ; nhảy đến lệnh có nhãn setAX cong2: ADD AX, 2 setAX: ………
Trong đ oạn chươ ng ng trình trên, các l ệnh luôn đượ c thi hành là 1, 2, 5 và 6. Còn các l ệnh 3 và 4 không bao giờ đượ ờ đượ c thi hành. Các dạ dạng củ của lệ lệnh JMP: • JMP SHORT Đích ; (short jump). Nhảy trong phạm vi t ừ –128 đến +127 byte so vớ i vị trí hiện tại. Ví d ụ: JMP SHORT Calculate • JMP FAR PTR Đích ; (far jump). Nh ảy đến bất kì chỗ nào, có thể khác đoạn. Ví d ụ: JMP FAR PTR Calculate • JMP ; (near indirect jump). Khi th ực hiện, thanh ghi PC s ẽ đượ c gán bằng giá tr ị lưu tại địa chỉ này. Có thể k ết h ợ p dùng vớ i định vị chỉ số. Ví d ụ: có khai báo biến myPointer như sau: myPointer
DW
Prepare, Calculate, Check, Output
Xem đ oạn l ệnh: MOV BX, 2 ; chỉ số trong mảng con tr ỏ SHL BX, 1 ; nhân đôi
myPointer[BX] ; nhảy đến Check ; công việc 0 ; công việc 1 ; công việc 2 – nơ i cần nhảy đến ; ; công vi ệc 3
• JMP ; (far indirect jump). T ươ ng ng t ự tr ườ ng h ợ p trên, nhưng con ườ ng tr ỏ gồm cả segment và offset. Chỉ khác ở khai báo con tr ỏ • JMP ; (indirect jump via regs). Nh ảy đến địa chỉ lưu trong thanh ghi AX.
Ví d ụ: MOV AX, offset Calculate JMP AX ; IP ← AX (nhả y đế n l ệnh có địa chỉ trong AX) 5.1.2. Lệnh nhảy có điều kiện: Lệnh nhảy có điều kiện sẽ thực hiện việc nhảy đến nhãn hay không tùy thuộc vào điều kiện của lệnh nhảy. Lệnh nhảy có điều kiện chỉ nhảy trong phạm vi 128 byte. Muốn nhảy xa hơ n, n, phải k ết hợ p vớ i lệnh JMP. Cú pháp t ổ n g quát: J xx Đích ; xx là các ký tự mô tả điều kiện ổng Đích: Immed, Reg, Mem Ý nghĩ a: a: Nếu điều kiện đúng thì nhảy t ớ i thực hiện lệnh do toán h ạng Đích, ngượ c lại thì tiế p tục thi hành lệnh ngay sau lệnh nhảy. Các lệnh nhảy có điều ki ện đượ c tạo ra bằng cách ghép chữ J (JUMP) vớ i các chữ cái mô tả điều kiện để nhảy. Các điều kiện này thườ ng ng đượ c thiết lậ p thông qua tr ạng thái thanh ghi c ờ . Bảng 6.1 trình bày các l ệnh nhảy thườ ng ng dùng. Ví d ụ: Lệnh JNE (Jump if Not Zero), nhảy nếu không bằng, điều kiện này đúng khi ZF = 0 (g ọi là NZ). Như vậy, giá tr ị các cờ tr ạng thái hi ện tại là điều kiện để lệnh nhảy xem xét khi thi hành. Thông th ườ ng, ng, lệnh so sánh (CMP) hay l ệnh TEST đượ c sử dụng để thiết lậ p điều kiện lệnh nhảy. Lệnh so sánh: ; Cờ ← ờ ← Trái – Phải Cú pháp: CMP Trái, Phải Nếu Trái > Phải ⇒ Trái - Phải > 0 : CF = 0 và ZF = 0 Nếu Trái < Phải ⇒ Trái - Phải < 0 : CF = 1 và ZF = 0 Nếu Trái = Phải ⇒ Trái - Phải = 0 : CF = 0 và ZF = 1
Trái, Phải: Immed, Reg, Mem Bản chất của lệnh CMP là lệnh SUB (thực hiện phép tính Đích – Nguồn) nhưng k ết qu ả của phép tính không đượ c l ưu vào Đích như trong lệnh SUB mà tính chất của k ết quả đượ c thể hiện thông qua c ờ
Lệnh nhả y và Vòng l ặ ặ p ng Ví d ụ: so sánh hai s ố nguyên dươ ng MOV AH, 1 ; AH ← 1 MOV AL, 2 ; AL ← 2 CMP AH, AL
; CF ← 1, ZF ← 0 vì AH < AL
Sau khi thực hiện các lệnh trên, cờ Carry bật (CF=1) ngh ĩ a là AH < AL
Ví d ụ: kiểm tra hai bit cu ối cùng của AL TEST AL, 3 ; 3h = 00000011b Nếu cờ Zero bật (ZF=1), có ngh ĩ a là hai bit 0 và 1 c ủa AL đều bằng 0
Lệnh JB JNAE JC JAE JNB JNC JBE JNA JA JNBE JE JZ JNE JNZ JL JNGE JGE JNL JLE JNG JG JNLE JP JPE JNP JPO JS JNS JO JNO JCXZ
Ý Ngh ĩ Ngh ĩ a Nhảy nếu nhỏ hơ n (Jump if Below) Nhảy nếu không lớ n hơ n hoặc bằng Nhảy nếu có nhớ Nhảy nếu lớ n hơ n hoặc bằng (Jump if Above or Equal) Nhảy nếu không nhỏ hơ n Nhảy nếu không có nh ớ Nhảy nếu nhỏ hơ n hoặc bằng (Jump if Below or Equal) Nhảy nếu không lớ n hơ n Nhảy nếu lớ n hơ n (Jump if Above) Nhảy nếu không nhỏ hơ n hoặc bằng Nhảy nếu bằng (Jump if Equal) Nhảy nếu bằng (Jump if Zero) Nhảy nếu không b ằng (Jump if Not Equal) Nhảy nếu không b ằng (Jump if Not Zero) Nhảy nếu nhỏ hơ n Nhảy nếu không lớ n hơ n hoặc bằng Nhảy nếu lớ n hơ n Nhảy nếu không nhỏ hơ n Nhảy nếu nhỏ hơ n hay bằng Nhảy nếu không lớ n hơ n Nhảy nếu lớ n hơ n Nhảy nếu không nhỏ hơ n hay bằng Nhảy nếu có bít ki ểm chẳn lẽ Nhảy nếu kiểm tra chẳn Nhảy nếu không có bít ki ểm chẳn lẽ Nhảy nếu kiểm tra lẻ Nhảy nếu có dấu Nhảy nếu không có d ấu Nhảy nếu có tràn Nhảy nếu không có tràn Nhảy nếu CX = 0
Bảng 5.1: Các l ệnh nhả y có đ iề u kiện Ví d ụ :
MOV AX, 1000h CMP AX, 200h
; AX=1000h ; so sánh AX v ớ i 200h
Kiện Điều Kiệ CF = 1
CF = 0 CF = 1 hay ZF = 1 CF = 0 và ZF = 0 ZF = 1 ZF = 0 SF ≠ OF SF = OF ZF=1 và SF ≠ OF ZF=0 và SF = OF PF = 1 PF = 0 SF = 1 SF = 0 OF = 1 OF = 0 CX = 0
Lệnh nhả y và Vòng l ặ ặ p JZ ; Nếu AX=200h thì nh ảy đến nhãn NH NH MOV CX, BX ; Nếu AX ≠ 200h thì thi hành các l ệnh khác NH: ADD AX, BX ; Vị trí nhảy đến đượ c gắn nhãn NH Khi sử dụng lệnh nhảy có điều kiện sau khi thực hiện phép so sánh, ph ải đặc biệt lưu ý toán hạng trong phép so sánh là s ố có dấu (signed) hay không có d ấu (unsigned) để lựa chọn lệnh cho phù hợ p.
Ví d ụ:
MOV AH, AL ; Gi ả sử AL = 128 CMP AH, 1 JGE Greater ; AH > 1 nhưng không nh ảy ???? ... Greater: …….
Ví d ụ: nếu AL là số nguyên không dấu thì đoạn chươ ng ng trình ở trên phải sửa lại như sau: MOV AH,AL CMP AH,1 JAE Greater ........ Greater: . . . . . . .
Ví d ụ 5-1: Viết chươ ng ng trình nhận 1 ký tự từ bàn phím, sau đó: - Nếu ký tự nhận đượ c là ‘C’ thì in ra: “Welcome to C!” - Nếu ký tự nhận đượ c là ‘A’ thì in ra: “Welcome to Assembly!” - Nếu là ký t ự khác thì thoát kh ỏi chươ ng ng trình. DSEG SEGMENT msg DB 10, 13, “Hay nhap 1 ky tu: $” start msgC DB 10, 13, “Welcome to C!$” msgA DB 10, 13, “Welcome to Assembly!$” DSEG ENDS CSEG SEGMENT Khở Kh ởi động động DS ASSUME CS: CSEG, DS: DSEG In msg ra MH start: MOV AX, DSEG MOV DS, AX MOV AH, 09h Nhậ Nhận ký tự tự LEA DX, msg INT 21h MOV AH, 01h AL=‘C’? INT 21h CMP AL, ‘C’ S in_C JE AL=‘A’? CMP AL, ‘A’ in_A JE S JMP exit in_C: MOV AH, 09h exit LEA DX, msgC
in_C Đ
In msgC in_A
Đ
In msgA
Hình 6.1: Lư u đồ ví d ụ 5-1
Lệnh nhả y và Vòng l ặ ặ p INT 21h JMP start in_A: MOV AH, 09h LEA DX, msgA INT 21h JMP start exit: MOV AH, 4Ch INT 21h CSEG ENDS END start
5.2. VÒNG L ẶP Vòng lặ p là một đoạn ch ươ ng ng trình đượ c thực hiện nhiều l ần cho đến khi thỏa một điều kiện nào đó thì dừng lại, do đó vòng lặ p thườ ng ng k ết thúc b ằng một lệnh nhảy có điều kiện. Tuy nhiên, ngoài các l ệnh nhảy đã biết, Intel-8086 còn cung c ấ p thêm các lệnh vòng lặ p như LOOP, LOOPE, LOOPZ, LOOPNE, LOOPNZ… các lệnh này đều có cú pháp gi ống nhau.
Cú pháp: LOOP Đích ; Đích: Immed, Reg, Mem Ý nghĩ a: a: tự động giảm CX một đơ n v ị, n ếu CX ≠ 0 thì nhảy đến Đích, ngượ c lại n ếu CX = 0 thì không nh ảy đến Đích mà thực hiện lệnh ngay sau LOOP. Nói cách khác, vòng lặ p LOOP dừng lại khi CX=0. Đây là vòng lặ p for có số lần lậ p lưu tr ữ trong CX. CX C ấ ấu trúc vòng l ặ p for vi ế ết bằng LOOP:
n nhan
MOV CX, n ; n là số lần lặ p
nhan: ………….. ; Các lệnh cần lặ p lại
Các lệ lệnh c ầ ần n lặ lặp
…………...
LOOP nhan Ví d ụ: Đoạn lệnh in ra màn hình các ký t ự từ A đến Z MOV DL, ‘A’ ; DL ← ‘A’ MOV CX, 26 ; A→Z: 26 ký tự inkytu: MOV AH, 02h INT 21h INC DL ; DL tăng lên 1 để có ký tự k ế LOOP inkytu
CX
S
CX -1
CX = 0 Đ
Hình 6.2: Lư u đồ LOOP
Lệnh nhả y và Vòng l ặ ặ p LOOPZ/LOOPE: Tự động giảm CX một đơ n vị, nếu CX ≠ 0 và ZF = 1 thì nh ảy đến Đích để thực hiện lệnh. Ngượ c lại, nếu CX = 0 hay ZF = 0 thì không nhảy, khi đó lệnh viết sau lệnh nhảy đượ c thực hiện. C ấ ấu trúc vòng l ặ p do … while vi ế ết bằng LOOPZ: MOV CX, n
CX ← Số l ố l ần ần lặ lặp Nhãn Các lệ lệnh c ần ần lặ lặ p CX ← CX - 1 CX ≠ 0 ?
nhan: LOOPZ nhan
S
Đ
ZF = 1 ?
S
Đ
Hình 6.3: Lư u đồ LOOPE/LOOPZ LOOPNZ/LOOPNE: Tự động giảm CX một đơ n vị, nếu CX ≠ 0 và ZF = 0 thì nhảy đến Đích để thực hiện lệnh. Ngượ c lại, nếu CX = 0 hay ZF = 1 thì không nh ảy, khi đó lệnh viết sau lệnh nhảy đượ c thực hiện C ấ ấu trúc vòng l ặ p do … while vi ế ết bằng LOOPNZ:
CX ← Số l ố l ần ần lặ lặp Nhãn Các lệ lệnh c ầ c ần n lặ lặp CX ← CX - 1
MOV CX, n
nhan: LOOPNZ nhan
CX ≠ 0 ?
S
Đ
ZF = 0 ?
S
Đ
Hình 6.4: Lư u đồ LOOPNE/LOOPNZ Lư u ý: Khi sử dụng các lệnh vòng lặ p cần phải chú ý đến giá tr ị của CX. - Nếu CX=0, vì LOOP giảm CX tr ướ ướ c khi kiểm tra nên khi th ực hiện lệnh LOOP thì CX = CX–1 = 0–1 = –1 = 0FFFFh. Nh ư vậy LOOP sẽ thực hi ện thêm 65535 lần nữa. - Lệnh JCXZ (xem trong b ảng 5.1) nhảy khi CX = 0 th ườ ng ng đượ c dùng để kiểm tra giá tr ị CX tr ướ ướ c khi thực hiện vòng lặ p. Ví d ụ: Nhậ p mảng A gồm 10 ký t ự, dừng lại nếu gặ p phím Enter MOV SI, 0 ; chỉ số mảng MOV CX, 10 ; số lần lặ p LAP: MOV AH, 1 ; nhậ p ký t ự INT 21H MOV A[SI], AL
Lệnh nhả y và Vòng l ặ ặ p INC SI CMP AL, 0Dh LOOPNE LAP ng trình sử dụng hàm 01/21h để nhậ p chuỗi ký tự dài tối đa 128 Ví d ụ 5-2: Viết chươ ng ký tự hoặc k ết thúc bằng phím Enter DSEG SEGMENT chuoi DB 128 DUP(?) DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG MOV DS, AX LEA SI, chuoi ; SI ← địa chỉ chuỗi MOV CX, 128 ; Chi ều dài chuỗi tối đa (số vòng lặ p) key_in: MOV AH, 01h ; Hàm nh ậ p 1 ký t ự INT 21h MOV [SI], AL ; Cất ký tự vào biến chuoi INC SI CMP AL, 0Dh ; Ký t ự ự vừ a nhậ p là Enter? n ế u không phải Enter LOOPNE key_in ; hay chư a đủ 128 ký t ự ự thì nhậ p tiế p MOV AH, 4Ch INT 21h CSEG ENDS END start
BÀI TẬP CHƯƠNG 5 5.1. Viết các lệnh để thực hiện các cấu trúc r ẽ nhánh sau: a.
IF (AX < 0) THEN BX = BX – 1 ENDIF
b.
IF (DL>=‘A’) and (DL<=‘Z’) THEN (In DL ra màn hình) ENDIF
c.
IF (AX < BX) or (BX < CX) THEN DX = 0 ELSE DX = 1 ENDIF
d.
IF (AX < BX) If (BX < CX) THEN AX = 0 Else BX = 0 EndIf ENDIF
Lệnh nhả y và Vòng l ặ ặ p 5.2. Viết chươ ng ng trình đọc 1 ký tự từ bàn phím. - Nếu ký tự nhận đượ c là ‘A’ thì chuy ển con tr ỏ về đầu dòng. - Nếu ký tự nhận đượ c là ‘B’ thì chuyển con tr ỏ xuống dòng. - Nếu nhận đượ c ký tự khác thì thoát kh ỏi chươ ng ng trình. 5.3. Viết đoạn lệnh để tính: a. AX = 1 + 4 + 7 + …. + 148 + 151 b. AX = 100 +95 + 90 + …. + 10 + 5 5.4. Không s ử dụng lệnh DIV, viết đoạn lệnh để thực hiện AX chia cho BX (nế u BX ≠ 0), phần thươ ng ng chứa trong CX, số dư chứa trong AX. Gi ải thuật như sau: CX = 0 WHILE (AX >= BX) CX = CX + 1 AX = AX – BX ENDWHILE 5.5. Không sử dụng lệnh MUL, viết đoạn lệnh để thực hiện AX nhân vớ i BX (nế u BX ≠ 0), k ết quả lưu trong CX. Giải thuật như sau: CX = 0 DO CX = CX + AX BX = BX - 1 WHILE BX > 0 5.6. Sử dụng hàm 08h, ng ắt 21h để viết chươ ng ng trình nhận 1 chuỗi đầy đủ 30 ký tự từ bàn phím. - Nếu ký tự nhận đượ c là HOA thì hi ển thị ký tự đó lên màn hình. - Nếu ký tự nhận đượ c là thườ ng ng thì hiển thị dấu ‘*’ lên màn hình. 5.7. Viết chươ ng ng trình nhậ p 1 chuỗi tối đa 256 ký tự từ bàn phím. Sau đó in đảo ngượ c chuỗi nhận đượ c ra màn hình. 5.8.Viết ch ươ ng ng trình nhận 1 chuỗi ký tự thườ ng ng t ừ bàn phím. Sau đó đổi chuỗi nh ận đượ c thành chuỗi ký tự HOA và in ra màn hình. 5.9. Viết ch ươ ng ng trình nhận 1 chuỗi ký tự từ bàn phím. Sau đó đếm s ố CHỮ có trong chuỗi nhận đượ c và in ra màn hình s ố đếm đượ c. c.
Ng ă ng trình con ă n xế p và Ch ươ ng
Chương 6 NG ĂN XẾ P VÀ CHƯƠ NG NG TRÌNH CON Ngăn xế p là vùng nhớ lưu tr ữ tạm thờ i dữ liệu cho chươ ng ng trình hoặc lưu tr ữ địa chỉ tr ở ở về từ chươ ng ng trình con (còn g ọi là thủ tục).
6.1. NGĂN XẾP 6.1.1. Tổ chức và vận hành ớ đặc biệt trong bộ nhớ có cách truy xuất đặc biệt khác hẳn Ngăn xế p là vùng nh ớ đặ vớ i vi ệc truy xuất ng ẫu nhiên các ô nhớ trong bộ nhớ . H ệ điều hành sẽ cấ p phát vùng nhớ cho ngăn xế p là vùng nhớ có địa chỉ cao nhất trong bộ nhớ , mỗi chươ ng ng trình khi thi hành trên máy tính s ẽ có ngăn xế p riêng cho ch ươ ng ng trình đó. Việc truy xuất nội dung ng ăn xế p theo cơ chế “Vào sau, ra tr ướ c” (Last In First ướ c” Out – LIFO) ngh ĩ a là dữ liệu nào đượ c đưa vào sau cùng sẽ đượ c lấy ra tr ướ c. ướ c. Ngăn xế p đượ c tổ chức thành mãng nhi ều phần tử, mỗi phần tử là 2 byte (word). Kích th ướ c của ngăn xế p phụ thuộc vào chươ ng ng trình và do ng ườ i viết chươ ng ng trình xác định bằng cách khai báo đoạn ngăn xế p.
Ví d ụ: Khai bảo ngăn xế p 256 phần tử có tên là SSEG SSEG SEGMENT STACK ‘STACK’ DW
256 DUP(?)
SSEG SEGMENT
Địa chỉ logic của đỉnh ngăn x ế p trong bộ nhớ đượ ớ đượ c xác định bằng con tr ỏ ngăn xế p SS:SP (SS chứa địa chỉ đoạn ngăn xế p. SP chứa địa chỉ độ dờ i của đỉnh ngăn xế p). Đỉnh của ngăn xế p khi mớ i khở i tạo (gọi là đáy của ngăn xế p) luôn luôn là phần tử có địa chỉ cao nhất trong đoạn ngăn xế p. Hình 6.1 mô t ả vùng nhớ đ ớ đoạn ng ăn x ế p trong ví dụ trên và giá tr ị của con tr ỏ ngăn xế p khi mớ i khở i tạo là phần tử cao nhất trong đoạn ngăn xế p (SP = 0200h). Byte cao
SP
Byte thấ p SS:0200h SS:01FEh SS: ....... SS:0002h SS:0000h
Hình 6.1: Mô hình Đoạn Stack g ồm 256 phần t ử ử (256 word) Khi cất d ữ liệu vào ngăn x ế p, SP giảm 2 tr ướ ướ c khi lưu tr ữ dữ liệu vào. Khi lấy dữ liệu ra khỏi ngăn xế p, thì d ữ liệu đượ c đọc ra tr ướ ướ c sau đó SP mớ i tăng lên 2 để chỉ phần tử k ế tiế p trong ngăn xế p.
Nguồn, Đích: Reg16 hay Mem16. Ý nghĩ a: a: - Lệnh PUSH giảm con tr ỏ ngăn x ế p (SP) xuống 2, sau đó l ưu tr ữ toán hạng nguồn vào ngăn xế p. - Lệnh PUSHF lưu giữ thanh ghi cờ vào ngăn xế p. - Lệnh POP lấy 2 byte dữ liệu tại đỉnh ngăn đưa vào toán hạng đích, sau đó tăng SP lên 2. - Lệnh POPF lấy 2 byte từ ngăn xế p đưa vào thanh ghi c ờ . Ví d ụ: MOV AX, 1234h MOV BX, 5678h PUSH AX ; SP ← SP – 2, Mem[SP] ← AX PUSH BX ; SP ← SP – 2, Mem[SP] ← BX POP DX ; DX ← Mem[SP] , SP ← SP + 2 Hình 6.2 lần l ượ t mô tả hoạt động c ủa ng ăn x ế p ứng v ớ i 3 lệnh truy xuất ng ăn xế p trong ví d ụ trên. Byte cao
Byte thấ p SS:0200h
SP
12h
34h
SS:01FEh SS:01FCh
AH 12h
AL 34h
SS:........ SS:0000h
Hình 6.2a: PUSH AX (vớ i AX=1234h) SS:0200h
SP BH 56h
12h 56h
34h 78h
BL 78h
SS:01FEh SS:01FCh SS:........ SS:0000h
Hình 6.2b: PUSH BX (vớ i BX=5678h) SS:0200h
SP DH 12h
12h
34h
SS:01FEh
56h
78h
SS:01FCh
DL 34h
Hình 6.2c: POP DX (DX ← 5678h)
SS:........ SS:0000h
Ng ă ng trình con ă n xế p và Ch ươ ng Ghi chú: Qua hai lệnh PUSH và POP, ta th ấy ngăn xế p đi từ ô nhớ có địa chỉ cao đến ô nhớ có địa chỉ thấ p, ngh ĩ a là số liệu đưa vào ngăn xế p tr ướ ướ c thì ở địa chỉ cao và số liệu đưa vào ngăn xế p sau thì ở đị n. ở địa chỉ thấ p hơ n. ng trình nh ậ p 1 chuỗi từ bàn phím, sau đó in đảo ngượ c chuỗi nhận Ví d ụ 6-1: Chươ ng đượ c ra màn hình sử dụng giải thuật của ngăn xế p (Ký t ự ự nhậ p vào sau cùng c) đượ c in ra tr ướ ướ c) DSEG SEGMENT msg1 DB “Hay nhap chuoi ky tu, ket thuc bang Enter: $” msg2 DB 10, 13, “Chuoi dao nguoc la: $” DSEG ENDS SSEG SEGMENT STACK ‘STACK’ DW 256 DUP(?) SSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG, SS: SSEG start: MOV AX, DSEG MOV DS, AX MOV AH, 09h LEA DX, msg1 INT 21h XOR CX, CX nhap: MOV AH, 01 INT 21h CMP AL, 0Dh ; Có phải phím Enter không? JZ ; phải thì dừng, không phải thì nhậ p tiế p inra PUSH AX ; Cất ký tự trong AL vào ngăn xế p INC CX ; đếm số ký tự nhậ p JMP nhap ; nhậ p tiế p ký t ự inra: MOV AH, 09h LEA DX, msg2 INT 21h intiep: MOV AH, 02 POP DX ; Lấy ký tự trong ngăn xế p ra DL để in INT 21h LOOP intiep MOV AH, 4Ch INT 21h CSEG ENDS END start
6.2. CHƯƠNG TRÌNH CON 6.2.1. Khai báo ch ương trình con (Th ủ tục) Thủ tục là 1 đoạn chươ ng ng trình có nhiệm vụ tươ ng ng đối độc lậ p đượ c sử dụng nhiều nơ i trong chươ ng ng trình chính. Th ực chất, chươ ng ng trình con hay th ủ tục chỉ là 1 phần l ệnh đượ c vi ết riêng, giúp cho ch ươ ng ng trình dễ đọc, linh hoạt và dễ bảo trì. Thủ tục thườ ng ng đượ c viết ở cuối chươ ng ng trình, trong đoạn lệnh và có c ấu trúc như sau:
Ng ă ng trình con ă n xế p và Ch ươ ng TênThủT ục PROC [kiểu] ….. ; Các lệnh trong thủ tục RET ; chấm dứt thủ tục và tr ở ở về nơ i gọi thủ tục. TênThủT ục ENDP TênThủTục là một nhãn đượ c ngườ i lậ p trình đặt theo qui cách đặt tên trong hợ p ngữ. [kiểu] có thể là NEAR hay FAR dùng để xác định phạm vi của l ệnh g ọi th ủ tục cùng hay khác đoạn vớ i thủ tục. Nếu không khai báo rõ ki ểu, thì mặc nhiên là NEAR. RET (Return) là l ệnh k ết thúc thủ tục và tr ở ở về nơ i gọi thủ tục để tiế p tục thi hành các lệnh sau lệnh gọi thủ tục trong chươ ng ng trình. Lệnh RET sẽ lấy 2 byte địa chỉ tr ở ng đươ ng ng lệnh POP). ở về đang lưu tr ữ trong ngăn xế p để nạ p vào thanh ghi IP (tươ ng RET
IP ← M[SS:SP] SP ← SP + 2
6.2.3. Gọi thủ tục CALL Đích; Cú pháp:
SP ← SP – 2
M[SS:SP] ← IP IP ← Đích
Đích: tên thủ t ục hay địa chỉ thủ t ục Khi thực hiện lệnh CALL, địa chỉ của lệnh ngay sau l ệnh CALL (IP đang chứa địa chỉ này) đượ c cất vào ngăn xế p, sau đó địa chỉ của thủ tục đượ c n ạ p vào IP, do đó lệnh thi hành sau l ệnh CALL sẽ là lệnh đầu tiên trong th ủ tục đượ c gọi. Như vậy, lệnh CALL cũng thực hiện thao tác nhảy gần giống như lệnh nhảy. Thủ tục không có cơ chế truyền tham số vào tr ực tiế p trên dòng lệnh gọi thủ tục. Vì thể việc truyền tham số vào cho thủ tục phải thông qua các thanh ghi hay bi ến xác định tr ướ ướ c khi gọi thủ tục. Dó đó, khi vi ết thủ tục, phải tự chọn thanh ghi hay biến làm tham số vào.
6.3. CÁC VÍ D Ụ 6.3.1. Viết l ại ví dụ 5-1, trong đó việc in chuỗi ra màn hình đượ c thực hiện bằng thủ tục inchuoi.
DSEG SEGMENT msg DB “Hay nhap 1 ky tu: $” msgC DB “Welcome to C!$” msgA DB “Welcome to Assembly!$” DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG MOV DS, AX LEA DX, msg CALL inchuoi MOV AH, 01h
Ng ă ng trình con ă n xế p và Ch ươ ng INT 21h CMP AL, ‘C’ JE in_C CMP AL, ‘A’ JE in_A JMP exit in_C: LEA DX, msgC CALL inchuoi JMP start in_A: LEA DX, msgA CALL inchuoi JMP start exit: MOV AH, 4Ch INT 21h inchuoi PROC PUSH DX MOV AH, 02h MOV DL, 13 INT 21h MOV DL, 10 INT 21h POP DX MOV AH, 09h INT 21h RET inchuoi ENDP CSEG ENDS END start
ướ c khi in chuỗi ; Xuống dòng tr ướ
; DX chứa địa chỉ chuỗi cần in và ; chính là tham s ố vào của thủ tục.
6.3.2. Viết lại ví dụ 5-1, trong đó việc in chuỗi ra màn hình đượ c thực hiện bằng macro inchuoi có tham s ố vào là biến chuỗi cần in. (cú pháp MACRO đượ c trình
bày trong chươ ng ng 2)
inchuoi
chuoi MACRO MOV AH, 02h ; Xuống dòng tr ướ ướ c khi in chuỗi MOV DL, 13 INT 21h MOV DL, 10 INT 21h ; DX chứa địa chỉ LEA DX, chuoi ; biến chuỗi cần in là tham s ố vào Macro MOV AH, 09h INT 21h ENDM
Ng ă ng trình con ă n xế p và Ch ươ ng DSEG SEGMENT msg DB “Hay nhap 1 ky tu: $” msgC DB “Welcome to C!$” msgA DB “Welcome to Assembly!$” DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG MOV DS, AX inchuoi msg MOV AH, 01h INT 21h CMP AL, ‘C’ JE in_C CMP AL, ‘A’ JE in_A JMP exit in_C: inchuoi msgC JMP start in_A: inchuoi msgA JMP start exit: MOV AH, 4Ch INT 21h CSEG ENDS END start 6.3.3. Viết lại ví dụ 6-1, trong đó việc nhậ p chuỗi ký tự và xuất đảo ngượ c chuỗi ký tự đượ c viết bằng thủ tục. In chuỗi bằng Macro
inchuoi
MACRO chuoi MOV AH, 02h ; Xuống dòng tr ướ ướ c khi in chuỗi MOV DL, 13 INT 21h MOV DL, 10 INT 21h ; DX chứa địa chỉ LEA DX, chuoi ; biến chuỗi cần in là tham s ố vào Macro MOV AH, 09h INT 21h ENDM DSEG SEGMENT msg1 DB “Hay nhap chuoi ky tu, ket thuc bang Enter: $” msg2 DB “Chuoi dao nguoc la: $” sokt DW ? DSEG ENDS SSEG SEGMENT STACK ‘STACK’
Ng ă ng trình con ă n xế p và Ch ươ ng DW 256 DUP(?) SSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG, SS: SSEG start: MOV AX, DSEG MOV DS, AX inchuoi msg1 CALL nhapchuoi inchuoi msg2 CALL daochuoi MOV AH, 4Ch INT 21h nhapchuoi
PROC
POP BX XOR CX, CX nhap: MOV AH, 01 INT 21h CMP AL, 0Dh ; Có phải phím Enter không? JZ stop ; phải thì dừng, không ph ải thì nhậ p tiế p PUSH AX ; Cất ký tự trong AL vào ng ăn xế p INC CX ; đếm số ký tự nhậ p JMP nhap ; nh ậ p tiế p ký tự stop: MOV sokt, CX ; c ất số ký tự đã nhậ p PUSH BX RET nhapchuoi ENDP daochuoi PROC POP BX MOV CX, sokt intiep: MOV AH, 02 POP DX ; Lấy ký tự trong ngăn xế p ra DL để in INT 21h LOOP intiep PUSH BX RET ENDP daochuoi CSEG ENDS END start
Ng ă ng trình con ă n xế p và Ch ươ ng
BÀI TẬP CHƯƠNG 6 6.1. Cho AX = 1234h, BX = 5678h, CX = 9ABCh và SP = 1000h. Hãy cho bi ết nội dung AX, BX, CX và SP sau khi th ực hi ện xong mỗi l ệnh sau đây và vẽ mô hình ngăn xế p để minh họa quá trình thay đổi dữ liệu trong ngăn xế p. PUSH PUSH XCHG POP PUSH POP
AX BX AX, CX CX AX BX
6.2. Vẽ mô hình ng ăn xế p minh họa quá trình thay đổi dữ liệu trong ng ăn xế p cho chươ ng ng trình ví d ụ 6-1. 6.3. Giả sử SP = 0200h và n ội dung đỉnh ngăn xế p là 012Ah, Hãy cho biết tr ị của IP và SP sau khi thực hiện xong lệnh RET. 6.4. Vẽ mô hình ng ăn xế p minh họa quá trình thay đổi dữ liệu trong ng ăn xế p cho chươ ng ng trình ví d ụ 6.3.1 6.5. Vớ i 2 l ệnh sau đây, và giả định MOV nằm ở đị ở địa chỉ 08FD:0203h, PROC_1 là thủ tục NEAR tại địa ch ỉ 08FD:0300h, SP = 010AH. Hãy cho bi ết n ội dung IP và SP sau mỗi lệnh. CALL PROC_1 MOV AX, BX 6.6. Viết ch ươ ng ng trình nhậ p t ừ bàn phím một biểu th ức đại s ố có chứa các dấu ngoặc tròn () hay []. Sau đó ki ểm tra biểu th ức nhận đượ c là hợ p l ệ hay không hợ p l ệ và in k ết quả ra màn hình.
Ví d ụ:
[a + (b – [ c * ( d – e )]) + f] là hợ p lệ [a + (b – [ c * ( d – e )) + f)] là không hợ p lệ.
H ướ ng d ẫ n ướ ng ẫn: : dùng ngăn xế p để PUSH các dấu ngoặc trái ‘(‘, ‘[‘ vào ngăn xế p. Nếu gặ p d ấu ngoặc phải ‘)’, ‘]’ thì POP từ stack ra để so sánh. Nếu không POP đượ c, c, hoặc POP ra không đúng loại vớ i dấu ngoặc phải là không hợ p lệ. Ngượ c lại là hợ p lệ.
X ử ử lý ký số và xử lý chuỗ i
Chương 7 XỬ LÝ KÝ SỐ VÀ XỬ LÝ CHUỖI 7.1. XỬ LÝ KÝ TỰ Như đã biết, việc xuất nhậ p trong hợ p ngữ chỉ là xuất nhậ p 1 ký tự hay 1 chuỗi ký tự thông qua mã ASCII của nó và đó cũng chính là cơ chế hoạt động của bàn phím và màn hình. Do đó, khi cần nhậ p hay xuất các dạng số (nhị phân, thậ p phân, thậ p l ục phân) thì phải x ử lý các ký tự số (còn gọi là ký số) thành số sau khi nhậ p và xử lý s ố thành ký số để xuất ra màn hình.
7.1.1. Nhập xuất số nhị phân (Binary) Số nhị phân nhậ p từ bàn phím là 1 chuỗi ký tự bao gồm các ký số ‘0’ và ‘1’. Mỗi ký số đó đượ c đưa vào máy tính ở dạng mã ASCII (8 bit), ph ải đượ c xử lý lại thành dạng 1 bit. Như vậy: - Ký số ‘0’, mã ASCII là 30h, ph ải xử lý thành 1 bit 0. - Ký số ‘1’, mã ASCII là 31h, ph ải xử lý thành 1 bit 1. Tr ướ ướ c khi xuất số nhị phân ra màn hình thì ph ải xử lý ngượ c lại, ngh ĩ a là lấy từng bit để đổi thành ký số tươ ng ng ứng: - Bit 0 ph ải xử lý thành mã ASCII là 30h (Ký s ố ‘0’). - Bit 1 ph ải xử lý thành mã ASCII là 30h (Ký s ố ‘1’). ng trình nh ậ p 1 số nhị phân 8 bit t ừ bàn phím, l ưu tr ữ trong thanh ghi Ví d ụ: Đoạn chươ ng BL. Sử dụng hàm 01/21h để nhậ p từng ký số. MOV BL, 0 MOV CX, 8 nhap: MOV AH, 01h INT 21h CMP AL, 0Dh JZ exit SHL BL, 1 SUB AL, 30h ADD BL, AL LOOP nhap exit: ………
; Xóa BL ; nhậ p đủ 8 bit thì d ừng ; Hàm nh ậ p ký tự ; nếu là phím Enter thì thôi nh ậ p ; không ph ải Enter thì đổi sang bit ; Dịch trái BL 1 bit ; Ký số - 30h = số ; Chuyển bit từ AL sang BL l ưu tr ữ
Ví d ụ: Đoạn ch ươ ng ng trình xuất s ố nhị phân 8 bit trong BL ra màn hình. S ử dụng hàm 02/21h để xuất từng ký số. MOV CX, 8 ; Xuất 8 bit xuat: MOV SHL RCL ADD
DL, 0 BL, 1 DL, 1 DL, 30h
; CF chứa MSB, xuất ra màn hình ; đưa CF vào LSB của DL ; Số + 30h = Ký số
X ử ử lý ký số và xử lý chuỗ i MOV AH, 02h INT 21h LOOP xuat
; In ra màn hình
7.1.2. Nhập xuất số thập lục phân (Hexa) Giải thuật nhậ p/xuất số thậ p lục phân cũng gần giống như số nhị phân. Cần lưu ý r ằng: - Các chữ số thậ p lục phân bao gồm: ‘0’ … ‘9’ và ‘A’ … ‘F’. Khi đó ‘A’ chuyển thành 0Ah, …. ‘F’ chuyển thành 0Fh. Còn ‘0’ đến ‘9’ thì giống như tr ườ ng hợ p nhị phân. ườ ng - Nhưng mỗi số thậ p lục phân là 4 bit nh ị phân. Ví d ụ: Đoạn chươ ng ng trình nh ậ p t ừ bàn phím số thậ p lục phân 16 bit (4 ch ữ số thậ p lục phân) vào thanh ghi BX. S ử dụng hàm 01/21h để nhậ p. Gi ải thuật nhậ p: BX ← 0 lap: Nhậ p ký tự Nếu ký tự là ký số thậ p lục phân: Đổi thành số tưng ứng Dịch trái BX 4 bit Đưa tr ị đã đổi vào 4 bit th ấ p của BX Nhảy về lap cho đến khi ký tự nhậ p là Enter ng trình thể hiện giải thuật trên: Đoạn chươ ng MOV CL, 4 XOR BX, BX nhap: MOV AH, 01 INT 21h CMP AL, 0Dh JZ exit CMP AL, 39h JA kytu SUB AL, 30h JMP save kytu: SUB AL, 37h save: SHL BX, CL ADD BL, AL JMP nhap exit: …………….
; Đổi ký số thành số tươ ng ng ứng
ng trình xu ất giá tr ị BX ra màn hình ở dạng s ố thậ p l ục phân (4 chữ Ví d ụ: Đoạn chươ ng số thậ p lục phân). Sử dụng hàm 02/21h để xuất. Giải thuật xuấ t: t: Lậ p 4 lần: DL ← BH Dịch phải DL 4 bit Nếu DL < 10 ng ứng Đổi thành ký số ‘0’ … ‘9’ t ươ ng Nếu DL >= 10
X ử ử lý ký số và xử lý chuỗ i ng ứng Đổi thành ký t ự ‘A’ …. ‘F’ tươ ng In ra màn hình ký t ự trong DL Quay trái BX 4 bit
ng trình thể hiện giải thuật trên: Đoạn chươ ng MOV CX, 4 xuat: PUSH CX MOV CL, 4 MOV DL, BH SHR DL, CL CMP DL, 09h JA kytu ADD DL, 30h JMP inra kytu: ADD DL, 37h inra: MOV AH, 02h INT 21h SHL BX, CL POP CX LOOP xuat
; Đổi thành ký s ố ‘0’ … ‘9’ tươ ng ng ứng ; Đổi thành ký t ự ‘A’ …. ‘F’ tươ ng ng ứng ; In ra màn hình ký t ự đã đổi ; Quay trái BX 4 bit
7.2. XỬ LÝ CHUỖI 7.2. LỆNH XỬ LÝ CHUỖI Khái niệm chuỗi trong máy tính không gi ớ i hạn ở chuỗi ký tự, mà là khái ni ệm mãng gồm nhiều phần tử, kiểu dữ liệu của phần tử là byte hay word. Các ph ần tử có thể chứa ký tự hay số liệu. Do đó, các lệnh thao tác trên chu ỗi cho phép thao tác trên các mãng hay bất k ỳ vùng đệm dữ liệu nào. Chuỗi lưu tr ữ trong bộ nhớ có địa chỉ đầu và địa chỉ cuối chính là địa chỉ của phần t ử đầu tiên và ph ần t ử cuối trong chuỗi. Như vậy, thông số của 1 chuỗi trong bộ nhớ bao gồm: Địa chỉ đầu, địa chỉ cuối, số phần t ử của chuỗi phải thỏa mãn công thức sau: (Số byte của phần tử x số phần tử) = ĐC cuối - ĐC đầu + 1
ố byte của phần t ử ử x số phần t ử ử ) = S ố ố byte của chuỗ i Trong đ ó: ó: (S ố Hình 7.1 mô t ả chuỗi gồm 14 phần tử, mỗi phần tử là 1 byte đượ c lưu tr ữ trong bộ nhớ bắt đầu tại địa chỉ 12h.
Đầu chuỗi
14 phần tử (14 byte nhớ )
Cuối chuỗi
0
1
2
3
4
5
6
7
8
9
10
11
12
13
12h
13h
14 h
15h
16h
17h
18 h
19h
1Ah
1Bh
1Ch
1Dh
1Eh
1Fh
Địa chỉ đầu chuỗi
Hình 7.1: Chuỗ i trong bộ nhớ
Địa chỉ cuối chuỗi
Intel-8086 cung cấ p nhiều lệnh xử lý chuỗi để thực hiện các thao tác như: chuyển chuỗi, so sánh chu ỗi, dò tìm trong chu ỗi …. Khi s ử dụng những lệnh này thì việc viết ch ươ ng ng trình sẽ ngắn h ơ n và thi hành nhanh h ơ n là sử dụng các lệnh MOV, CMP … trong các thao tác chu ỗi. Các lệnh xử lý chuỗi gồm 3 nhóm trong b ảng 7.1.
X ử ử lý ký số và xử lý chuỗ i Các lệnh x ử lý chuỗi không có toán h ạng trên dòng lệnh, nên việc s ử dụng các toán hạng mặc nhiên phải tuân thủ qui định của từng lệnh.
LỆNH
Ý NGHĨA
Nhóm di chuy ể n chuỗ i i MOVSB Di chuyển chuỗi từng byte (Move String Byte) MOVSW Di chuyển chuỗi từng word (Move String Word) LODSB Nạ p chuỗi từng byte (Load String Byte) LODSW Nạ p chuỗi từng word (Load String Word) STOSB Ghi chuỗi từng byte (Store String Byte) STOSW Ghi chuỗi từng word (Store String Word) Nhóm so sánh chu ỗ i i CMPSB So sánh chuỗi từng byte byte (Compare String Byte) CMPSW So sánh chuỗi từng word word (Compare String Word) Nhóm dò tìm giá tr ị trong chuỗ i i SCASB Do tìm trong chu ỗi từng byte byte (Scan String String Byte) SCASW Do tìm trong chu ỗi từng word (Scan String Word)
Bảng 7.1: Lệnh xử lý chuỗ i
7.2.1. Hướng xử lý chuỗi Khi xử lý 1 chuỗi có ngh ĩ a là xử lý lần lượ t các phần tử trong chuỗi, hết phần tử này đến phần tử khác cho đến khi hết chuỗi. Tùy vào đặc điểm của chuỗi, có hai hướ ng ng xử lý: - Hướ ng ng t ăng (từ trái qua ph ải) là xử lý phần tử đầu tiên tr ướ ướ c và lần lượ t đến ng dần từ địa chỉ đầu cho đến địa phần tử cuối. Khi đó địa chỉ các phần tử sẽ t ă ă ng chỉ cuối. - Hướ ng ng giảm (từ phải qua trái) là xử lý phần tử cuối tr ướ ướ c và lần lượ t sau đó mớ i đến các phần tử đầu. Khi đó địa chỉ các phần tử sẽ giảm dần từ địa chỉ cuối cho đến địa chỉ đầu. Thái thái cờ Hướ ng ng (DF) dùng để chọn hướ ng ng xử lý của chuỗi, do đó tr ướ ướ c khi thực hiện l ệnh xử lý chuỗi, phải chọn hướ ng ng xử lý chuỗi thích hợ p bằng các lệnh thiết lậ p tr ạng thái DF như sau: ng tăng CLD ; DF = 0 : Hướ ng STD ; DF = 1 : Hướ ng ng giảm 7.2.2. Các tiền tố lập REP (Repeat) Tiền tố REP có thể đặt tr ướ ướ c các lệnh xử lý chuỗi như sau: REP Khi đó các lệnh xử lý chuỗi sẽ đượ c lậ p lại vớ i số lần lậ p xác định trong CX và sau mỗi l ần l ậ p, CX tự động giảm 1 cho đến khi CX = 0 thì k ết thúc vòng l ậ p (Trong tr ườ ng hợ p này cũng có thể sử d ụng l ệnh vòng l ậ p LOOP, như ng ng l ệnh sẽ dài dòng ườ ng hơ n) n). Ví d ụ: Đoạn lệnh thực hiện MOVSB lậ p lại 10 lần, dùng REP và LOOP như sau:
X ử ử lý ký số và xử lý chuỗ i LOOP
REP MOV CX, 10 REP MOVSB
lap:
MOV CX, 10 MOVSB LOOP lap
ng dùng cho các l ệnh Ngoài ra còn có các ti ền tố lậ p tươ ng ng tự như REP (thườ ng SCASB, SCASW, CMPSB, CMPSW) như bảng 7.2 sau: Lệnh REPZ REPE REPNZ REPNE
Ý Ngh ĩ a Lậ p lại lệnh theo sau nó n ếu CX ≠ 0 và ZF = 1. Khi CX = 0 hay ZF = 0 s ẽ không thực hiện vòng lậ p. Lậ p lại lệnh theo sau nó n ếu CX ≠ 0 và ZF = 0. Khi CX = 0 hay ZF = 1 s ẽ không thực hiện vòng lậ p.
ố l ậ p Bảng 7.2: Ý nghĩ a các tiề n t ố 7.2.3. Lệnh Ghi vào chu ỗi STOSB sẽ ghi nội dung AL (1 byte) vào 1 ph ần tử trong chuỗi đích có địa chỉ xác định bở i ES:DI. STOSW sẽ ghi nội dung AX (2 byte) vào 1 ph ần tử trong chuỗi đích có địa chỉ xác định bở i ES:DI.
STOSB Mem[ES:DI] ← AL
STOSW Mem[ES:DI] ← AX
IF (DF = 0) DI ← DI + 1 ELSE DI ← DI – 1
IF (DF = 0) DI ← DI + 2 ELSE DI ← DI – 2
Ví d ụ 7-1: Viết lại chươ ng ng trình ở ví dụ 5-2, trong đó sử dụng lệnh STOSB để lưu các ký tự nhận đượ c từ bàn phím vào bi ến chuỗi. DSEG
SEGMENT chuoi DB 128 DUP(?) DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG, ES: DSEG start: MOV AX, DSEG MOV DS, AX MOV ES, AX LEA DI, chuoi ; SI ← địa chỉ chuỗi MOV CX, 128 ; Chiều dài chuỗi tối đa (số vòng lậ p) key_in: MOV AH, 01h ; Hàm nh ậ p 1 ký t ự INT 21h STOSB ; Cất ký tự vào biến chuoi CMP AL, 0Dh ; Ký t ự ự vừ a nhậ p là Enter? n ế u không phải Enter LOOPNE key_in ; hay chư a đủ 128 ký t ự ự thì nhậ p tiế p MOV AH, 4Ch INT 21h
X ử ử lý ký số và xử lý chuỗ i CSEG
ENDS END start
7.2.4. Lệnh Nạp từ chuỗi LODSB sẽ nạ p 1 byte trong chuỗi nguồn có địa chỉ xác định bở i DS:SI vào thanh ghi AL.
LODSW sẽ nạ p 2 byte trong chuỗi nguồn có địa chỉ xác định bở i DS:SI vào thanh ghi AX.
LODSB AL ← Mem[DS:SI] IF (DF = 0) SI ← SI + 1 ELSE SI ← SI – 1
LODSW AX ← Mem[DS:SI] IF (DF = 0) SI ← SI + 2 ELSE SI ← SI – 2
ng trình dùng hàm 02/21h để in chuỗi “Welcome to Assembly” ra Ví d ụ 7-2: Viết chươ ng màn hình, trong đó sử dụng lệnh LODSB để nạ p từng ký tự trong chuỗi vào AL DSEG SEGMENT chuoi DB “Welcome to Assembly” ; chu ỗi gồm 19 ký tự DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG MOV DS, AX LEA SI, chuoi ; SI ← địa chỉ chuỗi MOV CX, 19 ; Chi ều dài chuỗi ; nạ p từng byte trong chuoi vào AL key_in: LODSB MOV DL, AL MOV AH, 02h ; Hàm nh ậ p in 1 ký tự INT 21h LOOP key_out ; MOV AH, 4Ch INT 21h CSEG ENDS END start
7.2.5. Lệnh di chuy ển chuỗi MOVSB sẽ chuyển 1 byte trong chuỗi nguồn có địa chỉ xác định bở i DS:SI đến 1 phần tử trong chuỗi đích có địa chỉ xác định bở i ES:DI. MOVSW sẽ chuyển 2 byte trong chu ỗi nguồn có địa chỉ xác định bở i DS:SI đến 2 byte nh ớ trong chuỗi đích có địa chỉ xác định bở i ES:DI.
X ử ử lý ký số và xử lý chuỗ i MOVSB MOVSW Mem[ES:DI] ← Mem[DS:SI] Mem[ES:DI] ← Mem[DS:SI] IF (DF = 0) SI ← SI + 1 DI ← DI + 1 ELSE SI ← SI – 1 DI ← DI – 1
IF (DF = 0) SI ← SI + 2 DI ← DI + 2 ELSE SI ← SI – 2 DI ← DI – 2
ng trình nhậ p 2 chuỗi từ bàn phím bằng hàm 0Ah, trong đó chỉ Ví d ụ 7-3: Viết chươ ng đượ c khai báo 1 vùng đệm bàn phím. ướ ng ẫn: (H ướ ng d ẫ n : Sau khi nhận đượ c 1 chuỗ i thì chuyể n chuỗ i nhận đượ c sang biế n chuỗ i khác) inchuoi
MACRO chuoi MOV AH, 09h LEA DX, chuoi INT 21h ENDM nhapchuoi MACRO vungdem MOV AH, 0Ah ; Nhậ p chuỗi bằng hàm 0Ah/21h LEA DX, vungdem INT 21h ENDM chuyenchuoi MACRO dich ; Chuy ển chuỗi từ vùng đệm buff đến chuỗi dich XOR CX, CX ; MOV CL, len ; Số ký tự của chuỗi nhận đượ c CLD ; Chiều tăng LEA SI, buff ; địa chỉ chuỗi nguồn LEA DI, dich ; địa chỉ chuỗi đích REP MOVSB ENDM DSEG SEGMENT msg1 DB “Hay nhap chuoi thu nhat: $” msg2 DB “Hay nhap chuoi thu hai: $” xdong DB 10, 13, ‘$’ ; Ký t ự xuống dòng chuoi1 DB 30 DUP (?) ; nơ i chứa chuỗi thứ nhất chuoi2 DB 30 DUP (?) ; nơ i chứa chuỗi thứ hai max DB 30 len DB ? buff DB 31 DUP(?) DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG
X ử ử lý ký số và xử lý chuỗ i MOV DS, AX MOV ES, AX ; Vì chuỗi nguồn và chuỗi đích cùng đoạn DS inchuoi msg1 nhapchuoi max ; Nhậ p chuỗi thứ nhất chuyenchuoi chuoi1 ; Chuy ển vào chuoi1 inchuoi xdong inchuoi msg2 nhapchuoi max ; Nhậ p chuỗi thứ hai chuyenchuoi chuoi2 ; Chuy ển vào chuoi2 MOV AH, 4Ch INT 21h CSEG ENDS END start
7.2.6. Lệnh So sánh hai chu ỗi CMPVSB sẽ so sánh 1 byte trong chu ỗi nguồn có địa chỉ xác định bở i DS:SI vớ i 1 byte trong chu ỗi đích có địa chỉ xác định bở i ES:DI. CMPSW sẽ so sánh 2 byte trong chu ỗi nguồn có địa chỉ xác định bở i DS:SI vớ i 2 byte trong chuỗi đích có địa chỉ xác định bở i ES:DI. CMPSB Cờ ← ờ ← Mem[DS:SI] – Mem[ES:DI] IF (DF = 0) SI ← SI + 1 DI ← DI + 1 ELSE SI ← SI – 1 DI ← DI – 1
CMPSW Cờ ← ờ ← Mem[DS:SI] – Mem[ES:DI] IF (DF = 0) SI ← SI + 2 DI ← DI + 2 ELSE SI ← SI – 2 DI ← DI – 2
Ví d ụ 7-4: Viết tiế p ví dụ 7-3, sau khi đã nhậ p 2 chuỗi thì so sánh 2 chu ỗi đã nhậ p c. Nếu giống nhau thì in ra màn hình “Hai chuoi giong nhau”. Ng ượ c đượ c. lại thì in ra màn hình “Hai chuoi khac nhau” inchuoi
MACRO chuoi MOV AH, 09h LEA DX, chuoi INT 21h ENDM nhapchuoi MACRO vungdem MOV AH, 0Ah ; Nhậ p chuỗi LEA DX, vungdem INT 21h ENDM chuyenchuoi MACRO dich ; Chuy ển chuỗi từ vùng đệm bàn XOR CX, CX ; phím đến chuỗi dich MOV CL, len ; Số ký tự của chuỗi nhận đượ c
X ử ử lý ký số và xử lý chuỗ i CLD ; Chiều tăng LEA SI, buff ; địa chỉ chuỗi nguồn LEA DI, dich ; địa chỉ chuỗi đích REP MOVSB ENDM DSEG SEGMENT msg1 DB “Hay nhap chuoi thu nhat: $” msg2 DB “Hay nhap chuoi thu hai: $” msg3 DB “Sau khi so sanh, ket qua: $” msg4 DB “Hai chuoi giong nhau$” msg5 DB “Hai chuoi khac nhau$” msg xdong DB 10, 13, ‘$’ ; Ký t ự xuống dòng chuoi1 DB 30 DUP (‘$’) ; nơ i chứa chuỗi thứ nhất chuoi2 DB 30 DUP (‘$’) ; nơ i chứa chuỗi thứ hai max DB 30 len DB ? buff DB 31 DUP(‘$’) DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG MOV DS, AX MOV ES, AX ; Vì chuỗi nguồn và chuỗi đích cùng đoạn DS inchuoi msg1 nhapchuoi max ; Nhậ p chuỗi thứ nhất chuyenchuoi chuoi1 ; Chuy ển vào chuoi1 inchuoi xdong inchuoi msg2 nhapchuoi max ; Nhậ p chuỗi thứ hai chuyenchuoi chuoi2 ; Chuy ển vào chuoi2 ; ----- So sánh 2 chu ỗi: chuoi1 và chuoi2 ----MOV CX, 30 ; 30 ký t ự LEA SI, chuoi1 ; chuoi1 là chu ỗi nguồn LEA DI, chuoi2 ; chuoi2 là chu ỗi đích REPZ CMPSB ; nếu so sánh b ằng thì tiế p tục so sánh tiế p PUSHF inchuoi xdong inchuoi msg3 POPF JE giong inchuoi msg5 JMP exit giong: inchuoi msg4 exit: MOV AH, 4Ch
X ử ử lý ký số và xử lý chuỗ i INT 21h CSEG ENDS END start
7.2.7. Lệnh dò tìm trong chu ỗi SCASB sẽ so sánh nội dung AL (1 byte) v ớ i 1 byte trong chu ỗi đích có địa chỉ xác định bở i ES:DI. SCASW sẽ so sánh nội dung AX (2 byte) v ớ i 2 byte trong chu ỗi đích có địa chỉ xác định bở i ES:DI. SCASB Cờ ← ờ ← AL – Mem[ES:DI] IF (DF = 0) DI ← DI + 1 ELSE DI ← DI – 1
SCASW Cờ ← ờ ← AX – Mem[ES:DI] IF (DF = 0) DI ← DI + 2 ELSE DI ← DI – 2
ng trình nh ậ p t ừ bàn phím 1 chu ỗi, sau đó ki ểm tra trong chu ỗi nh ận Ví d ụ: Viết ch ươ ng đượ c có ký tự ‘A” không. In k ết quả ra màn hình. inchuoi
MACRO chuoi MOV AH, 09h LEA DX, chuoi INT 21h ENDM nhapchuoi MACRO vungdem MOV AH, 0Ah ; Nhậ p chuỗi LEA DX, vungdem INT 21h ENDM DSEG SEGMENT msg1 DB “Hay nhap chuoi (toi da 50 ky tu): $” msg2 DB “Dang tim ky tu A trong chuoi…….$” msg3 DB “Da tim gap ky tu A.$” msg4 DB “Khong tim gap ky tu A.$” xdong DB 10, 13, ‘$’ ; Ký t ự xuống dòng max DB 30 len DB ? buff DB 31 DUP(‘$’) DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG MOV DS, AX MOV ES, AX ; Vì chuỗi nguồn và chuỗi đích cùng đoạn DS inchuoi msg1 nhapchuoi max ; Nhậ p chuỗi thứ nhất
X ử ử lý ký số và xử lý chuỗ i inchuoi xdong inchuoi msg2 XOR CX, CX MOV CL, len ; số ký tự của chuỗi MOV AL, ‘A’ ; ký tự cần tìm LEA DI, buff ; địa chỉ chuỗi cần tìm REPNE SCASB ; khi gặ p thì d ừng PUSHF ; Cất tr ạng thái cờ sau khi thực hiện SCASB inchuoi xdong POPF ; Lấy lại tr ạng thái cờ đ ờ đã cất JE gapA inchuoi msg4 JMP exit gapA: inchuoi msg3 exit: MOV AH, 4Ch INT 21h CSEG ENDS END start
X ử ử lý ký số và xử lý chuỗ i
BÀI TẬP CHƯƠNG 7 7.1. Viết chươ ng ng trình nh ậ p t ừ bàn phím 1 ký t ự, sau đó in ra màn hình mã ASCII c ủa ký tự nhận đượ c ở dạng nhị phân.
Ví d ụ:
Hãy nhậ p 1 ký tự: K Mã ASCII dạng nhị phân là: 01110101
7.2. Viết chươ ng ng trình nh ậ p t ừ bàn phím 1 ký t ự, sau đó in ra màn hình mã ASCII c ủa ký tự nhận đượ c ở thậ p lục phân.
Ví d ụ:
Hãy nhậ p 1 ký tự: K Mã ASCII dạng thậ p lục phân là: 75
7.3. Viết chươ ng ng trình nhậ p từ bàn phím 1 s ố nhị phân 8 bit, sau đó in ra màn hình giá tr ị nhận đượ c ở dạng số thậ p lục phân.
Ví d ụ:
Hãy nhậ p số nhị phân 8 bit: 10110101 Dạng thậ p lục phân là:
B5
7.4. Viết chươ ng ng trình nhậ p 2 chuỗi A và B t ừ bàn phím, sau đó ghép chuỗi A vớ i chuỗi B để tạo thành chuỗi C. In ra màn hình chu ỗi C.
Ví d ụ:
Hãy nhậ p chuỗi A: Chao cac ban Hãy nhậ p chuỗi B: Sinh vien CNTT Chuỗi ghép C là: Chao cac ban Sinh vien CNTT
7.5. Viết chươ ng ng trình nhậ p 1 chuỗi tối đa 256 ký tự. Sau đó tìm xem có các ký t ự ‘A’, ‘a’, ‘B’, ‘b’ có trong chuỗi hay không. In ra màn hình các k ết quả tìm đượ c. c.
Ví d ụ:
Hãy nhậ p chuỗi: Chao cac ban Sinh vien CNTT K ết quả: - Không có ‘A’. - Có ‘a’. - Không có ‘B’. - Có ‘b’.
Phụ l ục 1 - H ướ ng d ẫ ướ ng ẫn sử d ụng Emu8086
Phụ lục 1 Hướng Dẫn Sử Dụng Emu8086
Emu8086 là công cụ mạnh của ngườ i lậ p trình Hợ p ngữ. Bao gồm nhiều chức năng như: thực thi ch ươ ng ng trình dạng EXE (EXE Template), thực thi chươ ng ng trình dạng COM (COM Template, Th ực thi đoạn lệnh hợ p ngữ (BIN Template), tạo đoạn Boot máy (BOOT Template). Trong phần h ướ ng ng d ẫn này chỉ hướ ng ng dẫn cho sinh viên cách sử dụng công cụ Emu8086 để khảo sát lệnh Intel-8086, BIN Template (các chứ c nă ng ng khác, sinh viên t ự ự tìm hiể u thêm thông qua ph ần Help của công c ụ ). Công cụ này giúp sinh viên thấy đượ c s ự thay đổi giá tr ị các thanh ghi, c ờ , ng ăn x ế p, vùng nhớ … sau khi thực hiện lệnh. Qua đó sinh viên hiểu rõ hơ n hoạt động của lệnh hay sự tác /ngăn xế p/bộ nhớ khi thực hiện lệnh. động lên giá tr ị thanh ghi/cờ /ng
1. Khởi động Emu8086: Nhấ p đúp biểu tượ ng ng
trên desktop, màn hình khở i động như hình 1 xuất
hiện. • •
ng trình mẫu để thực hiện. Code Samples : Chọn file ch ươ ng ng dẫn (phải có k ết nối Quick Start Tutor: Truy cậ p trang web h ướ ng Internet).
•
ng dùng. Recent Files: Chọn file trong danh sách file th ườ ng
•
Continue …: Tiế p tục vào màn hình làm vi ệc.
Hình 1: Màn hình kh ở i động Emu8086 Khi bấm Continue, màn hình làm vi ệc xuất hiện như hình 2 vớ i file ch ươ ng ng trình mẫu “Hello World” mặc nhiên xuất hiện trong vùng soạn thảo.
Phụ l ục 1 - H ướ ng d ẫ ướ ng ẫn sử d ụng Emu8086 nút Convertor trên thanh Hình 3 là công c ụ Number Convertor (Bấ m vào nút Convertor công cụ ) r ất hữu dụng khi muốn chuyển đổi giá tr ị giữa các hệ thống số vớ i nhau.
2. Soạn thảo lệnh hợp ngữ để khảo sát:
Để mở vùng làm việc mớ i chọn NEW, xuất hiện hình 4 để chọn Template Để khảo sát lệnh Intel-8086 thì chọn chức năng thực thi lệnh (BIN Template). Vùng làm việc BIN Template xu ất hiện như hình 5. Trong BIN Template, quan tr ọng nhất là dòng đầu tiên #make_bin# dùng để xác định chế độ dịch lệnh của Emu8086. Tuyệ t t đố i không đượ c thay đổ i dòng l ệ n ệnh h gi ả này. Các dòng còn lại dùng để khở i động các giá tr ị ban đầu cho các thanh ghi và thông số địa chỉ segment/offset cho chươ ng ng trình. Các dòng này không quan tr ọng, có thể xóa bỏ đượ c hoặc thay đổi giá tr ị khở i động khác. Khi các dòng này b ị xóa bỏ thì các thông số và thanh ghi s ẽ đượ c khở i động theo giá tr ị mặc nhiên. Để đơ n giản, nên xóa bỏ từ dòng 2 đến hết.
Vùng soạn thảo l nh
Hình 2: Màn hình Emu8086
Hình 3: Ch ng ứ c nă ng
Convertor
Hình 4: Ch ọn template Ví d ụ: Soạn đoạn lệnh như trong hình 6 sau để khảo sát:
Hình 5: BIN Template
Phụ l ục 1 - H ướ ng d ẫ ướ ng ẫn sử d ụng Emu8086
Hình 6: Ví d ụ
3. Khảo sát lệnh (Giả lập - Emulate)
Để khảo sát lệnh bằng cách giả lậ p, chọn Emulate, khi đó màn hình giả lậ p xuất hiện như hình 7. Màn hình gi ả lậ p gồm 3 vùng: Thanh ghi (Registers), Bộ nhớ 1KB (Memory) chứa mã máy nh ị phân và vùng hiển thị lệnh hợ p ng ữ tươ ng ng ứng vớ i mã máy nhị phân (Disassemble ) Giá tr ị các thanh ghi đượ c trình bày ở dạng số Hex. Vùng bộ nhớ trình bày Hex – Dec – ASCII đối vớ i từng ô nhớ (địa chỉ offset)
Hình 7: Màn hình gi ả l ậ p
Phụ l ục 1 - H ướ ng d ẫ ướ ng ẫn sử d ụng Emu8086 •
Reload: Nạ p lại đoạn lệnh
•
Run: Chạy cả đoạn lệnh từ đầu cho đến khi gặ p lệnh HLT (dừng)
•
Single Step: Mỗi khi Single Step đượ c bấm thì CPU chỉ chạy 1 lệnh hiện hành duy nhất (xác định bằng vệt sáng màu xanh) và d ừng lại chờ cho đến khi Single Step đượ c bấm tiế p. Như vậy, việc khảo sát lệnh có thể thực hiện thông qua Single Step.
Các thành phần khác còn có th ể xem đượ c tr ạng thái khi CPU th ực hiện lệnh trong chế độ giả lậ p như ALU, Stack và FLAGS (thanh ghi C ờ ) bằng cách bấm vào các nút tươ ng ng ứng •
Hình 8 cho biết tr ạng thái ALU khi th ực hiện các phép toán (giá tr ị ở dạng nhị phân 16 bit). Dòng đầu tiên là th ứ tự bit, dòng thứ 2 là giá tr ị toán hạng nguồn 1, dòng thứ 3 là giá tr ị toán hạng nguồn 2 và dòng cuối là giá tr ị k ết quả sau khi thực hiện phép toán
•
Hình 9 trình bày n ội dung ngăn xế p ở dạng Hex 2 byte
•
Hình 10 thể hiện tr ạng thái các c ờ sau khi thực hiện phép toán
Hình 8: Tr ạng thái ALU
Hình 9: Stack
Hình 10: Thanh ghi ờ C
Phụ l ục 1 - H ướ ng d ẫ ướ ng ẫn sử d ụng Emu8086
4. Thực thi chương trình dạng EXE hay COM Emu8086 có thể thực thi chươ ng ng trình Hợ p ngữ viết theo cấu trúc dạng EXE hay COM. Khi đó trong vùng soạn thảo, không có dòng lệnh giả #make_bin# và soạn thảo chươ ng ng trình theo đúng cấu trúc dạng chươ ng ng trình tươ ng ng ứng. ng trình dạng EXE như hình 11 Ví d ụ: Chươ ng
MOV MOVSB MOVSW MUL NEG NOP NOT OR OUT POP POPA POPF PUSH PUSHA PUSHF RCL
RCR REP REPE REPNE REPNZ REPZ RET RETF ROL ROR SAHF SAL SAR SBB
SCASB SCASW SHL SHR STC STD STI STOSB STOSW SUB TEST XCHG XLATB XOR
Operand types: REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP. SREG: DS, ES, SS, and only as second operand: CS. memory: [BX], [BX+SI+7], variable, etc.... immediate: 5, -24, 3Fh, 10001101b, etc...
Notes: •
•
When two operands are required for an instruction they are separated by comma. For example: REG, memory When there are two operands, both operands must have the same size (except shift and rotate instructions). For example: AL, DL DX, AX m1 DB ? AL, m1 m2 DW ? AX, m2
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ •
Some instructions allow several operand combinations. For example: memory, immediate REG, immediate memory, REG REG, SREG
These marks are used to show the state of the flags: 1 - instruction sets this flag to 1. 0 - instruction sets this flag to 0. r - flag value depends on result of the instruction. ? - flag value is undefined (maybe 1 or 0).
Instructions in alphabetical order: Instruction AAA
Operands No operands
Description ASCII Adjust after Addition. Corrects result in AH and AL after addition when working with BCD values. It works according to the following Algorithm: if low nibble of AL > 9 or AF = 1 then: AL = AL + 6 AH = AH + 1 AF = 1 CF = 1 else AF = 0 CF = 0 in both cases: clear the high nibble of AL.
AAD
Nooperands
ASCII Adjust before Division. Prepares two BCD values for division. Algorithm: AL = (AH * 10) + AL AH = 0 C Z S O P A ? r r ? r ?
AAM
No operands
ASCII Adjust after Multiplication. Corrects the result of multiplication of two BCD values. Algorithm: AH = AL / 10 AL = remainder C Z S O P A ? r r ? r ?
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ
AAS
No operands
ASCII Adjust after Subtraction. Corrects result in AH and AL after subtraction when working with BCD values. Algorithm: if low nibble of AL > 9 or AF = 1 then: AL = AL - 6 AH = AH - 1 AF = 1 CF = 1 else AF = 0 CF = 0 in both cases: clear the high nibble of AL. C Z S O P A r ? ? ? ? r
ADC
ADD
REG,memory Add with Carry. memory, REG Algorithm: operand1 = operand1 + operand2 + CF REG, REG C Z S O P A memory,immediate r r r r r r REG, immediate REG, memory memory, REG REG, REG memory, immediate REG, immediate
Logical AND between all bits of two operands. Result is stored in operand1. These rules apply: 1 AND 1 = 1 1 AND 0 = 0 0 AND 1 = 0 0 AND 0 = 0 C Z S O P 0 r r 0 r
CALL
procedure name label 4-byte address
Transfers control to procedure, return address is (IP) is pushed to stack. 4-byte address may be entered in this form: 1234h:5678h, first value is a segment second value is an offset (this is a far call, so CS is also pushed to stack).
CBW
No operands
operand1 = operand1 + operand2 C Z S O P A r r r r r r
Convert byte into word. Algorithm: if high high bit of AL = 1 then
AH = 255 255 (0FFh)
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ else AH = 0 CLC
No operands
Clear Carry flag. Algorithm: CF = 0
CLD
No operands
Clear Direction flag. SI and DI will be incremented by chain instructions: CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, STOSB, STOSW. Algorithm: DF = 0
CLI
No operands
Clear Interrupt enable flag. This disables hardware interrupts Algorithm: IF = 0
CMC
No operands
Complement Carry flag. Inverts value of CF. Algorithm: if CF = 1 then CF = 0 if CF = 0 then CF = 1
Compare. Algorithm: operand1 - operand2 result is not stored anywhere, flags are set (OF, SF, ZF, AF, PF, CF) according to result. C Z S O P A r r r r r r Compare bytes: ES:[DI] from DS:[SI]. Algorithm: DS:[SI] - ES:[DI] set flags according to result: OF, SF, ZF, AF, PF, CF if DF = 0 then SI = SI + 1 DI = DI + 1 else SI = SI - 1 DI = DI - 1 C Z S O P A r r r R r r
CMPSW
No operands
Compare words: ES:[DI] from DS:[SI]. Algorithm: DS:[SI] - ES:[DI] set flags according to result: OF, SF, ZF, AF, PF, CF if DF = 0 then SI = SI + 2 DI = DI + 2 else SI = SI - 2 DI = DI - 2 C Z S O P A r r r r r r
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ CWD
No operands
Convert Word to Double word. Algorithm: if high bit of AX = 1 then: else
DAA
No operands
DX = 65535 (0FFFFh)
DX = 0
Decimal adjust After Addition. Corrects the result of addition of two packed BCD values. Algorithm: if low nibble of AL > 9 or AF = 1 then: AL = AL + 6 AF = 1 if AL > 9Fh or CF = 1 then: AL = AL + 60h CF = 1 C Z S O P A r r r r r r
DAS
No operands
Decimal adjust After Subtraction. Corrects the result of subtraction of two packed BCD values. Algorithm: if low nibble of AL > 9 or AF = 1 then: AL = AL - 6 AF = 1 if AL > 9Fh or CF = 1 then: AL = AL - 60h CF = 1 C Z S O P A r r r r r r
DEC
REG memory
Decrement. Algorithm: operand = operand - 1 Z S O P A r r r r r CF - unchanged!
DIV
REG memory
Unsigned divide. Algorithm: when operand is a byte: AL = AX / operand AH = remainder (modulus) when operand is a word: AX = (DX AX) / operand DX = remainder (modulus) C Z S O P A ? ? ? ? ? ?
HLT
No operands
Halt the System.
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ IDIV
REG memory
Signed divide. Algorithm: when operand is a byte: AL = AX / operand AH = remainder (modulus) when operand is a word: AX = (DX AX) / operand DX = remainder (modulus) C Z S O P A ? ? ? ? ? ?
IMUL
IN
INC
REG memory
AL, im.byte AL, DX AX, im.byte AX, DX REG memory
Signed multiply. Algorithm: when operand is a byte: AX = AL * operand. when operand is a word : (DX AX) = AX * operand. C Z S O P A r ? ? r ? ? CF=OF=0 when result fits into operand of IMUL. Input from port into AL or AX. Second operand is a port number. If required to access port number over 255 - DX register should be used. Increment. Algorithm: operand = operand + 1 Z S O P A r r r r r CF - unchanged!
INT
immediate byte
Interrupt numbered by immediate byte (0..255). Algorithm: Push to stack: flags register, CS , IP IF = 0 Transfer control to interrupt procedure
INTO
No operands
Interrupt 4 if Overflow flag is 1. Algorithm: if OF = 1 then INT 4
IRET
No operands
Interrupt Return. Algorithm: Pop from stack: IP , CS , flags register C Z S O P A popped
JA
label
Short Jump if first operand is Above second operand (as set by CMP instruction). Unsigned. Algorithm: if (CF = 0) and (ZF = 0) then jump
JAE
label
Short Jump if first operand is Above or Equal to second operand (as set by CMP instruction). Unsigned. Algorithm: if CF = 0 then jump
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ JB
label
Short Jump if first operand is Below second operand (as set by CMP instruction). Unsigned. Algorithm: if CF = 1 then jump
JBE
label
Short Jump if first operand is Below or Equal to second operand (as set by CMP instruction). Unsigned. Algorithm: if CF = 1 or or ZF = 1 then jump
JC
label
Short Jump if Carry flag is set to 1. Algorithm: if CF = 1 then jump
JCXZ
label
Short Jump if CX register is 0. Algorithm: if CX = 0 then jump
JE
label
Short Jump if first operand is Equal to second operand (as set by CMP instruction). Signed/Unsigned. Algorithm: if ZF = 1 then jump
JG
label
Short Jump if first operand is Greater then second operand (as set by CMP instruction). Signed. Algorithm: if (ZF = 0) and (SF = OF) then jump
JGE
label
Short Jump if first operand is Greater or Equal to second operand (as set by CMP instruction). Signed. Algorithm: if SF = OF then jump
JL
label
JLE
label
JMP
label 4-byte address
JNA
label
JNAE
label
JNB
label
JNBE
label
JNC
label
Short Jump if first operand is Less then second operand (as set by CMP instruction). Signed. Algorithm: if SF <> OF then jump Short Jump if first operand is Less or Equal to second operand (as set by CMP instruction). Signed. Algorithm: if SF <> OF or or ZF = 1 then then jump Unconditional Jump. Transfers control to another part of the program. 4-byte address may be entered in this form: 1234h:5678h, first value is a segment second value is an offset Algorithm: always jump Short Jump if first operand is Not Above second operand (as set by CMP instruction). Unsigned. Algorithm: if CF = 1 or ZF = 1 then jump Short Jump if first operand is Not Above and Not Equal to second operand (as set by CMP instruction). Unsigned. Algorithm: if CF = 1 then jump Short Jump if first operand is Not Below second operand (as set by CMP instruction). Unsigned. Algorithm: if CF = 0 then jump Short Jump if first operand is Not Below and Not Equal to second operand (as set by CMP instruction). Unsigned. Algorithm: if (CF = 0) and (ZF = 0) then jump Short Jump if Carry flag is set to 0. Algorithm: if CF = 0 then jump
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ JNE
label
Short Jump if first operand is Not Equal to second operand (as set by CMP instruction). Signed/Unsigned. Algorithm: if ZF = 0 then jump
JNG
label
Short Jump if first operand is Not Greater then second operand (as set by CMP instruction). Signed. Algorithm: if (ZF = 1) and (SF <> OF) then jump
JNGE
label
Short Jump if first operand is Not Greater and Not Equal to second operand (as set by CMP instruction). Signed. Algorithm: if SF <> OF then jump
JNL
label
Short Jump if first operand is Not Less then second operand (as set by CMP instruction). Signed. Algorithm: if SF = OF then jump
JNLE
label
Short Jump if first operand is Not Less and Not Equal to second operand (as set by CMP instruction). Signed. Algorithm: if (SF = OF) and (ZF = 0) then jump jump
JNO
label
Short Jump if Not Overflow. Algorithm: if OF = 0 then jump
JNP
label
Short Jump if No Parity (odd). Only 8 low bits of result are checked. Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm: if PF = 0 then jump
JNS
label
Short Jump if Not Signed (if positive). Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm: if SF = 0 then jump
JNZ
label
Short Jump if Not Zero (not equal). Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm: if ZF = 0 then jump
JO
label
Short Jump if Overflow. Algorithm: if OF = 1 then jump
JP
label
Short Jump if Parity (even). Only 8 low bits of result are checked. Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm: if PF = 1 then jump
JPE
label
Short Jump if Parity Even. Only 8 low bits of result are checked. Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm: if PF = 1 then jump
JPO
label
Short Jump if Parity Odd. Only 8 low bits of result are checked. Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm: if PF = 0 then jump
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ JS
label
Short Jump if Signed (if negative). Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm: if SF = 1 then jump
JZ
label
Short Jump if Zero (equal). Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm: if ZF = 1 then jump
LAHF
No operands
Load AH from 8 low bits of Flags register. Algorithm: AH = flags register AH bit: 7
Copy operand2 to operand1. The MOV instruction cannot: set the value of the CS and IP registers. copy value of one segment register to another segment register (should copy to general register first). copy immediate value to segment register (should copy to general register first). Algorithm: operand1 = operand2
MOVSB
No operands
Copy byte at DS:[SI] to ES:[DI]. Update SI and DI. Algorithm: ES:[DI] = DS:[SI] if DF = 0 then SI = SI + 1 DI = DI + 1 else SI = SI - 1 DI = DI - 1
MOVSW
No operands
Copy word at DS:[SI] to ES:[DI]. Update SI and DI. Algorithm: ES:[DI] = DS:[SI] if DF = 0 then SI = SI + 2 DI = DI + 2 else SI = SI - 2 DI = DI - 2
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ MUL
REG memory
Unsigned multiply. Algorithm: when operand is a byte: AX = AL * operand. when operand is a word: (DX AX) = AX * operand. C Z S O P A r ? ? r ? ? CF=OF=0 when high section of the result is zero.
NEG memory
REG Makes operand negative (two's complement). Negate. Algorithm: Invert all bits of the operand Add 1 to inverted operand C Z S O P A r r r r r r
NOP
No operands No Operation. Algorithm: Do nothing
NOT memory
REG each bit of the operand. Invert Algorithm: if bit is 1 turn it to 0. if bit is 0 turn it to 1.
Logical OR between all bits of two operands. Result is stored in first operand. C Z S O P A 0 r r 0 r ?
Output from AL or AX to port. First operand is a port number. If required to access port number over 255 - DX register should be used. Get 16 bit value from the stack. Algorithm: operand = SS:[SP] (top of the stack) SP = SP + 2
POPA
No operands
Pop all general purpose registers DI, SI, BP, SP, BX, DX, CX, AX from the stack. SP value is ignored, it is Popped but not set to SP register).
Note: this instruction works only on Algorithm: POP DI POP SI
80186 CPU
and later!
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ POP BP POP xx (SP value ignored) POP BX POP DX POP CX POP AX POPF
No operands
Get flags register from the stack. Algorithm: flags = SS:[SP] (top of the stack) SP = SP + 2 C Z S O P A popped
PUSH
REG SREG memory immediate
Store 16 bit value in the stack.
Note: PUSH immediate works only on 80186 CPU and later! Algorithm: SP = SP - 2 SS:[SP] (top of the stack) = operand
PUSHA
No operands
Push all general purpose registers AX, CX, DX, BX, SP, BP, SI, DI in the stack. Original value of SP register (before PUSHA) is used. Note: this instruction works only on 80186 CPU and later! Algorithm: PUSH AX PUSH CX PUSH DX PUSH BX PUSH SP PUSH BP PUSH SI PUSH DI
PUSHF
No operands
Store flags register in the stack. Algorithm: SP = SP - 2 SS:[SP] (top of the stack) = flags
Rotate operand1 left through Carry Flag. The number of rotates is set by operand2. When immediate is greater then 1, assembler generates several RCL xx, 1 instructions because 8086 has machine code only for this instruction (the same principle works for all other shift/rotate instructions). Algorithm: shift all bits left, the bit that goes off is set to CF and previous value of CF is inserted to the right-most position. C O r r OF=0 if first operand keeps original sign.
Rotate operand1 right through Carry Flag. Fla g. The number of rotates is set by operand2. Algorithm: shift all bits right, the bit that goes off is set to CF and previous value of CF is inserted to the left-most position. C O r r OF=0 if first operand keeps original sign.
REP
chain instruction
Repeat following MOVSB, MOVSW, LODSB, LODSW, STOSB, STOSW instructions CX times. Algorithm: check_cx: if CX <> 0 then do following chain instruction CX = CX - 1 go back to check_cx else exit from REP cycle Z r
REPE
chain instruction
Repeat following CMPSB, CMPSW, SCASB, SCASW instructions while ZF = 1 (result is Equal), maximum CX times. Algorithm: check_cx: if CX <> 0 then do following chain instruction CX = CX - 1 if ZF = 1 then go back to check_cx else exit from REPE cycle else exit from REPE cycle Z r
REPNE
chain instruction
Repeat following CMPSB, CMPSW, SCASB, SCASW instructions while ZF = 0 (result is Not Equal), maximum CX times. Algorithm: check_cx: if CX <> 0 then do following chain instruction CX = CX - 1 if ZF = 0 then go back to check_cx else exit from REPNE cycle else exit from REPNE cycle Z r
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ REPNZ
chain instruction
Repeat following CMPSB, CMPSW, SCASB, SCASW instructions while ZF = 0 (result is Not Zero), maximum CX times. Algorithm: check_cx if CX <> 0 then do following chain instruction CX = CX - 1 if ZF = 0 then go back to check_cx else exit from REPNZ cycle else exit from from REPNZ REPNZ cycle Z r
REPZ
chain instruction
Repeat following CMPSB, CMPSW, SCASB, SCASW instructions while ZF = 1 (result is Zero), maximum CX times. Algorithm: check_cx if CX <> 0 then do following chain instruction CX = CX - 1 if ZF = 1 then go back to check_cx else exit from REPZ cycle else exit from from REPZ REPZ cycle Z r
Return from near procedure. Algorithm: Pop from stack → IP if immediate operand is present: SP = SP + operand Return from Far procedure. Algorithm: Pop from stack → CS:IP if immediate operand is present: SP = SP + operand Rotate operand1 left. The number of rotates is set by operand2. Algorithm: shift all bits left, the bit that goes off is set to CF and the same bit is inserted to the right-most position. C O r r OF=0 if first operand keeps original sign. Rotate operand1 right. The number of rotates is set by operand2. Algorithm: shift all bits right, the bit that goes off is set to CF and the same bit is inserted to the left-most position. C O r r OF=0 if first operand keeps original sign.
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ SAHF
SAL
No operands
Store AH register into low 8 bits of Flags register. Algorithm: flags register = AH AH bit: 7 6 5 4 3 2 1 0 [SF] [ZF] [0] [AF] [0] [PF] [1] [CF] bits 1, 3, 5 are reserved. C Z S O P A r r r r r r
memory, immediate REG, immediate
Shift Arithmetic operand1 Left. The number of shifts is set by operand2. Algorithm: Shift all bits left, the bit that goes off is set to CF. Zero bit is inserted to the right-most position. C O r r OF=0 if first operand keeps original sign. Shift Arithmetic operand1 Right. The number of shifts is set by operand2. Algorithm: Shift all bits right, the bit that goes off is set to CF. The sign bit that is inserted to the left-most position has the same value as before shift. C O r r OF=0 if first operand keeps original sign. Subtract with Borrow. Algorithm: operand1 = operand1 - operand2 - CF
Compare bytes: AL from ES:[DI]. Algorithm: ES:[DI] - AL set flags according to result: OF, SF, ZF, AF, PF, CF if DF = 0 then DI = DI + 1 else DI = DI - 1 C Z S O P A r r r r r r
SCASW
No operands
Compare words: AX from ES:[DI]. Algorithm: ES:[DI] - AX set flags according to result: OF, SF, ZF, AF, PF, CF if DF = 0 then DI = DI + 2 else DI = DI - 2 C Z S O P A r r r r r r
Phụ l ục 2 – T ậ p l ệnh 8086 đầ y đủ SHL
memory, immediate REG, immediate
Shift operand1 Left. The number of shifts is set by operand2. Algorithm: Shift all bits left, the bit that goes off is set to CF.
memory, CL REG, CL
SHR
STC
memory, immediate REG, immediate
Zero bit is inserted to the right-most position. C O r r OF=0 if first operand keeps original sign . Shift operand1 Right. The number of shifts is set by operand2.
memory, CL REG, CL
Algorithm: Shift all bits right, the bit that goes off is set to CF. Zero bit is inserted to the left-most position. C O r r OF=0 if first operand keeps original sign .
No operands
Set Carry flag. Algorithm: CF = 1
STD
No operands
Set Direction flag. SI and DI will be decremented by chain instructions: CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, STOSB, STOSW. Algorithm: DF = 1
STI
No operands
Set Interrupt enable flag. This enables hardware interrupts. Algorithm: IF = 1
STOSB
No operands
Store byte in AL into ES:[DI]. Update DI. Algorithm: ES:[DI] = AL if DF = 0 then DI = DI + 1 else DI = DI - 1
STOSW
No operands
Store word in AX into ES:[DI]. Update DI. Algorithm: ES:[DI] = AX if DF = 0 then DI = DI + 2 else DI = DI - 2
Logical AND between all bits of two operands for flags only. These flags are effected: ZF, SF, PF. Result is not stored anywhere. C Z S O P 0 r r 0 r Exchange values of two operands. Algorithm: operand1 < - > operand2 Translate byte from table. Copy value of memory byte at DS:[BX + unsigned AL] to AL register. Algorithm: AL = DS:[BX DS:[BX + unsigned unsigned AL]