Cấu trúc chung của một chương trình

Một phần của tài liệu Giáo trình Điện tử cơ bản và máy tính (Nghề: Công nghệ thông tin - Sơ cấp): Phần 2 - Trường CĐ nghề Kỹ thuật Công nghệ (Trang 29 - 33)

- Phương pháp an toàn dữ liệu trên thiết bị lưu trữ ngoài.

1.1 Cấu trúc chung của một chương trình

Một lệnh của hợp ngữ dù đơn giản hay phức tạp đều phải có đầy đủ một trong các thành phần sau:

[Ten] [Ma_lenh] [Cac_toan_hang] [;chú thích] Trong đó:

Ten: có thể là một chương trình con, một macro, một nhãn hoặc một thành phần nào đó.

Ma_lenh: cơ bản trường này chứa mã lệnh dưới dạng mã gợi nhớ, có thể là lệnh thật hoặc lệnh giả

nếu là lệnh thật thì đây là các lệnh của bộ vi xử lý

nếu là lệnh giả thì đây là các hướng dẫn của chương trình dịch ví dụ: PROC, ENDP, ENDM, SEGMENT, ENDS…

Cac_toan_hang: là các thành phần mà các lệnh sử dụng để thực hiện lệnh, nếu là các lệnh thật thì đây là các tốn hạng của lệnh, nếu là lệnh giả thì đây là các tham số. số lượng tham số tuỳ thuộc vào việc khai báo các dẫn hướng.

Chú thích: là lời giải thích để người sử dụng hiểu rõ hơn về lệnh. Lời chú thích phải được bắt đầu bởi dấu (;) và chúng sẽ khơng được chương trình dịch xử lý.

Ví dụ:

Lap: ADD AL,[BX];cộng giá trị trong AL với ơ nhớ có địa chỉ là DS:BX kết quả được đưa và thanh ghi AL.

Với ví dụ trên :

Lap: là tên một nhãn và kết thúc bằng dấu (:) ADD: là lệnh thựchiện phép cộng

77

AL,[BX] là 2 toán hạng với quy định nếu tên thanh ghi hoặc một giá trị hằng năm trong dấu [] thì đó là địa chỉ offset của ô nhớ chứa dữ liệu cần thao tác

Các thành phần sau dấu (;) chỉ là lới chú thích.

Một chương trình hợp ngữ thể hiện các đoạn dành cho chúng rõ ràng với việc sử dụng kích thước bộ nhớ phù hợp và cú pháp của các lệnh rõ ràng tuân theo một cú pháp chung, mặc dù đó là lệnh thật hoặc lệnh giả. Để thể hiện một chương trình đó, người ta đưa ra 2 dạng cấu trúc, bao gồm:

a. Cấu trúc chương trình để dịch ra tệp *.EXE

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 (Assembler) 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

<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 con) 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 END và MAIN để kết thúc tồ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

78 một đoạn

Larg (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 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, mảng có thể lớn hơn 64Kb.

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ạ 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 2 dịng màn hình

Title chuongtrinh .MODEL Small .STACK 100h .DATA

Chao DB ‘chao cac ban sinh vien!$’

Hoi DB ‘cac ban muon hoc mon kien truc may tinh khong?$’ . CODE

Main PROC

;khởi tạo cho DS MOV AX,@data MOV DS,AX

; xố màn hình bằng chức năng 0 của ngắt 10h MOV AH,0

MOV AL,3 ;chế độ text INT 10h

; in chuỗi thứ nhất ra màn hình MOV AH,9

MOV DX,offset Chao INT 21h

; đưa con trỏ xuống dòng tiếp theo và về đầu dòng MOV AH,2 MOV DL,13 ; xuống dòng INT 21h MOV DL,10 ; về đầu dòng INT 21h ; in chuỗi thứ hai ra màn hình MOV AH,9

MOV DX,offset Hoi INT 21h ; kết thúc chương trình về DOS MOV AH,4Ch INT 21h Main ENDP END main

79

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 quy mơ bộ nhớ nhỏ. Kích thước ngăn xếp là 256 byte. Dữ liệu cho chương trình có 2 chuỗi là Chao và Hoi, các chuỗi này đều được khai báo với tố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à bản thân người lập trình (khi đọc lại) cũng sẽ dễ hiểu hơn.

b. 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, quy 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 ; định nghĩa các biến, hằng. Continue: Main PROC ;các lệnh của chương trình chính INT 21h Main ENDP

;các chương trình con (nếu có) 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 nhảy 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ớ 256 byte cho PSP. 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ớ như trong hình vẽ sau Địa chỉ lệch

Như vậy, một chương trình

*.COM có một số hạn chế sau:

0000h Đoạn đầu chương trình (PSP) 0100h JMP Continue

Dữ liệu cho chương trình

FFFFh

Continue:

(chiều tiến của mã & dữ liệu)

***

(chiều tiến của ngăn xếp)

IP

80

- 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 *.COM thường được kết thúc bởi lệnh INT 20h. Sau đây chúng ta sẽ 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$’

Hoi DB ‘cac ban co muon hoc mon kien truc may tinh khong?$’ ; định nghĩa các biến, hằng.

Continue:

Main PROC

;xóa màn hình bằng chức năng 0 của ngắt 10h MOV AH,0

MOV AL,3 INT 10h

; in chuỗi thứ nhất ra màn hình MOV AH,9

MOV DX, offset chao ;trỏ tới địa chỉ offset của chuỗi INT 21h

; đưa con trỏ xuống đầu dòng tiếp theo và về đầu dòng MOV AH,2 MOV DL, 13 ;xuống dòng INT 21h MOV DL, 10 ;về đầu dòng INT 21h ; in chuỗi thứ hai ra màn hình MOV AH,9

MOV DX, offset hoi ;trỏ tới địa chỉ offset của chuỗi INT 21h

Main ENDP

;các chương trình con (nếu có) END Start

Chúng ta có thể nhận thấy 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.

Một phần của tài liệu Giáo trình Điện tử cơ bản và máy tính (Nghề: Công nghệ thông tin - Sơ cấp): Phần 2 - Trường CĐ nghề Kỹ thuật Công nghệ (Trang 29 - 33)

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

(58 trang)