Cấu trỳc chương trỡnh để dịch rat ệp *.EXE

Một phần của tài liệu Tài liệu Đề cương vi xử lý (Trang 50 - 94)

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

Son tho văn bn chương trỡnh

Dch ra cỏc tp .OBJ bng MASM

Liờn kết cỏc tp .OBJ thành tp .EXE Li cỳ phỏp?

Dch ra tp .COM?

Dch t tp .EXE sang tp .COM Khụng

Chy chương trỡnh

Khụng

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 CU TRÚC LP 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'

Một phần của tài liệu Tài liệu Đề cương vi xử lý (Trang 50 - 94)

Tải bản đầy đủ (PDF)

(94 trang)