CHƯƠNG TRÌNH DỊCH HỢP NGỮ... Biến và hằng khái báo trong một chương trình hợp ngữ cũng có các chức năng giốngnhư trong một chương trình ngôn ngữ cấp cao... Tuy nhiê
Trang 1CHƯƠNG IV: LẬP TRÌNH BẰNG HỢP NGỮ.
4.1 CHƯƠNG TRÌNH DỊCH HỢP NGỮ.
Như đã biết vi xử lý là một IC số hoạt động theo chương trình Chương trình là tậphợp của các lệnh, mỗi lệnh sẽ thực hiện một chức năng số cơ bản nào đó Hệ thống vixử lý là một hệ thống điện tử số, nên các chương trình cung cấp để nó hoạt động phảiở dưới dạng các mức điện áp cao và thấp, tương ứng với các bit nhị phân 0 và 1.Nhưng nếu chương trình bằng toàn các số 0 và 1 sẽ rất khó nhớ, khó kiểm tra và sửasai đối với người lập trình Để khắc phục tình trạng trên người ta đặt cho mỗi lệnh nhịphân thực hiện một chức năng số cơ bản một tên dễ nhớ hơn, chúng được gọi là mãgợi nhớ Khi lập trình người ta sử dụng các mã gợi nhớ, còn khi cần vi xử lý thực hiệnthì chương trình sẽ được đổi thành các mã nhị phân 0, 1 để nạp vào bộ nhớ của hệthống, công việc này được gọi là hợp dịch (assembler) chương trình Mỗi bộ vi xử lý
ra đời sẽ có một tập lệnh của nó dưới dạng mã gợi nhớ và mã nhị phân tương ứng, vìvậy việc hợp dịch chương trình có thể thực hiện thủ công bằng cách tra bảng lệnh Khimáy tính ra đời để nhanh chóng và chính xác, việc hợp dịch thường được thực hiệnbằng các chương trình viết sẵn, các chương trình này được gọi là các chương trình hợpdịch hay chương trình dịch hợp ngữ, chúng thường được cung cấp từ các hãng phầnmềm, hoặc chính từ các hãng sản xuất vi xử lý
Với máy vi tính, đầu tiên các chương trình cần được soạn thảo bao gồm các lệnh gợinhớ dưới dạng văn bản, bằng bất kỳ một phần mềm soạn thảo văn bản nào, tất nhiênchúng phải theo đúng cú pháp qui định của chương trình hợp dịch Sau đó tập tin vănbản này sẽ được dịch và liên kết bằng các chương trình chuyên dụng để tạo ra các tậptin nhị phân có thể thực hiện trên máy vi tính, hoặc nạp vào bộ nhớ cho các hệ thống vixử lý khác
Thông thường mỗi họ vi xử lý có ít nhất một chương trình hợp dịch, các chương trìnhhợp dịch khác nhau cũng thường có qui định cú pháp khác nhau Ví dụ các vi xử lý họZilog có phần mềm dịch và liên kết là M80 và L80, họ Intel có MASM, LINK vàEXEC2BIN của Microsoft và TASM, TLINK của Borland, họ vi điều khiển 8051 cóM51, L51 và OH… Tuy có qui định cú pháp khác nhau, nhưng cấu trúc các hàng lệnhvà khung chương trình cũng tương đối giống nhau, các lỗi khi soạn thảo sẽ được thôngbáo khi hợp dịch hoặc có thể tìm thấy trong phần trợ giúp của chương trình Sau đâychúng ta sẽ xem xét về các soạn thảo và cấu trúc của một chương trình hợp ngữ viếtcho các chương trình hợp dịch họ Intel TASM và TLINK
4.2 CẤU TRÚC CỦA CHƯƠNG TRÌNH HỢP NGỮ.
4.2.1 Cú pháp các câu lệnh.
Một chương trình hợp ngữ bao gồm các dòng lệnh, một dòng lệnh có thể bao gồm cáclệnh gợi nhớ chỉ thị cho vi xử lý thực hiện một chức năng số nào đó, cũng có thể làmột lệnh giả (Pseudo) chỉ có ý nghĩa sử dụng cho các chương trình dịch Một dònglệnh hợp ngữ có thể có các phần sau:
Nhãn: Mã lệnh Các toán hạng Chú giải
Ví dụ một dòng lệnh với mã gợi nhớ như sau:
Label1: MOV AH,[BX] ; nạp vào AH nội dung ô nhớ có địa chỉ [BX]
Dòng lệnh trên có phần nhãn là Label1, phần mã gợi nhớ là MOV biểu thị lệnh dichuyển dữ liệu, phần các toán hạng là AH và [BX] biểu diễn việc truyền dữ liệu từ ô
Trang 2nhớ có địa chỉ DS:[BX] vào thanh ghi AH, phần chú giải bắt đầu từ sau dấu ‘;’ cho tớihết dòng.
Ví dụ về một dòng lệnh giả hợp ngữ như:
Phần mã lệnh.
Thông thường phần mã lệnh trong bất cứ dòng lệnh nào cũng có chứa các lệnh gợi
nhớ hoặc các lệnh giả hợp ngữ Các lệnh gợi nhớ sẽ được trình hợp dịch chuyển thànhmã máy nhị phân Các lệnh giả chỉ có tác dụng hướng dẫn cho các trình hợp dịch màkhông được dịch ra mã máy trong chương trình
Phần toán hạng.
Đối với các mã lệnh gợi nhớ, phần này chứa các toán hạng của lệnh như đã mô tảtrong các cách định vị địa chỉ Tuỳ theo từng lệnh mà phần toán hạng có thể bao gồm
0, 1 hoặc 2 toán hạng Thông thường khi không có phần toán hạng, thì toán hạng thaotác trong lệnh sẽ được hiểu ngầm, nếu chỉ có một toán hạng nó sẽ được gọi là toánhạng đích, nếu có hai toán hạng sẽ có một toán hạng nguồn và một toán hạng đích Đối với các lệnh giả phần này sẽ chứa các thông tin liên quan đến lệnh giả đó
Phần chú giải.
Phần này được tính bắt đầu từ sau dấu ‘;’ trên một dòng lệnh (có thể không có cácphần khác) Nó cho phép ghi vào các lời giải thích về dòng lệnh hoặc về hoạt động củachương trình, nó giúp ích cho người lập trình dễ nhớ hơn khi đang viết chương trình,hoặc khi đọc lại chương trình Khi hợp dịch các lời giải thích này sẽ không được dịch
ra mã lệnh, có nghĩa là nó không có giá trị gì trong chương trình mã máy
4.2.2 Dữ liệu cho chương trình.
Dữ liệu trong một chương trình hợp ngữ rất đa dạng Các dữ liệu có thể được chodưới dạng hệ nhị phân, thập phân, bát phân hoặc thập lục phân Khi số cho ở hệ nàocần phải có ký tự chỉ thị cho hệ đó ở phía sau: hệ nhị phân là chữ B (Binary), hệ bátphân là chữ O (Octal), hệ 16 là chữ H (Hexadecimal), riêng hệ thập phân có thể khôngcần viết ký tự phía sau Chú ý trong hệ 16, khi các dữ liệu được bắt đầu bằng các ký tựchữ, để phân biệt với các tên hoặc nhãn cần phải viết thêm một số 0 lên phía trước Nếu dữ liệu là một chuỗi ký tự thì chúng phải được để trong dấu nháy, chương trìnhsẽ dịch ra mã ASCII tương ứng của nó Ví dụ dữ liệu 41H sẽ tương ứng với ‘A’
4.2.3 Biến và hằng.
Biến và hằng khái báo trong một chương trình hợp ngữ cũng có các chức năng giốngnhư trong một chương trình ngôn ngữ cấp cao Một biến cần phải được định kiểu bằngcác lệnh giả như:
Trang 3DB (define byte) : định nghĩa biến kiểu byte
DW (define word): định nghĩa biến kiểu từ (hai byte)
DD (define double word): định nghĩa biến từ kép (4 byte)
DT (define ten byte): định nghĩa biến 10 byte
Các biến có thể gán giá trị khởi động hoặc không
Ví dụ dòng lệnh: X1 DB 4 khai báo một biến byte có tên là X1 và giá trị khởi độnglà 4 Nếu dấu ? thay vào vị trí của số 4 thì biến X1 sẽ được dành chỗ trong bộ nhớ,nhưng khi chương trình bắt đầu hoạt động nó sẽ có giá trị bất kỳ do không được gángiá trị khởi động Khai báo hoàn toàn tương tự cho các biến kiểu khác
Biến mảng.
Biến mảng hình thành từ một dãy liên tiếp các phần tử cùng kiểu (byte, từ …), số ônhớ sẽ được dành ra tương ứng với số phần tử của dãy
Ví dụ dòng lệnh: A1 DB 3,5,6,7,8
Khai báo một biến mảng có tên là A1 có giá trị khởi động là 3,5,6,7,8 Phần tử đầutrong mảng là 3 có địa chỉ trùng với A1, phần tử thứ hai sẽ có địa chỉ kế tiếp …
Khi muốn khởi động các phần tử của mảng với cùng một giá trị có thể sử dụng toán tửDUP trong lệnh
Ví dụ dòng lệnh A2 DB 100 DUP (0) sẽ khai báo biến mảng có một trămphần tử đều có giá trị khởi động bằng 0 Khi thế số 0 bằng dấu ? thì một trăm phần tửcủa mảng sẽ không được gán trước giá trị khởi động
Cũng có thể khai báo một biến mảng theo kiểu hỗn hợp bao gồm nhiều toán tử DUP Ví dụ dòng lệnh: M DB 1,2, 2 DUP (8), 3 DUP (4), 9
sẽ hoàn toàn tương đương với dòng lệnh: M DB 1,2,8,8,4,4,4,9
Chú ý trong một số vi xử lý (như của Intel), nếu có một từ trong bộ nhớ thì byte thấpsẽ nằm ở địa chỉ thấp, byte cao nằm ở địa chỉ cao, còn ở một số vi xử lý khác(Motorola) lại có cách cất dữ liệu theo thứ tự ngược lại
Biến kiểu xâu ký tự.
Biến kiểu xâu ký tự là trường hợp đặc biệt của biến mảng, trong đó các phần tử củamảng là các ký tự Một xâu ký tự có thể định nghĩa bằng các ký tự hoặc bằng mãASCII tương ứng của chúng Các dòng lệnh sau cùng định nghĩa một xâu ký tự nhưnggán cho chúng các tên khai báo cho chúng khác nhau:
STR2 DB 73h, 74h, 72h, 69h, 6Eh, 67hSTR3 DB 73h, 74h, 'r', 'i', 'n', 67h
Hằng có tên.
Các hằng số trong các chương trình hợp ngữ cung thường được gán tên để dễ nhớ vàdễ đọc hơn Hằng có thể là kiểu số hoặc kiểu ký tự Việc gán tên cho hằng được thựchiện bằng lệnh EQU (equate) như sau:
CR EQU 0Dh ; CR là ký tự về đầu hàng (Carriage return)
LF EQU 0Ah ; LF là ký tự xuống hàng (Line Feed) Hằng cũng có thể là một chuỗi ký tự, ví dụ có thể tên cho một chuỗi ký tự sau đó sửdụng để định nghĩa cho một biến mảng khác
Trang 4Do EQU là một lệnh giả không dành chỗ của bộ nhớ cho tên hằng nên có thể đặt dònglệnh khai báo này ở bất kỳ vị trí nào trong chương trình Tuy nhiên trong thực tế người
ta thường đặt chúng trong phần khai báo dữ liệu
4.3 LẬP TRÌNH VÀ CHO CHẠY MỘT CHƯƠNG TRÌNH HỢP NGỮ.
4.3.1 Khung của một chương trình hợp ngữ.
Một chương trình hợp ngữ chạy trên các hệ thống vi xử lý họ Intel bao gồm các đoạnvùng nhớ khác nhau để chứa mã lệnh, dữ liệu và ngăn xếp Các đoạn này sẽ được khaibáo bằng các lệnh giả hợp ngữ theo đúng cú pháp của trình biên dịch tạo thành khungcủa chương trình Sau đây chúng ta sẽ xem xét các từ khoá tối thiểu trong một chươngtrình hợp ngữ với các trình hợp dịch MASM và TASM
Khai báo qui mô sử dụng bộ nhớ.
Dung lượng bộ nhớ dành cho đoạn mã lệnh và đoạn dữ liệu được xác định nhờ lệnh
giả '.MODEL', lệnh này phải luôn đặt trước tất cả các lệnh khác trong chương trình.
Cú pháp lệnh: MODEL Kiểu kích thước bộ nhớ
Có nhiều kiểu kích thước bộ nhớ cho các chương trình với đòi hỏi dung lượng bộ nhớkhác nhau Với người mới lập trình thông thường các đoạn mã lệnh và dữ liệu đềukhông vượt quá 64KB nên chọn kiểu nhỏ (Small) hoặc kiểu hẹp (Tiny) Ngoài ra còncó các kiểu kích thước bộ nhớ khác như liệt kê trong bảng sau:
Kiểu kích thước
Tiny (hẹp) Mã lệnh và dữ liệu trong cùng một đoạn 64 KB
Small (nhỏ) Mã lệnh nằm trong một đoạn, dữ liệu nằm trong một đoạn
Medium (trung
bình) Mã lệnh không nằm trong một đoạn, dữ liệu nằm trong mộtđoạn.Compact (gọn) Mã lệnh nằm trong một đoạn, dữ liệu không nằm trong một
đoạn
Large (lớn) Mã lệnh không nằm trong một đoạn, dữ liệu không nằm trong
một đoạn, các mảng không lớn hơn 64KB
Huge (đồ sộ) Mã lệnh không nằm trong một đoạn, dữ liệu không nằm trong
một đoạn, các mảng có thể lớn hơn 64KB
Khai báo ngăn xếp.
Khai báo ngăn xếp để dành ra một vùng nhớ đủ lớn cho ngăn xếp Việc khai báo ngănxếp được thực hiện bằng lệnh giả sau:
.Stack Kích thước
Kích thước sẽ xác định số byte dành cho ngăn xếp, nếu không có khai báo kích thước
chương trình dịch sẽ tự động gán cho ngăn xếp kích thước 1KB, đây là một kích thướcquá lớn đối với các ứng dụng thông thường Các chương trình thông thường có thểkhai báo ngăn xếp từ 100 tới 256 byte Chú ý với các chương trình khai báo kiểu bộnhớ hẹp (.Model Tiny) sẽ không có khai báo ngăn xếp
Khai báo dữ liệu.
Đoạn dữ liệu sẽ chứa toàn bộ các khai báo về biến cho chương trình, các hằng cũng cóthể được khai báo trong phần này Việc khai báo dữ liệu được thực hiện bằng lệnhgiả DATA Các chương trình với kiểu Tiny cũng không có khai báo này
Khai báo đoạn mã.
Trang 5Đoạn mã là nơi chứa các lệnh gợi nhớ của chương trình Việc khai báo đoạn mã đượcthực hiện bằng lệnh giả CODE Chương trình sẽ thực hiện lệnh đầu tiên nằm saulệnh CODE sau đó là các lệnh kế tiếp tùy theo cấu trúc điều khiển của nó Các chươngtrình con cũng được viết trong đoạn này, nhưng chú ý rằng chúng chỉ được chuyển tớibằng các lệnh gọi (CALL).
Khung của chương trình hợp ngữ để dịch ra dạng EXE.
Từ các khai báo của chương trình đã trình bày ở trên có thể xây dựng một khung tổngquát cho các chương trình hợp ngữ với kiểu kích thước bộ nhớ nhỏ, các chương trìnhloại này sau khi hợp dịch sẽ tạo ra một tập tin có thể thực hiện được (executable) vớiđuôi EXE Khung các chương trình loại này biểu diễn như sau:
; các chương trình con để tại phần này
End Main ; kết thúc toàn bộ chương trình
Khi một chương trình EXE được nạp vào bộ nhớ để thực hiện, DOS sẽ tạo ra mộtmảng 256 byte gọi là đoạn mào đầu chương trình (Program Segment Prefix- PSP)dùng để chứa các thông tin liên quan đến chương trình và đặt nó ngay phía trước vùngnhớ chứa các mã của chương trình DOS cũng cung cấp các thông số liên quan đến cácthanh ghi đoạn DS và ES Do đó DS và ES không chứa giá trị địa chỉ của đoạn dữ liệucủa chương trình, vì thế phải có các lệnh khởi động cho chúng
Khung chương trình hợp ngữ dịch ra dạng COM.
Trong chương trình EXE có đầy đủ các đoạn, với chương trình COM các đoạn ngănxếp, dữ liệu và mã lệnh sẽ được gộp chung Như vậy các chương trình COM sẽ ngắngọn và đơn giản hơn, nó sẽ tiết kiệm cả về thời gian thực hiện, dung lượng bộ nhớ vàdung lượng lưu trữ chương trình trên đĩa Sau đây là khung một chương trình hợp ngữdịch ra dạng COM:
Trang 6; Các lệnh của chương trình chính để tại đây
INT 20H ; trở về DOS
Chương trình COM sẽ bị các hạn chế gây ra bởi dung lượng cực đại dành cho toàn bộchương trình gói gọn trong đoạn 64KB, nên chúng chỉ sử dụng cho các ứng dụngkhông lớn lắm Mặt khác chương trình cũng chỉ được sử dụng một ngăn xếp có dunglượng hạn chế, nếu có quá nhiều dữ liệu được nạp vào ngăn xếp sẽ làm mất các mãlệnh của chương trình
Cách tạo và thực hiện một chương trình hợp ngữ trên máy vi tính.
Máy vi tính IBM PC là tạo và thực hiện các chương trình hợp ngữ cho họ Intel Cácbước để thực hiện công việc này như sau:
- Dùng các phần mềm soạn thảo văn bản (SK, NC…) để soạn thảo các chương trìnhnguồn được mặc định có đuôi ASM
- Dùng các chương trình hợp dịch MASM hoặc TASM để dịch tập tin nguồn ASM
ra dạng mã máy có đuôi OBJ Các dòng lệnh dưới dấu nhắc DOS như sau:
Với MASM: C:\MASM filename.ASM
Với TASM: C:\TASM filename.ASM
- Dịch và liên kết các tập tin OBJ thành tập tin có thể chạy được:
Với MASM dùng LINK để liên kết các tập tin OBJ tạo ra chương trình EXE, nếuchương trình nguồn viết dưới dạng dịch ra EXE thì tập tin này có thể thực hiện được.Nếu viết dưới dạng COM thì cần phải sử dụng EXE2BIN để dịch ra tập tin COM mớicó thể chạy được
Với TASM dùng TLINK để liên kết và tạo ra tập tin chạy EXE, nếu viết dướidạng COM phải dùng dòng lệnh TLINK/t để tạo ra tập tin COM
4.4 Các cấu trúc lập trình cơ bản.
Các lệnh của một ngôn ngữ, nhất là các lệnh hợp ngữ thường chỉ thực hiện các tác vụ
cơ bản Vì vậy để viết một chương trình người ta thường chia nó ra thành các khốichức năng nhỏ hơn, các khối chức năng nhỏ này lại chia thành các khối chức năng nhỏhơn nữa Việc phân chia này được thực hiện cho tới khi mỗi khối chức năng trở nênđơn giản và dễ dàng thực hiện bằng các lệnh
Các khối chức năng thành phần thường được thực hiện bằng các cấu trúc lập trình cơbản Phương pháp chia chương trình thành các khối chức năng thành phần như trênlàm cho chương trình trở nên có cấu trúc, dễ dàng trong việc hiệu chỉnh, cải tiến và lậptài liệu lưu trữ cho nhiều người sử dụng Có ba cấu trúc lập trình cơ bản thường đượcsử dụng khi giải quyết các công việc khác nhau là :
+ Cấu trúc tuần tự
+ Cấu trúc lựa chọn
+ Cấu trúc lặp
Đặc điểm chung của tất cả các cấu trúc lập trình cơ bản là tính cấu trúc: tức là chỉ cómột lối vào và một lối ra cho cấu trúc đó Các cấu trúc này thường được chuẩn hoá ởcác ngôn ngữ cấp cao, trong phần này sẽ mô tả việc thực hiện chúng trong hợp ngữ
Trang 74.4.1 Cấu trúc tuần tự.
Cấu trúc tuần tự là cấu trúc thông dụng và đơn giản nhất Trong cấu trúc này các lệnh
được thực hiện một cách tuần tự, lệnh nọ kế tiếp lệnh kia Sau khi thực hiện xong lệnhcuối cùng thì công việc phải được hoàn tất
Ví dụ đoạn chương trình tính giá trị của biểu thức b2 – 4ac với a, b, c là các biến 8 bitnằm trong các thanh ghi BH, BL, CH có thể thực hiện như sau:
4.4.2 Cấu trúc lựa chọn.
Cấu trúc IF – THEN.
Ngữ pháp: IF Điều kiện THEN Công việc.
Trong cấu trúc này nếu điều kiện thoả công việc sẽ được thực hiện, nếu không côngviệc sẽ bị bỏ qua Trong hợp ngữ cấu trúc này có thể thực hiện bằng các lệnh nhảy cóđiều kiện Giải thuật của cấu trúc biểu diễn trên hình 4.1
Ví dụ : Viết đoạn chương trình xoá AH về 0 khi giá trị của nó lớn hơn 03
CMP AH,03JNA THOATMOV AH,0THOAT:
Cấu trúc IF – THEN – ELSE.
Ngữ pháp: IF Điều kiện THEN Công việc1 ELSE Công việc 2.
Giải thuật của cấu trúc trình bày trên hình 4.2 trong cấu trúc này nếu thỏa điều kiệnthì công việc 1 được thực hiện, nếu không thì công việc 2 được thực hiện Trong hợpngữ điều này tương đương với việc sử dụng các lệnh nhảy có điều kiện và không điềukiện đến các nhãn khác nhau
Công việc
Điều kiện
Đúng Sai
Hình 4.1 Giải thuật cấu trúc IF – THEN
Trang 8Ví dụ : Tìm số nhỏ hơn trong hai số chứa trong AH và BH gán cho AL.
CMP AH,BH;AH<BH?
JNL GAN ; Nếu đúng gán AH cho AL
MOV AL,BH ; Nếu không lấy số nhỏ hơn trong BH vào AH
JMP RA
GAN:MOV AL,AH ; AL sẽ chứa số nhỏ hơn
RA:
Cấu trúc CASE.
Ngữ pháp: CASE Biểu thức
Giá trị 1: Công việc 1 Giá trị 2: Công việc 2
……
Giá trị N: Công việc N
END CASEGiải thuật của cấu trúc biểu diễn trên hình 4.3 Trong cấu trúc này nếu biểu thức có giátrị 1 thì công việc 1 được thực hiện, nếu biểu thức có giá trị 2 công việc 2 được thựchiện … Trong hợp ngữ có thể sử dụng các lệnh nhảy có điều kiện và không có điềukiện để chuyển điều khiển của chương trình tới các nhãn khác nhau
Ví dụ : Xét giá trị của AX để thực hiện các công việc khác nhau:
Trang 94.4.3 Cấu trúc lặp.
Cấu trúc FOR – DO.
Ngữ pháp: FOR Số lần lặp DO Công việc.
Giải thuật của cấu trúc trình bày trên hình 4.4 Trong cấu trúc này công việc sẽ đượcthực hiện nhiều lần (bằng số lần lặp được khai báo) Trong hợp ngữ công việc này cóthể dùng lệnh LOOP, hoặc cặp lệnh giảm (DEC) và nhảy khi chưa bằng 0
Ví dụ : viết chương trình tính tổng các số tự nhiên từ 1 tới 99.
MOV AX,0 ;Khởi động tổng bằng 0
MOV DX,1 ; Số thứ nhất
MOV CX,99 ; Tất cả bao gồm 99 số
LAP: ADD AX,DX ; Tổng := Tổng + 1
INC DX ; Tăng để có số tiếp theo
LOOP LAP ; Lặp cho tới khi hết 99 số
Khởi động bộ đếm
Giảm bộ đếm
Trang 10 Cấu trúc lặp WHILE – DO.
Ngữ pháp: WHILE Điều kiện DO Công việc.
Giải thuật của cấu trúc trình bày trên hình 4.5 Trước hết điều kiện sẽ được kiểm tra,công việc sẽ được lặp lại khi điều kiện còn đúng Trong hợp ngữ cấu trúc này có thểthực hiện bằng cách sử dụng lệnh CMP hoặc một lệnh nào đó để kiểm tra điều kiện,sau đó dùng lệnh nhảy có điều kiện để thoát khỏi vòng lặp
Ví dụ :Đọc và hiển thị các ký tự nhập từ bàn phím cho đến khi gặp ESC thì dừng,
đếm số ký tự đọc được
XOR CX,CX ; Xoá số đếm
MOV AH,1 ; Hàm đọc ký tự từ bàn phím của INT 21H có hiện
TIEP:INT 21H ; gọi ngắt 21H AL chứa mã ký tự
CMP AL,27H ;Kiểm tra ký tự vừa hiện có phải là ESC không
JE RA
INC CX ; tăng số đếm
JMP TIEP
RA:
Cấu trúc lặp REPEAT – UNTIL.
Ngữ pháp: REPEAT công việc UNTIL điều kiện.
Giải thuật của cấu trúc trình bày trên hình trên hình 4.6 Trong cấu trúc này công việcđược thực hiện trước ít nhất một lần, sau đó điều kiện sẽ được kiểm tra Nếu điều kiệnthoả công việc tiếp tục được lặp lại Trong hợp ngữ điều kiện thường được kiểm trabằng lệnh CMP, và công việc sẽ được tiếp tục bằng một lệnh nhảy có điều kiện
Ví dụ : Xác định xem có bao nhiêu số tự nhiên bắt đầu từ 1 có tổng nhỏ hơn 1000 ?
MOV AX,0 ;khởi động tổng bằng 0
MOV DX,1 ;khởi động số đầu tiên để cộng
TIEP: ADD AX,DX ;cộng để có tổng
INC DX ;tăng để có số tiếp theo và cũng chính là số đếm
CMP AX,1000 ; tổng còn nhỏ hơn 1000 thì cộng tiếp
Hình 4.5 Giải thuật cấu trúc WHILE - DO.
Trang 114.5. Một số chương trình mẫu tiêu biểu.
Khi lập trình bằng hợp ngữ trên các máy vi tính IBM PC, để đơn giản có thể sử dụng
các chương trình điều khiển thiết bị sẵn có của BIOS và DOS Ít nhất trước hết cũngcần chấp nhận các thủ tục có sẵn này để sử dụng được các thiết bị giao tiếp cơ bản vớimáy tính như bàn phím, màn hình trong bước đầu lập trình Còn khi đã có đầy đủ cáckiến thức về hợp ngữ, cũng như về cấu trúc phần cứng máy tính chúng ta hoàn toàn cóthể thực hiện các chương trình điều khiển các thiết bị bằng các lệnh gợi nhớ căn bảntrong tập lệnh, hoặc viết các chương trình điều khiển thiết bị cho các hệ thống phầncứng của riêng mình
BIOS (Base Input Output System) là chương trình trong bộ nhớ ROM, nó sẽ đượcthực hiện trước tiên ngay khi khởi động máy BIOS sẽ kiểm tra các thiết bị cơ bảntrong hệ thống sau đó nó chuyển điều khiển cho hệ điều hành Hệ điều hành thôngdụng khi máy tính mới ra đời là DOS (Disk Operation System) Trong DOS và BIOScó các chương trình con viết sẵn cho việc điều khiển các thiết bị Để sử dụng chúngtrong chương trình hợp ngữ chúng ta dùng lời gọi ngắt mềm (INT) kèm theo số hiệungắt Các số hiệu ngắt được qui định sẵn cho các thiết bị, mỗi ngắt sẽ có các qui địnhkhác nhau về các biến vào và ra khi thực hiện Sau đây là mô tả về một số ngắt thườngsử dụng trong chương trình hợp ngữ
- Ngắt 20H dành riêng để kết thúc chương trình loại COM Hàm này ra lệnh cho hệ
điều hành kết thúc chương trình đang chạy và chuyển điều khiển về cho chương trìnhgọi
- Ngắt 21H:
Hàm 01H: đọc một ký tự từ bàn phím
Một ký tự sẽ được đọc vào từ bàn phím và hiện lên màn hình Nếu tại thời điểm gọihàm chưa có ký tự sẵn sàng, thì hàm sẽ đợi cho tới khi có phím được nhấn
Vào: AH = 01
Ra: AL chứa mã ASCII của phím nhấn
Khi nhận được các ký tự có mã mở rộng AL = 0 Lúc này có thể gọi hàm một lần nữađể đọc được mã mở rộng
Khi ký tự vào là Ctrl – C (mã ASCII là 3) ngắt 23H sẽ được gọi trả điều khiển vềDOS
Ngoài AL, nội dung các thanh ghi khác không bị thay đổi sau khi gọi hàm
Công việc
Điều kiện
Sai Đúng
Hình 4.6 Giải thuật cấu trúc REPEAT – UNTIL.