Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 53 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
53
Dung lượng
450,33 KB
Nội dung
Chơng 4 Lập trình bằng hợp ngữ với 8088 Mở đầu Trong chơng trớc ta đã giới thiệu khá tỉ mỉ tập lệnh của bộ vi xử lý 8086/88. Trong chơng ny ta sẽ giới thiệu cách lập trình dùng hợp ngữ trên các máy IBM PC hoặc tơng thích với IBM PC (từ nay đợc gọi chung l IBM PC), vì đó l môi trờng phổ thông v tiện lợi nhất để tạo ra v thử nghiệm các chơng trình viết bằng hợp ngữ. Nói nh vậy l vì a) về phần cứng, máy IBM PC có cấu trúc khá tiêu biểu của một hệ vi xử lý, b) về phần mềm, ta có thể tận dụng các chơng trình soạn thảo văn bản hoặc rất nhiều chức năng sẵn có khác của máy IBM PC cho các chơng trình của ta thông qua các dịch vụ (các chơng trình con phục vụ ngắt) của các ngắt của DOS (Disk Operating System, hệ điều hnh) v của BIOS (Basic Input Output System, hệ thống vo ra cơ sở). Tuy nhiên, một hệ thống vi xử lý cụ thể có thể có kết cấu khác một máy vi tính IBM PC, do đó trong khi lập trình cho các hệ thống giả định kiểu nh vậy, sẽ có những chơng trình m ta không thể đem thử nghiệm trên máy IBM PC đợc. Các chơng trình ny sẽ đợc đánh dấu cẩn thận bằng dấu để ta không đem chúng cho chạy thử trên IBM PC nhằm tránh các hậu quả đáng tiếc có thể xảy ra. Ta sẽ sử dụng chơng trình dịch hợp ngữ MASM 5.0 (Macro assembler phiên bản 5.0) của Microsoft với cách định nghĩa đoạn đơn giản v chế độ bộ nhớ nhỏ. Điều ny hon ton đủ để đáp ứng các yêu cầu nảy sinh khi ta thực hiện các chơng trình đơn giản ban đầu. Ta cũng có thể dùng chơng trình dịch hợp ngữ TASM 4.0 (Turbo 97 assembler phiên bản 4.0) của Borland International để thử nghiệm các chơng trình hợp ngữ. 1. Giới thiệu khung của chơng trình hợp ngữ 1.1. Cú pháp của chơng trình hợp ngữ Trớc khi trình by cách lập trình bằng hợp ngữ ta phải tìm hiểu qua cú pháp của ngôn ngữ ny, bởi vì nh ta đã biết, để lm việc đợc với bất kỳ một ngôn ngữ lập trình no ta cũng cần nắm đợc cú pháp của nó. Chơng trình dới dạng hợp ngữ m ta viết ra, nếu đúng về cú pháp, sẽ đợc chơng trình dịch hợp ngữ MASM dịch ra mã máy, từ chơng trình mã máy ny ta có thể tạo ra các chơng trình chạy (thực hiện) đợc ngay bằng cách dịch tiếp ra các tệp có đuôi EXE hoặc COM. Do vậy khi viết một chơng trình hợp ngữ ta phải tuân thủ những quy tắc cú pháp nhất định để chơng trình dịch MASM có thể hiểu v dịch đợc nó. 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ể l một lệnh thật dới dạng ký hiệu (symbolic), m đôi khi còn đợc gọi l dạng gợi nhớ (mnemonic) của bộ vi xử lý, hoặc một hớng dẫn cho chơng trình dịch (assembler directive). Lệnh gợi nhớ sẽ đợc dịch ra mã máy còn hớng dẫn cho chơng trình dịch thì không đợc dịch, vì nó chỉ có tác dụng chỉ dẫn riêng cho chơng trình dịch thực hiện công việc. Ta có thể viết các dòng lệnh ny bằng chữ hoa hoặc chữ thờng v chúng sẽ đợc coi l tơng đơng vì đối với các dòng lệnh chơng trình dịch không phân biệt kiểu chữ. Một dòng lệnh của chơng trình hợp ngữ có thể có những trờng sau (không nhất thiết phải có đủ hết tất cả các trờng): Tên Mã lệnh Các toán hạng Chú giải Một ví dụ dòng lệnh gợi nhớ: TIEP: MOV AH,[BX][SI] ; nạp vo AH nội dung ô ; nhớ có địa chỉ DS:(BX+SI) Trong ví dụ trên, tại trờng tên ta có nhãn TIEP, tại trờng mã lệnh ta có lệnh MOV, tại trờng toán hạng ta có các thanh ghi AH, BX v SI v phần chú giải gồm có các dòng ; nạp vo AH nội dung ô ; nhớ có địa chỉ DS:(BX+SI) Một ví dụ khác l các dòng lệnh với các hớng dẫn cho chơng trình dịch: 98 MAIN PROC v MAIN ENDP Trong ví dụ ny, ở trờng tên ta có tên thủ tục l MAIN, ở trờng mã lệnh ta có các lệnh giả PROC v ENDP. Đây l các lệnh giả dùng để bắt đầu v kết thúc một thủ tục có tên l MAIN. Trờng tên Trờng tên chứa các nhãn, tên biến hoặc tên thủ tục. Các tên v nhãn ny sẽ đợc chơng trình dịch gán bằng các địa chỉ cụ thể của ô nhớ. Tên v nhãn có thể có độ di 1 31 ký tự, không đợc chứa dấu cách v không đợc bắt đầu bằng số. Các ký tự đặc biệt khác có thể dùng trong tên l ? . @ _ $ %. Nếu dấu chấm('.') đợc dùng thì nó phải đợc đặt ở vị trí đầu tiên của tên. Nói chung ta cứ đặt các tên bình thờng v có ý nghĩa l sẽ ít khi bị sai. Một nhãn thờng kết thúc bằng dấu hai chấm (:). Trờng mã lệnh Trong trờng mã lệnh nói chung sẽ có các lệnh thật hoặc lệnh giả. Đối với các lệnh thật thì trờng ny chứa các mã lệnh gợi nhớ. Mã lệnh ny sẽ đợc chơng trình dịch dịch ra mã máy. Đối với các hớng dẫn chơng trình dịch thì trờng ny chứa các lệnh giả v sẽ không đợc dịch ra mã máy. Trờng toán hạng Đối với một lệnh thật thì trờng ny chứa các toán hạng của lệnh. Tuỳ theo từng loại lệnh m ta có thể có 0, 1 hoặc 2 toán hạng trong một lệnh. Trong trờng hợp các lệnh với 1 toán hạng thông thờng ta có toán hạng l đích hoặc gốc, còn trong trờng hợp lệnh với 2 toán hạng thì ta có 1 toán hạng l đích v 1 toán hạng l gốc. Đối với hớng dẫn chơng trình dịch thì trờng ny chứa các thông tin khác nhau liên quan đến các lệnh giả của hớng dẫn. Trờng chú giải Lời giải thích ở trờng chú giải phải đợc bắt đầu bằng dấu chấm phẩy(;). Trờng chú giải ny đợc dnh riêng cho ngời lập trình để ghi các lời giải thích cho các lệnh của chơng trình với mục đích giúp cho ngời đọc chơng trình dễ hiểu các thao tác của chơng trình hơn. Lời chú giải cũng có lợi ngay cho chính tác giả của nó vì sau một thời gian không xem đến chơng trình thì mọi việc lại nh mới. Khi đọc thấy dấu chấm phẩy, chơng trình dịch bỏ qua không dịch từ phần ny trở đi. Chính 99 vì vậy ngời ta cũng thờng hay dùng dấu ny để loại bỏ một dòng lệnh no đó trong chơng trình. Thông thờng lời chú giải cần phải mang đủ thông tin để giải thích về thao tác của lệnh trong hon cảnh cụ thể v nh thế thì mới có ích cho ngời đọc. Đối với những ngời mới lập trình bằng hợp ngữ còn thiếu kinh nghiệm thì lời chú giải còn phản ảnh sự hiểu biết về vấn đề phải giải quyết của họ, vì nếu không hiểu thấu đáo vấn đề thì không thể đa ra lời chú giải tốt đợc. Tóm lại l ta nên tránh việc đa ra một lời chú giải vô bổ (không mang thông tin) kiểu nh: MOV BX,0 ; đa 0 vo thanh ghi BX vì tự thân lệnh gợi nhớ đó đã có ý nghĩa nh lời giải thích rồi. Nếu trong bi toán cụ thể thanh ghi BX đợc chọn dùng lm tổng tích luỹ cho một tính toán nhất định, ta có thể có lời chú giải bổ ích hơn nh sau: MOV BX,0 ; tổng tích luỹ ở BX lúc đầu bằng 0 Ta cũng có thể dùng một vi dòng lệnh chỉ để lm chú giải cho một công việc no đó. Cần lu ý l mỗi dòng chú giải đó phải bắt đầu bằng dấu chấm phẩy. Ví dụ: ; khởi đầu thanh ghi DS v ES trong đoạn dữ liệu MOV AX,@DATA MOV DS,AX MOV ES,AX 1.2. Dữ liệu cho chơng trình Dữ liệu của một chơng trình hợp ngữ l rất đa dạng. Các dữ liệu có thể đợc cho dới dạng số hệ hai, hệ mời, hệ mời sáu hoặc dới dạng ký tự (cần chú ý l trên các máy IBM PC trong chơng trình DEBUG, một công cụ tìm lỗi rất thông dụng cho các chơng trình hợp ngữ đơn giản, dữ liệu bằng số đợc ngầm định phải ở hệ mời sáu). Khi cung cấp số liệu cho chơng trình, số cho ở hệ no phải đợc kèm đuôi của hệ đó nh ta đã nói rõ ở chơng 1 (trừ hệ mời thì không cần vì l trờng hợp ngầm định của assembler). Riêng đối với số hệ mời sáu nếu số đó bắt đầu bằng các chữ (a f hoặc A F) thì ta phải thêm 0 ở trớc để chơng trình dịch có thể hiểu đợc đó l một số hệ mời sáu chứ không phải l một tên hoặc một nhãn. Ví dụ các số viết đúng: 0011B ;Số hệ hai. 1234 ;Số hệ mời. 100 0ABBAH ;Số hệ mời sáu, không nhầm đợc với ;tên của một ban nhạc nổi tiếng ABBA. 1EF1H ;Số hệ mời sáu. Nếu dữ liệu l ký tự hoặc chuỗi ký tự thì chúng phải đợc đóng trong cặp dấu trích dẫn đơn hoặc kép, thí dụ nh 'A' hay "abcd". Chơng trình dịch sẽ dịch ký tự ra mã ASCII tơng ứng của nó, vì vậy trong khi cung cấp dữ liệu kiểu ký tự cho chơng trình ta có thể dùng bản thân ký tự đợc đóng trong dấu trích dẫn hoặc mã ASCII của nó. Ví dụ, ta có thể sử dụng dữ liệu ký tự l "0" hoặc mã ASCII tơng ứng l 30H, ta có thể dùng '$' hoặc 26H hoặc 34 1.3. Biến v hằng Biến trong chơng trình hợp ngữ có vai trò nh nó có ở ngôn ngữ bậc cao. Một biến phải đợc định kiểu dữ liệu l kiểu byte hay kiểu từ v sẽ đợc chơng trình dịch gán cho một địa chỉ nhất định trong bộ nhớ. Để định nghĩa các kiểu dữ liệu khác nhau ta thờng dùng các lệnh giả sau: DB (define byte) :định nghĩa biến kiểu byte, DW (define word) :định nghĩa biến kiểu từ, DD (define double word) :định nghĩa biến kiểu từ kép. Biến byte Biến kiểu byte sẽ chiếm 1 byte trong bộ nhớ. Hớng dẫn chơng trình dịch để định nghĩa biến kiểu byte có dạng tổng quát nh sau: Tên DB giá_trị_khởi_đầu Ví dụ: B1 DB 4 Ví dụ trên định nghĩa biến byte có tên l B1 v dnh 1 byte trong bộ nhớ cho nó để chứa giá trị khởi đầu bằng 4. Nếu trong lệnh trên ta dùng dấu ? thay vo vị trí của số 4 thì biến B1 sẽ đợc dnh chỗ trong bộ nhớ nhng không đợc gán giá trị khởi đầu. Cụ thể dòng lệnh giả: B2 DB ? chỉ định nghĩa 1 biến byte có tên l B2 v dnh cho nó một byte trong bộ nhớ. Một trờng hợp đặc biệt của biến byte l biến ký tự. Ta có thể có định nghĩa biến ký tự nh sau: C1 DB '$' 101 C2 DB 34 Biến từ Biến từ cũng đợc định nghĩa theo cách giống nh biến byte. Hớng dẫn chơng trình dịch để định nghĩa biến từ có dạng nh sau: Tên DW giá_trị_khởi_đầu Ví dụ: W1 DW 40 Ví dụ trên định nghĩa biến từ có tên l W1 v dnh 2 byte trong bộ nhớ cho nó để chứa giá trị khởi đầu bằng 40. Chúng ta cũng có thể sử dụng dấu ? chỉ để định nghĩa v dnh 2 byte trong bộ nhớ cho biến từ W2 m không gán giá trị đầu cho nó bằng dòng lệnh sau: W2 DW ? Biến mảng Biến mảng l biến hình thnh từ một dãy liên tiếp các phần tử cùng loại byte hoặc từ, khi định nghĩa biến mảng ta gán tên cho một dãy liên tiếp các byte hay từ trong bộ nhớ cùng với các giá trị ban đầu tơng ứng. Ví dụ: M1 DB 4,5,6,7,8,9 Ví dụ trên định nghĩa biến mảng có tên l M1 gồm 6 byte v dnh chỗ cho nó trong bộ nhớ từ địa chỉ ứng với M1 để chứa các giá trị khởi đầu bằng 4,5,6,7,8,9. Phần tử đầu trong mảng l 4 v có địa chỉ trùng với địa chỉ của M1, phần tử thứ hai l 5 v có địa chỉ M1+1 Khi chúng ta muốn khởi đầu các phần tử của mảng với cùng một giá trị chúng ta có thể dùng thêm toán tử DUP trong lệnh. Ví dụ: M2 DB 100 DUP(0) M3 DB 100 DUP(?) Ví dụ trên định nghĩa một biến mảng tên l M2 gồm 100 byte, dnh chỗ trong bộ nhớ cho nó để chứa 100 giá trị khởi đầu bằng 0 v một biến mảng khác tên l M3 102 gồm 100 byte, dnh sẵn chỗ cho nó trong bộ nhớ để chứa 100 giá trị nhng cha đợc khởi đầu. Toán tử DUP có thể lồng nhau để định nghĩa ra 1 mảng. Ví dụ: dòng lệnh M4 DB 4,3, 2, 2 DUP(1,2 DUP(5),6) sẽ định nghĩa ra một mảng M4 tơng đơng với lệnh sau: M4 DB 4,3,2,1,5,5,6,1,5,5,6 Một điều cần chú ý nữa l đối với các bộ vi xử lý của Intel, nếu ta có một từ để trong bộ nhớ thì byte thấp của nó sẽ đợc để ở ô nhớ có địa chỉ thấp, byte cao sẽ đợc để ở ô nhớ có địa chỉ cao. Cách lu giữ số liệu kiểu ny cũng còn có thể thấy ở các máy VAX của Digital hoặc của một số hãng khác v thờng gọi l 'quy ớc đầu bé' (little endian, byte thấp đợc cất tại địa chỉ thấp). Cũng nên nói thêm ở đây l các bộ vi xử lý của Motorola lại có cách cất số liệu theo thứ tự ngợc lại hay còn đợc gọi l 'quy ớc đầu to' (big endian byte cao đợc cất tại địa chỉ thấp). Ví dụ: Sau khi định nghĩa biến từ có tên l WORDA nh sau: WORDA DW 0FFEEH thì ở trong bộ nhớ byte thấp (EEH) sẽ đợc để tại địa chỉ WORDA còn byte cao (FFH) sẽ đợc để tại địa chỉ tiếp theo, tức l tại WORDA+1. Biến kiểu xâu ký tự Biến kiểu xâu ký tự l một trờng hợp đặc biệt của biến mảng, trong đó các phần tử của mảng l các ký tự. Một xâu ký tự có thể đợc định nghĩa bằng các ký tự hoặc bằng mã ASCII của các ký tự đó. Các ví dụ sau đều l các lệnh đúng v đều định nghĩa cùng một xâu ký tự nhng gán nó cho các tên khác nhau: STR1 DB 'string' STR2 DB 73h,74h,72h,69h,6Eh,67h STR3 DB 73h,74h,'r','i',6Eh,67h Hằng có tên 103 Các hằng trong chơng trình hợp ngữ thờng đợc gán tên để lm cho chơng trình trở nên dễ đọc hơn. Hằng có thể l kiểu số hay kiểu ký tự. Việc gán tên cho hằng đợc thực hiện nhớ lệnh giả EQU (equate) nh sau: CR EQU 0Dh ;CR l carriage return LF EQU 0Ah ;LF l line feed Trong ví dụ trên lệnh giả EQU gán giá trị số 13 (mã ASCII của ký tự trở về đầu dòng) cho tên CR v 10 (mã ASCII của ký tự thêm dòng mới) cho tên LF. Hằng cũng có thể l một chuỗi ký tự. Trong ví dụ dới đây, sau khi đã gán một chuỗi ký tự cho một tên: CHAO EQU 'Hello!' ta có thể sử dụng hằng ny để định nghĩa một biến mảng khác: MSG DB CHAO,'$' Vì lệnh giả EQU không dnh chỗ của bộ nhớ cho tên của hằng nên ta có thể đặt nó khá tự do tại những chỗ thích hợp bên trong chơng trình. Tuy nhiên trong thực tế ngời ta thờng đặt các định nghĩa ny trong đoạn dữ liệu. 1.4. Khung của một chơng trình hợp ngữ Một chơng trình mã máy trong bộ nhớ thờng bao gồm các vùng nhớ khác nhau để chứa mã lệnh, chứa dữ liệu của chơng trình v một vùng nhớ khác đợc dùng lm ngăn xếp phục vụ hoạt động của chơng trình. Chơng trình viết bằng hợp ngữ cũng phải có cấu trúc tơng tự để khi đợc dịch nó sẽ tạo ra mã tơng ứng với chơng trình mã máy nói trên. Để tạo ra sờn của một chơng trình hợp ngữ, chúng ta sẽ sử dụng cách định nghĩa đơn giản đối với mô hình bộ nhớ dnh cho chơng trình v đối với các thanh ghi đoạn, cách định nghiã đợc phép từ phiên bản 5.0 của Microsoft Macro Assembler,. Khai báo quy mô sử dụng bộ nhớ Kích thớc của bộ nhớ dnh cho đoạn mã v đoạn dữ liệu trong một chơng trình đợc xác định nhờ hớng dẫn chơng trình dịch .MODEL nh sau (hớng dẫn ny phải đợc đặt trớc các hớng dẫn khác trong chơng trình hợp ngữ, nhng sau hớng dẫn về loại CPU): 104 .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. Đối với ta, thông thờng các ứng dụng đòi hỏi mã chơng trình di nhất cũng chỉ cần chứa trong một đoạn (64KB), dữ liệu cho chơng trình nhiều nhất cũng chỉ cần chứa trong một đoạn, thich hợp nhất nên chọn Kiểu_kích_thớc_bộ_nhớ l Small (nhỏ) hoặc nếu nh tất cả mã v dữ liệu có thể gói gọn đợc trong một đoạn thì có thể chọn Tiny (hẹp) : .Model Small hoặc .Model Tiny Ngoi Kiểu_kích_thớc_bộ_nhớ nhỏ hoặc hẹp nói trên, tuỳ theo nhu cầu cụ thể MASM còn cho phép sử dụng các Kiểu_kích_thớc_bộ_nhớ khác nh đợc liệt kê trong bảng 4.1. Bảng 4.1. Các kiểu kích thớc bộ nhớ cho chơng trình hợp ngữ. Kiểu kích thớc Mô tả Tiny (Hẹp) mã lệnh v dữ liệu gói gọn trong một đoạn. Small (Nhỏ) mã lệnh gói gọn trong một đoạn, dữ liệu nằm trong một đoạn. Medium (Trung bình) mã lệnh không gói gọn trong một đoạn, dữ liệu nằm trong một đoạn. Compact (Gọn) mã lệnh gói gọn trong một đoạn, dữ liệu không gói gọn trong một đoạn. Large (Lớn) mã lệnh không gói gọn trong một đoạn, dữ liệu không gói gọn trong một đoạn, không có mảng no lớn hơn 64KB. Huge (Đồ sộ) mã lệnh không gói gọn trong một đoạn, dữ liệu không gói gọn trong một đoạn, các mảng có thể lớn hơn 64KB. Khai báo đoạn ngăn xếp Việc khai báo đoạn ngăn xếp l cốt để dnh ra một vùng nhớ đủ lớn dùng lm ngăn xếp phục vụ cho hoạt động của chơng trình khi có chơng trình con. Việc khai báo đợc thực hiện nhờ hớng dẫn chơng trình dịch nh sau: 105 .Stack Kích_thớc Kích_thớc sẽ quyết định số byte dnh cho ngăn xếp. Nếu ta không khai Kích_thớc thì chơng trình dịch sẽ tự động gán cho Kích_thớc giá trị 1KB, đây l kích thơc ngăn xếp quá lớn đối với một ứng dụng thông thờng. Trong thực tế cho các bi toán của ta, thông thờng với 100 - 256 byte l đủ để lm ngăn xếp v ta có thể khai báo kích thớc cho nó nh sau: .Stack 100 hoặc .Stack 100H Khai báo đoạn dữ liệu Đoạn dữ liệu chứa ton bộ các định nghĩa cho các biến của chơng trình. Các hằng cũng nên đợc định nghĩa ở đây để đảm bảo tính hệ thống mặc dù ta có thể để chúng ở trong chơng trình nh đã nói ở phần trên. Việc khai báo đoạn dữ liệu đợc thực hiện nhờ hớng dẫn chơng trình dịch .DATA , việc khai báo biến v hằng đợc thực hiện tiếp ngay sau đó bằng các lệnh giả thích hợp. Điều ny đợc minh hoạ trong thí dụ đơn giản sau: .Data MSG DB 'Hello!$' CR DB 13 LF EQU 10 Khai báo đoạn mã Đoạn mã chứa mã lệnh của chơng trình. Việc khai báo đoạn mã đợc thực hiện nhờ hớng dẫn chơng trình dịch .CODE nh sau: .CODE Bên trong đoạn mã, các dòng lệnh phải đợc tổ chức một cách hợp lý, đúng ngữ pháp dới dạng một chơng trình chính (CTC) v nếu cần thiết thì kèm theo các chơng trình con (ctc). Các chơng trình con sẽ đợc gọi ra bằng các lệnh CALL có mặt bên trong chơng trình chính. Một thủ tục đợc định nghĩa nhờ các lệnh giả PROC v ENDP. Lệnh giả PROC đợc dùng để bắt đầu một thủ tục còn lệnh giả ENDP đợc dùng để kết thúc nó. Nh vậy một chơng trình chính có thể đợc định nghĩa bằng các lệnh giả PROC v ENDP theo mẫu sau: 106 [...]... chơng trình con Khung của chơng trình hợp ngữ để dịch ra chơng trình EXE Từ các khai báo các đoạn của chơng trình đã nói ở trên ta có thể xây dựng một khung tổng quát cho các chơng trình hợp ngữ với kiểu kích thớc bộ nhớ nhỏ Sau đây l một khung cho chơng trình hợp ngữ để rồi sau khi đợc dịch (assembled) v nối (linked) trên máy IBM PC sẽ tạo ra một tệp chơng trình chạy đợc ngay (executable) với đuôi... trình có lỗi cú pháp thì ta phải quay lại bớc 1 để sửa lại chơng trình gốc 3 Dùng chơng trình LINK để nối một hay nhiều tệp OBJ lại với nhau thnh một tệp chơng trình chạy đợc với đuôi EXE 4 Nếu chơng trình gốc viết ra l để dịch ra kiểu COM thì ta phải dùng chơng trình EXE2BIN (đọc l EXEtoBIN) của DOS để dịch tiếp tệp EXE ra tệp chơng trình chạy đợc với đuôi COM 5 Cho chạy chơng trình vừa dịch Quá trình. .. hoạ bằng lu đồ trên hình 4. 2 Sau đây ta sẽ nói kỹ v cụ thể hơn về một số công đoạn trong quá trình soạn thảo v cho chạy chơng trình hợp ngữ Để soạn thảo chơng trình hợp ngữ ta có thể dùng các chơng trình soạn thảo văn bản nh BKED hoặc các các chức năng soạn thảo của Turbo Pascal, SK, NC nhng tốt nhất nên dùng các chơng trình SK hoặc NC vì các chơng trình ny có khả năng thờng trú do đó rất thích hợp. .. THEN Ngữ pháp (hình 4. 2): IF Điềukiện THEN Côngviệc Từ ngữ pháp của cấu trúc IF-THEN ta thấy nếu thoả mãn Điềukiện thì Côngviệc đợc thực hiện, nếu không Côngviệc sẽ bị bỏ qua Điều ny tơng đơng với việc dùng lệnh nhảy có điều kiện để bỏ qua một thao tác no đó trong chơng trình hợp ngữ Điềukiện Điềukiện sai đúng sai đúng Côngviệc Côngviệc2 Côngviệc1 Hình 4. 3 Cấu trúc IF-THEN-ELSE Hình 4. 2 Cấu trúc IF-THEN... (hình 4. 2) 2 Cách tạo v cho chạy một chơng trình hợp ngữ trên máy IBM PC Nh đã nói trong phần trớc, máy IBM PC l phơng tiện lý tởng để chúng ta tạo ra v thử nghiệm các chơng trình hợp ngữ 8086/88 Các bớc để lm công việc ny có thể liệt kê ra nh sau: 1 Dùng các phần mềm soạn thảo văn bản (SK, NCedit ) để tạo ra một tệp văn bản chơng trình gốc bằng hợp ngữ Tệp ny phải đợc gán đuôi ASM 2 Dùng chơng trình. .. tệp chơng trình với đuôi EXE, chúng ta còn có khả năng dịch chơng trình hợp ngữ có kết cấu thích hợp ra một loại tệp chơng trình chạy đợc kiểu khác với đuôi COM Đây l một chơng trình ngắn gọn v đơn giản hơn nhiều so với tệp chơng trình đuôi EXE, trong đó các đoạn mã, đoạn dữ liệu v đoạn ngăn xếp đợc gộp lại trong một đoạn duy nhất l đoạn mã Nh vậy nếu ta có các ứng dụng m dữ liệu v mã chơng trình không... trình v ngăn xếp chung vo trong cùng một đoạn mã rồi tạo ra tệp COM Với việc tạo ra tệp ny không những ta tiết kiệm đợc thời gian v bộ nhớ khi cho chạy chơng trình m còn tiết kiệm đợc cả không gian nhớ khi phải lu trữ nó trên ổ đĩa 109 Để có thể dịch đợc ra chơng trình đuôi COM thì chơng trình nguồn hợp ngữ phải đợc kết cấu sao cho thích hợp với mục đích ny Sau đây l khung của một chơng trình hợp ngữ. .. Cho chạy chơng trình Hình 4. 2 Các bớc công việc để tạo v cho chạy một chơng trình hợp ngữ Sau lệnh ny MASM sẽ kiểm tra lỗi của chơng trình gốc v đa ra bản thống kê các lỗi nếu có Trong trờng hợp chơng trình hợp ngữ không bị lỗi ta nhận đợc các dòng thông báo sau: A> C:MASM vidu; Microsoft (R) Macro Assembler Version 5.00A Copy rights (C) Microsoft Corp 198 1-1 985,1987 All rights reserved 49 020 Bytes symbol... ton bộ chơng trình ta dùng hớng dẫn chơng trình dịch END đi kèm theo nhãn START ở đây nhãn START tơng ứng với địa chỉ lệnh đầu tiên của chơng trình trong đoạn mã Sau đây l ví dụ của một chơng trình hợp ngữ để dịch ra tệp chơng trình chạy đợc với đuôi COM (chơng trình 4. 2) Chơng trình 4. 2 Chơng trình Helo.COM Model Tiny Code ORG 100H START: JMP CONTINUE 111 CRLF MSG DB DB 13,10,'$' 'Hello!$' CONTINUE:... trong chơng trình 4. 2 ta không cần đến các thao tác khởi đầu cho thanh ghi DS, nh ta đã phải lm trong chơng trình 4. 1, vì trong chơng trình COM không có đoạn dữ liệu nằm riêng rẽ Stack chơng trình SS CS DS ES 100h chơng trình 100h PSP PSP COM EXE Hình 4. 2 Môđun chơng trình COM v EXE trong bộ nhớ 112 Cuối cùng để kết thúc phần nói về các chơng trình kiểu COM v EXE ta đa ra hình ảnh của các chơng trình ny . chơng trình hợp ngữ 1.1. Cú pháp của chơng trình hợp ngữ Trớc khi trình by cách lập trình bằng hợp ngữ ta phải tìm hiểu qua cú pháp của ngôn ngữ ny, bởi vì nh ta đã biết, để lm việc đợc với. Chơng 4 Lập trình bằng hợp ngữ với 8088 Mở đầu Trong chơng trớc ta đã giới thiệu khá tỉ mỉ tập lệnh của bộ vi xử lý 8086/88. Trong chơng ny ta sẽ giới thiệu cách lập trình dùng hợp ngữ trên. ứng với địa chỉ lệnh đầu tiên của chơng trình trong đoạn mã. Sau đây l ví dụ của một chơng trình hợp ngữ để dịch ra tệp chơng trình chạy đợc với đuôi .COM (chơng trình 4. 2). Chơng trình 4. 2.