Một chương trỡnh *.EXE thường thể hiện rừ ràng 3 đoạn: mó, dữ liệu, ngăn xếp. Sau khi được biờn dịch (Assembled) và liờn kết (Linked), chỳng cú thểđược thực thi trực tiếp từ dũng lệnh của DOS như cỏc chương trỡnh khỏc. Cấu trỳc cơ bản của một chương trỡnh dạng này như sau:
TITLE ten_chuong_trinh
.MODEL <Qui mụ sử dụng bộ nhớ> .STACK <Kớch thước ngăn xếp> .DATA
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 48
<Khai bỏo cỏc biến, hằng cho chương trỡnh> .CODE Main PROC ;Khởi tạo cho DS hoặc/và ES MOV AX,@data MOV DS,AX ;MOV ES,AX ;Cỏc lệnh của chương trỡnh chớnh ;Trở về DOS bằng việc sử dụng chức năng 4Ch của ngắt 21h MOV AH,4Ch INT 21h Main ENDP ;Cỏc chương trỡnh con (nếu cú) END Main
Trong cấu trỳc trờn, tại dũng cuối cựng xuất hiện dẫn hướng chương trỡnh dịch END và MAIN để kết thỳc toàn bộ chương trỡnh. Main chớnh là nơi bắt đầu cỏc lệnh của chương trỡnh trong đoạn mó.
Khi một chương trỡnh *.EXE được nạp vào bộ nhớ, DOS sẽ tạo ra một mảng gồm 256 byte cho PSP (Program Segment Prefix - Tiền tố chương trỡnh). PSP được sử
dụng để chứa cỏc thụng tin liờn quan đến chương trỡnh và đặt ngay vào trước phần chứa mó lệnh của chương trỡnh.
Tại dũng .MODEL chỳng ta cú thể khai bỏo qui mụ sử dụng bộ nhớ phự hợp cho từng chương trỡnh. Cú thể là một trong cỏc thành phần sau:
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 (rộng) 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 nào lớn hơn 64K
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 49
dữ liệu khụng gúi gọn trong một đoạn, cỏc mảng cú thể lớn hơn 64K
Chương trỡnh dịch sẽ dịch tờn @data thành cỏc giỏ trị số của đoạn dữ liệu và đưa cỏc thụng số của dữ liệu vào thanh ghi DS và ES.
Để hiểu rừ hơn về cấu trỳc chương trỡnh này, chỳng ta lấy một vớ dụ minh hoạ
như sau:
Vớ dụ: Viết một chương trỡnh hợp ngữ thực hiện in hai chuỗi kớ tự trờn hai dũng màn hỡnh.
title ct .MODEL Small .STACK 100h .DATA
chao DB 'Chao cac ban sinh vien lop TK1$'
hoi DB 'Cac ban co muon hoc mon Vi xu ly khong? $' .CODE
main PROC
;Nap du lieu cho DS MOV AX,@DATA MOV DS,AX
;Xoa man hinh bang chuc nang 0 cua ngat 10h MOV AH,0
MOV AL,3 ;che do text 80x25
INT 10h
;In chuoi thu nhat ra man hinh MOV AH,9
MOV DX,offset chao ;tro toi dia chi offset cua chuoi INT 21h
;Dua con tro xuong dong tiep theo va ve dau dong MOV AH,2
MOV DL,13 ;xuong dong INT 21h
MOV DL,10 ;ve dau dong INT 21h
;In chuoi thu hai ra man hinh MOV AH,9
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 50
MOV DX,offset hoi INT 21h
;Ket thuc chuong trinh va tro ve DOS MOV AH,4Ch
INT 21h main ENDP END main
Như vậy, ta thấy chương trỡnh trờn là một chương trỡnh nhỏ nờn sử dụng qui mụ bộ nhớ nhỏ (Small). Kớch thước ngăn xếp là 256 byte. Dữ liệu cho chương trỡnh cú hai chuỗi là chao và hoi. Cỏc chuỗi này đều được khai bỏo với toỏn tử DB.
Đặc biệt, cỏc lệnh hoặc nhúm lệnh của chương trỡnh trờn cú giải thớch để người
đọc và chớnh bản thõn người lập trỡnh (khi đọc lại) cũng sẽ dễ hiểu hơn.
3.5.2.Cấu trỳc chương trỡnh để dịch ra tệp *.COM
Một chương trỡnh *.COM thường cú đặc điểm khỏc biệt với cỏc chương trỡnh *.EXE là chỳng chỉ cú thể sử dụng một đoạn duy nhất của bộ nhớ để chứa mó, dữ liệu và ngăn xếp. Vỡ vậy, qui mụ sử dụng bộ nhớ của cỏc chương trỡnh dạng này thường là Tiny.
Cấu trỳc cơ bản của dạng chương trỡnh này như sau:
Title Cautruc_COM .Model Tiny
.Code
org 100h
Start: JMP Continue
;Dinh nghia cac bien, hang Continue:
Main PROC
;Cac lenh cua chuong trinh chinh INT 20h
Main ENDP
;Cac chuong trinh con (neu co) End Start
Với dạng cấu trỳc này, khi dịch chương trỡnh, chương trỡnh dịch sẽđưa ra thụng bỏo "No Stack Segment".
Trong cấu trỳc trờn, ta thấy, ở ngay đầu chương trỡnh đoạn mó là lệnh giả ORG (Origin:
điểm xuất phỏt) và lệnh JMP (nhảy). Lệnh giả ORG 100h dựng để gỏn địa chỉ bắt đầu cho chương trỡnh tại địa chỉ 100h (256) trong đoạn mó, chừa lại đoạn bộ nhớ 256byte cho PSP.
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 51
Lệnh JMP sau nhón START dựng để nhảy qua phần bộ nhớ dành cho việc định nghĩa và khai bỏo dữ liệu. Đớch của lệnh nhảy là phần đầu của chương trỡnh chớnh.
Hỡnh ảnh của chương trỡnh được thể hiện trong bộ nhớđược thể hiện như trong hỡnh vẽ
sau: Địa chỉ lệch 0000h Đoạn đầu chương trỡnh (PSP) 0100h JMP Continue IP Dữ liệu cho chương trỡnh FFFEh Continue: (Chiều tiến của mó&dữ liệu) *** (Chiều tiến của ngăn xếp) SP Như vậy, một chương trỡnh *.COM cú một số hạn chế sau:
- Dung lượng cực đại của chương trỡnh chỉ giới hạn trong một đoạn 64K.
- Chương trỡnh chỉđược phộp sử dụng ngăn xếp với kớch thước nhỏ. Nếu khụng, nú sẽ chiếm nhiều phần trong đoạn mó lệnh.
Chương trỡnh *.COM thường được kết thỳc bởi lệnh INT 20h.
Sau đõy chỳng ta xột một vớ dụ để hiểu rừ hơn về việc sử dụng cấu trỳc trờn trong lập trỡnh hợp ngữ.
Chương trỡnh được viết như sau:
Title Cautruc_COM .Model Tiny
.Code
org 100h
Start: JMP Continue
chao DB 'Chao cac ban sinh vien lop TK1$'
hoi DB 'Cac ban co muon hoc mon Vi xu ly khong? $' Continue:
Main PROC
;Xoa man hinh bang chuc nang 0 cua ngat 10h MOV AH,0
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 52
INT 10h
;In chuoi thu nhat ra man hinh MOV AH,9
MOV DX,offset chao ;tro toi dia chi offset cua chuoi INT 21h
;Dua con tro xuong dong tiep theo va ve dau dong MOV AH,2
MOV DL,13 ;xuong dong INT 21h
MOV DL,10 ;ve dau dong INT 21h
;In chuoi thu hai ra man hinh MOV AH,9
MOV DX,offset hoi INT 21h
INT 20h Main ENDP
End Start
Chỳng ta cú thể nhận xột rằng một chương trỡnh *.COM khụng cần phải nạp dữ liệu vào DS vỡ chương trỡnh dạng này cú mó, dữ liệu và ngăn xếp trong cựng một đoạn.
3.6.Cỏch tạo một chương trỡnh hợp ngữ
Một chương trỡnh viết bằng ngụn ngữ bậc cao cú thể chạy trực tiếp trong mụi trường của chỳng. Song, với ngụn ngữ lập trỡnh bậc thấp (hợp ngữ) thỡ việc chạy chương trỡnh cần phải thụng qua việc hợp dịch (Assembled), liờn kết (Linked). Người ta đó đưa ra cỏc bước để soạn thảo, dịch và chạy chương trỡnh như sau:
Bước 1: Soạn thảo văn bản chương trỡnh
Trong bước này, ta cú thể thực hiện bằng một trỡnh soạn thảo văn bản bất kỳ nào như
EDIT, NCEDIT, TURBO PASCAL, C, NOTEPAD, hoặc WINWORD... nhưng, cần phải ghi lại với phần mở rộng là *.ASM.
Bước 2: Hợp dịch chương trỡnh nguồn ra cỏc tệp đối tượng *.OBJ
Trong bước này, ta cú thể sử dụng trỡnh MASM (MicroSoft Assembler) hoặc TASM (Turbo Assembler) theo cỳ phỏp sau:
MASM 9 tờn_tệp[.phần_mở_rộng] ↵
Hoặc: TASM 9 tờn_tệp[.phần_mở_rộng] ↵
Sau khi dịch, nếu cú lỗi cỳ phỏp, mỏy sẽ bỏo dũng gõy lỗi và mó lỗi. Khi đú ta cú thể
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 53
Bước 3: Liờn kết cỏc tệp đối tượng thành tệp chương trỡnh *.EXE
Cú thể sử dụng trỡnh liờn kết LINK hoặc TLINK (Turbo) theo cỳ phỏp sau: LINK 9 tệp_đt1[+tệp_đt2+...+tệp_đtn] ↵
Hoặc: TLINK 9 tệp_đt1[+tệp_đt2+...+tệp_đtn] ↵
Bước 4: Nếu chương trỡnh viết dưới dạng cấu trỳc *.COM thỡ thực hiện dịch sang dạng *.COM bằng cỳ phỏp sau:
EXE2BIN 9 tờn_tệp_exe 9 tờn_tệp_com.COM ↵
Nếu tệp viết để dịch ra chương trỡnh *.EXE thỡ bỏ qua bước này Bước 5: Chạy tệp chương trỡnh vừa dịch
Tờn_tệp_chương_trỡnh ↵
Với cỏc bước thực hiện như trờn, chỳng ta cú thể mụ phỏng bằng lưu đồ sau:
Vớ dụ: Soạn thảo một chương trỡnh đơn giản, sau đú dịch và chạy chương trỡnh này Bước 1: Soạn thảo văn bản chương trỡnh
Soạn thảo văn bản chương trỡnh
Dịch ra cỏc tệp .OBJ bằng MASM
Liờn kết cỏc tệp .OBJ thành tệp .EXE Lỗi cỳ phỏp?
Dịch ra tệp .COM?
Dịch từ tệp .EXE sang tệp .COM Khụng
Cú
Chạy chương trỡnh
Khụng Cú
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 54
Bước 2: Dịch ra tệp .OBJ
Nếu cú lỗi như hỡnh trờn, quay lại bước 1. Cứ như vậy cho đến khi khụng cũn lỗi
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 55
Bước 4: Vỡ tệp chương trỡnh cú cấu trỳc *.EXE, nờn ta cú thể bỏ qua bước này. Bước 5: Chạy tệp chương trỡnh
Vidu_exe ↵
Chương 4: CÁC CẤU TRÚC LẬP TRèNH
4.1.Tổng quan
Trong cỏc ngụn ngữ lập trỡnh bậc cao, người ta thường sử dụng cỏc cấu trỳc lập trỡnh cơ
bản sau: - Cấu trỳc tuần tự - Cấu trỳc rẽ nhỏnh + Rẽ một nhỏnh (IF...THEN....) + Rẽ hai nhỏnh (IF...THEN...ELSE...) + Rẽ nhiều nhỏnh (CASE...OF...) - Cấu trỳc lặp + Lặp xỏc định (FOR...TO...DO) + Lặp khụng xỏc định Điều kiện trước (WHILE...DO...) Điều kiện sau (REPEAT...UNTIL...)
Sau đõy ta sẽ nghiờn cứu việc biểu diễn cỏc cấu trỳc lập trỡnh trờn bằng hợp ngữ trong khi cỏc lệnh của hợp ngữ sẽ thực hiện theo cấu trỳc tuần tự. Vỡ vậy, muốn điều khiển rẽ
nhỏnh chương trỡnh, chỳng ta cần phải thực hiện cỏc lệnh chuyển điều khiển.
4.1.1.Cỏc lệnh chuyển điều khiển 4.1.1.1.Cỏc định hướng
- Định hướng NEAR: Thụng thường cỏc lệnh điều khiển rẽ nhỏnh chương trỡnh được thực hiện theo định hướng NEAR (Mặc định).
Định hướng này cho phộp cỏc lệnh chuyển điều khiển thực hiện trong khoảng ±126 byte. Cú nghĩa là, chỉ cú thể nhảy về trước và về phớa sau của lệnh 126 byte.
- Định hướng FAR: Nếu cú định hướng này, chương trỡnh dịch sẽ cho phộp lệnh chuyển
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 56
4.1.1.2. Điều kiện cho cỏc lệnh nhảy
Cỏc lệnh điều khiển rẽ nhỏnh chương trỡnh phụ thuộc vào cỏc trạng thỏi của cỏc cờ trong thanh ghi cờ. Vỡ vậy, ta cú thể tạo ra cỏc điều kiện cho cỏc lệnh này bằng một số
lệnh sau:
a/ Lệnh CMP (Compare - so sỏnh)
Dạng lệnh: CMP toan_hang_1,toan_hang_2
ý nghĩa: Lệnh này sẽ thực hiện lấy toan_hang_1 trừđi cho toan_hang_2 và kết quả khụng trả lại cho toan_hang_1. Nhưng nú sẽ tỏc động đến cỏc cờ trạng thỏi trong thanh ghi cờ. Vớ dụ: MOV AL,3Ah ;AL=00111010
CMP AL,1Ch ;
CF= 00111000
00111010
-00011100
00011110
Như vậy, nếu xột đến cỏc cờ trạng thỏi thỡ ta thấy lệnh trờn sẽảnh hưởng đến cờ như sau: CF=0; PF=1; AF=1; ZF=0; SF=0; OF=0.
b/ Lệnh Test (Kiểm tra)
Dạng lệnh: TEST toan_hang_1,toan_hang_2
ý nghĩa: Lệnh này sẽ kiểm tra một bit nào đú của toan_hang_1 với cỏc bit 1 tương ứng ở
toan_hang_2.
Vớ dụ: TEST AL,1 ;kiểm tra bit0 của AL xem bit này cú bằng 1 hay khụng. Nếu giỏ trị
của AL là một số lẻ thỡ bit0=1.
4.1.1.3.Cỏc lệnh điều khiển rẽ nhỏnh
Về cơ bản, chỳng ta cú thể xột đến một số lệnh điều khiển rẽ nhỏnh đó nghiờn cứu ở chương 1 phần 1.
Vớ dụ, xột lệnh JE. Lệnh này phụ thuộc vào cờ ZF. Nếu ZF=1 thỡ lệnh JE mới cú thể thực hiện được. Song, trờn thực tế, khi xột đến điều kiện thực hiện cỏc lệnh nhảy, ta chỉ cần quan tõm đến ý nghĩa của cỏc từ viết tắt cho từng loại lệnh nhảy. Cỏc điều kiện đú thể hiện như: A - Above; B -Bellow; C - Carry; E - Equal; G - Greater; L - Less; N - Not; Z - Zero... nhưng cũng cú thể kết hợp với nhau để cú cỏc ý nghĩa khỏc nhau như: NLE; NGE; NL; LE; NG; GE; NA; NB; NAE; NBE; AE; BE
4.2.Cấu trỳc tuần tự
Cấu trỳc tuần tự là một cấu trỳc mà trong đú cỏc mó lệnh hợp ngữđược thực hiện cỏc cụng việc theo trỡnh tự hết lệnh này đến lệnh khỏc.
Ngữ phỏp: Lệnh_1
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 57
Điều_kiện Cụng_việc Sai Đỳng Lệnh_2 ... Lệnh_n
Vớ dụ: Viết một đoạn chương trỡnh thực hiện nhập vào một kớ tự từ bàn phớm, sau đú in ra màn hỡnh kớ tựđú tại dũng tiếp theo. Giải: MOV AH,1 INT 21h MOV AH,2 MOV DL,13 INT 21h MOV DL,10 INT 21h MOV DL,AL INT 21h 4.3.Cấu trỳc rẽ nhỏnh 4.3.1.Cấu trỳc IF…THEN… Đõy là cấu trỳc điều khiển rẽ nhỏnh chương trỡnh với việc kiểm tra điều kiện. Nếu điều kiện thoả món thỡ thực hiện cụng việc. Nếu điều kiện khụng thoả món thỡ bỏ qua cụng việc này. Ngữ phỏp:
IF điều_kiện THEN cụng_việc Vớ dụ: Viết một đoạn chương trỡnh thực hiện nhập vào một kớ tự. Nếu là kớ tự 'A' thỡ hiển thị tại dũng tiếp theo.
Giải:
MOV AH,1 ;Nhap vao tu ban phim mot ki tu INT 21h ;ki tu do nam trong AL
CMP AL,41h
JNE ketthuc
PUSH AX ;Cat tam ki tu nay vao ngan xep
MOV Ah,2 ;Dua con tro
MOV DL,13 ;xuong dong tiep theo
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 58
MOV DL,10 ;ve ve dau dong
INT 21h
POP DX ;Lay ki tu ra va dua truc tiep vao DL INT 21h ;In ra man hinh
Ketthuc:
MOV AH,4Ch
INT 21h
Đoạn chương trỡnh trờn sẽ thực hiện cho phộp người sử dụng nhập vào từ bàn phớm một kớ tự. Sau đú, so sỏnh với mó ASCII của 'A'. Nếu khụng bằng thỡ sẽ thực hiện cỏc lệnh sau lệnh "JNE ketthuc" rồi mới kết thỳc. Nếu khụng, mỏy sẽ bỏ qua cỏc lệnh đú và kết thỳc chương trỡnh bằng hàm ngắt 4Ch của ngắt 21h.
4.3.2.Cấu trỳc IF..THEN…ELSE
Trong thực tế, chỳng ta thường đưa ra một điều kiện nào đú. Nếu trường hợp thoả món thỡ sẽ
thực hiện một cụng việc nào đú. Ngược lại, sẽ khụng thực hiện một cụng việc khỏc. Ngữ phỏp: IF điều_kiện THEN cụng_việc_1 ELSE cụng_việc_2 END_IF Vớ dụ: Viết 1 đoạn chương trỡnh hợp ngữ thực hiện nhập vào từ bàn phớm một kớ tự. Nếu kớ tự nhập vào cú mó ASCII nhỏ hơn mó ASCII của số 1 thỡ đưa ra màn hỡnh thụng bỏo "Kớ tự này đứng trước '1' trong bảng mó", ngược lại, đưa ra màn hỡnh thụng bỏo "Kớ tự
này đứng sau '1' trong bảng mó"
Giải: Đoạn chương trỡnh được thể hiện như sau:
* Giả thiết: thụng bỏo "Kớ tự này đứng trước '1' trong bảng mó" được lưu trong biến
truoc, thụng bỏo "Kớ tự này đứng sau '1' trong bảng mó" được lưu trong biến sau
Đoạn chương trỡnh được viết như sau:
;Nhap ki tu tu ban phim mov ah,1
int 21h
;Bat dau cau truc
cmp AL,'1' ;so sanh ki tu nhap vao voi '1' JL then_ Điều_kiện Cụng_việc 1 Sai Đỳng Cụng_việc 2
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 59
MOV AH,9 LEA DX,sau INT 21h JMP End_if then_: MOV AH,9 LEA DX,truoc INT 21h end_if: 4.3.3.Cấu trỳc rẽ nhỏnh CASE…OF…
Là một cấu trỳc đa nhỏnh. Nú kiểm tra cỏc thanh ghi, cỏc biến hay cỏc giỏ trị riờng rẽ
trong miền giỏ trị. 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 CASE
Như vậy, nếu biểu thức bằng giỏ trị nào, thỡ cụng việc tương ứng sẽđược thực hiện. Vớ dụ: Viết một đoạn chương trỡnh thực hiện nhập vào một kớ tự. Nếu kớ tựđứng trước 'A' trong bảng mó ASCII thỡ đưa ra thụng bỏo kớ tựđứng trước 'A'. Nếu kớ tự nhập vào là 'A'