2.5. BỘ ĐỒNG XỬ LÝ TOÁN 80X87
2.5.1. Sơ lược về các số thực
2.5.2. Cấu trúc của 8087
Các bộ đồng xử lí toán (methematical co-processor) 80x87 trợ giúp cho CPU trong việc tính các biểu thức toán với dấu phẩy động như cộng, trừ, nhân, chia các dấu phảy động; tính căn bậc hai và lôgarit v.v… Các bộ đồng xử lí thực hiện các phép toán này nhanh hơn nhièu trong CPU. Trong bảng 12, hãng Intel cho một so sánh thời gian chạy (usec) một phép toán giữa 8087và 8086 ở tốc độ đồng hồ 8MHz, ta thấy rằng tốc độ tính toán được tăng lên từ 50 đến 500 lần.
Nó bao gồm một đơn vị điều khiển CU (control unit) dùng để điều khiển bus và đơn vị số học NU (numerical unit). Đơn vị NU thực hiện các phép tính dấu phảy động trong các mạch tích luỹ thừa (exponent module) và mạch tính phần định trị (mantissa module). Khác với 8086, thay vì cho các thanh ghi rời rạc là các ngăn xếp thanh ghi.
Đơn vị điều khiển nhận và giải mã lệnh, đọc và viết các toán hạng và chạy các lệnh điều khiển riêng của 8087. Do vậy, CU có thể đồng bộ với CPU trong khi NU đanh làm các công việc tính toán. CU bao gồm bộ điều khiển bus, bộ đệm số liệu và hàng nhận lệnh trước. Ngay sau khi PC được reset, bằng các đường BHE/S7, bộ đồng xử lí kiểm tra xem nó có được nối với CPU không. 8087 se điều chỉnh độ dài của hàng nhận lệnh trước cho phù hợp với độ dài trong 8086 (6byte). Bằng việc đồng bộ với CPU, các byte như nhau (và do đó cũng là các lệnh như nhau) được hiện diện trong các hàng nhận lệnh trước của cả 8087 và 8086. Tuy nhiên chúng có những điểm khác nhau căn bản:
- 8087 không thể chạy các lệnh của 8086 và ngược lại trong khi các lệnh cho hai bộ xử lí này được trộn lẫn trong một đường lệnh. Do vậy các lệnh của 8087 luôn được bắt đầu bằng chuỗi bit 11011 (27d) và được gọi là các lệnh ESC. Nói cách khác, các lệnh và tiền tố của CPU 8086 có thể bắt đầu với mọi số khác với 11011.
- Đơn vị điều khiển và số học của 8087 tạo một ngăn xếp các thanh ghi với các thanh ghi 80 bit từ R0 đến R7 cũng như các thanh ghi đieu khiển và trạng thái
CHƯƠNG 3: CẤU TRÚC LẬP TRÌNH ASSEMBLY
3.1. TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH ASSEMBLY
3.1.1. Khái niệm
Hợp ngữ là một ngôn ngữ bậc thấp, sử dụng tập lệnh của bộ vi xử lý và có thể tác động trực tiếp đến các thành phần bên trong của bộ vi xử lý. Mỗi một lệnh của hợp ngữ có quan hệ một - một với một lệnh mã máy.
Vì vậy, việc lập trình với hợp ngữ đòi hỏi người lập trình phải hiểu rõ cấu trúc bên trong, hoạt động, tập thanh ghi và tập lệnh của bộ vi xử lý.
Hình 2.1: Vị trí của hợp ngữ trong các máy tính IBM-PC
Liên quan đến việc tạo ra một chương trình hợp ngữ, có một số khái niệm:
- Trình hợp dịch (Assembler): là một chương trình chuyển đổi các chương trình mã nguồn từ hợp ngữ thành ngôn ngữ máy.
- Trình liên kết (Linker): là một chương trình có khả năng tập hợp các tệp tin đã được hợp dịch lại thành một tệp tin mã máy.
- Trình gỡ rối (Debuger): Là một chương trình có khả năng dịch ngược các lệnh của một chương trình mã máy. Nó còn cho phép người lập trình thực hiện sửa lỗi thuật toán cho các chương trình mã máy.
3.1.2. So sánh hợp ngữ với các ngôn ngữ bậc cao
Hợp ngữ là một ngôn ngữ lập trình sử dụng các lệnh của bộ vi xử lý, vì vậy, nó khó hơn so với các ngôn ngữ lập trình bậc cao. Mặt khác, hợp ngữ có thể tác động trực tiếp tới cấu trúc bộ vi xử lý và các thành phần phần cứng khác mà các ngôn ngữ lập trình khác khó có thể thực hiện được.
Một chương trình viết bằng hợp ngữ thường có kích thước nhỏ hơn một chương trình viết bằng ngôn ngữ bậc cao có cùng chức năng.
Việc dịch và chạy một tệp chương trình nguồn của hợp ngữ cũng phức tạp hơn so với một chương trình viết bằng ngôn ngữ bậc cao.
Việc lập trình bằng hợp ngữ thường khó, nhưng chúng ta cũng sẽ hiểu rõ hơn về việc xử lý của máy tính và hiểu rõ nguyên tắc của việc lập trình trong các ngôn ngữ bậc cao.
3.2. CÁC ĐOẠN TRONG MỘT CHƯƠNG TRÌNH
Một chương trình khi thực hiện, nó sẽ được nạp vào bộ nhớ với 3 đoạn: Đoạn mã, đoạn ngăn xếp và đoạn dữ liệu. Mỗi đoạn này có thể có độ dài tối đa là 64K với địa chỉ đầu đoạn là 0000h và địa chỉ offset cuối của đoạn là FFFFh.
Trong đó:
a/ Đoạn mã được sử dụng để chứa các mã lệnh của chương trình với các mã lệnh nhị phân. Thường người ta sử dụng cặp thanh ghi CS:IP để truy xuất tới các ô nhớ chứa lệnh cần thao tác.
Trong lập trình với hợp ngữ, người ta có thể mô tả đoạn mã với việc khai báo vị trí bắt đầu của đoạn là:.CODE
b/ Đoạn dữ liệu
Đoạn này được sử dụng để chứa các dữ liệu của chương trình. Mỗi một biến sử dụng đều được chương trình dịch chuyển thành một địa chỉ ô nhớ nhất định và tại vị trí của ô nhớ này sẽ chứa nội dung của biến khi thực hiện chương trình.
Trong lập trình với hợp ngữ, người ta có thể mô tả đoạn dữ liệu với việc khai báo vị trí bắt đầu của đoạn là:.DATA
c/ Đoạn ngăn xếp
Đoạn này được sử dụng để chứa dữ liệu truy xuất theo phương thức "Vào trước Ra sau - First In Last Out - FILO"
Trong lập trình với hợp ngữ, người ta có thể mô tả đoạn ngăn xếp với việc khai báo bằng một tên:.Stack với độ dài đoạn ngăn xếp. Thường thì độ dài tối đa là 256 byte.
3.3. CẤU TRÚC CHUNG CỦA MỘT LỆNH ASSEMBLY
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:
[Tên] [Mã lệnh] [Các toán hạng] [;chú thích]
Trong đó:
Tên - có thể là tên một chương trình con, một macro, một nhãn hoặc một thành phần nào đó.
Mã lệnh - 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à các lệnh giả thì đây là các dẫn hướng của chương trình dịch. Ví dụ PROC, MACRO, ENDP, ENDM, SEGMENT, ENDS...
Các toán hạng - 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 chính là các toán hạng của lệnh. Với bộ vi xử lý 8086/8088, các toán hạng này có thể là 0,1 hoặc 2.
Nếu là các 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ào thanh ghi AL.
Với ví dụ trên, thi lap la tên một nhãn và kết thúc bằng dấu (:); ADD là lệnh thực hiện phép cộng; AL và [BX] là hai toán hạng với qui đị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.
3.4. KHAI BÁO DỮ LIỆU VÀ KIỂU DỮ LIỆU
Như chúng ta đã thấy qua hai ví dụ trên, khi khai báo dữ liệu cho chương trình, người ta thường sử dụng toán tử DB. Nhưng, trên thực tế, các toán tử khác cũng có thể được dùng đến để khai báo cho các dữ liệu có kiểu khác nhau.
DB - Define Byte - Định nghĩa biến kiểu Byte
DW - Define Word - Định nghĩa biến kiểu Word
DD - Define Double Word - Định nghĩa biến kiểu Double Word
DT - Define Ten Byte - Định nghĩa biến kiểu 10 byte
EQU - Equal (Bằng) - Khai báo một hằng, địa chỉ cổng xác định.
Vậy, chúng ta có thể sử dụng các toán tử trên để khai báo cho các biến và hằng ra sao? Thể hiện các dạng cấu trúc dữ liệu như thế nào?
3.4.1. 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 BD giá_trị_khởi_tạo
Ví dụ: so1 DB 3Eh
Trong ví dụ trên, so1 là một biến kiểu byte có giá trị khởi tạo là 3Eh. Song, đôi khi chúng ta không cần thiết phải khởi tạo giá trị cho biến, có thể sử dụng cách khai báo sau:
so2 DB ?
Cũng như các ngôn ngữ lập trình khác, một biến kí tự cũng được coi là một biến kiểu byte với mỗi một kí tự được thể hiện bằng mã ASCII của chúng từ 0 - FFh
Giả sử, muốn khai báo một biến kí tự và khởi tạo giá trị bằng ‘A’, ta có thể thực hiện bằng một trong hai cách sau:
Ch DB ‘A’ ;khởi tạo trực tiếp giá trị ‘A’
Hoặc: Ch DB 41h ;khởi tạo thông qua mã ASCII của ‘A’
3.4.2. Biến word
Để khai báo biến kiểu từ (Word), chúng ta có thể sử dụng cú pháp sau:
tên DW giá_trị_khởi_tạo
Cũng giống như việc khai báo biến kiểu byte, giá_trị_khởi_tạo có thể là dấu (?) để không khởi tạo giá trị cho biến.
Ví dụ:
1/ w1 DW 3FB4h ;khai báo biến w1 với giá trị khởi tạo là 3FB4h
2/ w2 DW ? ;không khởi tạo giá trị cho biến w2
3.4.3. Biến mảng
Mảng là một danh sách (dãy) các phần tử có cùng một kiểu với các giá trị (có thể) khác nhau. Vì vậy, để khai báo một mảng, chúng ta có thể thực hiện theo cú pháp sau:
Tên DB danh_sách_giá_trị_khởi_tạo ;khai báo mảng các phần tử kiểu byte
Tên DW danh_sách_giá_trị_khởi_tạo ;khai báo mảng các phần tử kiểu word
Ví dụ 1: mang1 DB 30,55,73,88,33
Giả thiết, mang1 được nạp vào bộ nhớ tại địa chỉ offset 23E5h. Khi đó, mảng này sẽ có các phần tử được khởi tạo và hình ảnh của chúng trong bộ nhớ như sau:
-
Tên phần tử
|
Giá trị khởi tạo
|
địa chỉ bộ nhớ
|
Mang10
Mang11
Mang12
Mang13
Mang14
|
30
55
73
88
33
|
23E5h
23E6h
23E7h
23E8h
23E9h
|
Ví dụ 2: mang2 DW 2BA3h,2748h,9843h,1F3Bh
Cũng với giả thiết mang2 được nạp vào bộ nhớ tại địa chỉ offset 23E5h. Khi đó hình ảnh của mảng này sẽ là:
-
Tên phần tử
|
Giá trị khởi tạo
|
địa chỉ bộ nhớ
|
Mang20
Mang22
Mang24
Mang26
|
2BA3h
2748h
9843h
1F3Bh
|
23E5h
23E7h
23E9h
23EBh
|
Chúng ta cũng có thể khởi tạo các giá trị liên tiếp giống nhau. Khi đó, ta cũng có thể sử dụng toán tử DUP. Ví dụ:
Mang3 DB 100 DUP(5Ch)
Mang3 là một mảng có 100 phần tử với các giá trị khởi tạo của các phần tử đều là 5Ch
Mang4 DB 3,4,2,10 DUP(0)
Mang4 có 13pt trong đó 3 phần tử đầu lần lượt là 3,4,2; các phần tử còn lại có giá trị 0.
Với mảng hai chiều, việc định nghĩa chúng có thể thực hiện theo cú pháp sau:
Tên DB (DW) giá_trị_khởi_tạo_hàng_1
giá_trị_khởi_tạo_hàng_2
.......................................
giá_trị_khởi_tạo_hàng_n
Ví dụ:
Mang_2_chieu DB 10 DUP(0)
10 DUP(50)
10 DUP(100)
10 DUP(150)
Khai báo một mảng hai chiều có 4 hàng 10 cột với giá trị khởi tạo của hàng 0 là 0, hàng 1 là 50, hàng 2 là 100, hàng 3 là 150.
3.4.4. Biến chuỗi
Biến chuỗi hay xâu kí tự thực chất chỉ là một mảng (1 chiều) các phần tử là các kí tự trong đó mỗi kí tự có thể được biểu diễn bằng một số là mã ASCII hoặc là kí tự nằm trong dấu ' ' hoặc " ". Vì vậy, ta có thể khai báo bằng một trong các cách sau:
Xau1 DB 'Chao'
Xau2 DB 'C','h','a','o'
Xau3 DB 43h,68h,61h,6Fh
3.5. KHUNG CỦA MỘT CHƯƠNG TRÌNH ASSEMBLY
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:
3.5.1. 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 (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
.STACK
.DATA
.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
|
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 64K
|
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 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ạ 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! $'
hoi DB 'Cac ban muon hoc mon Vi xu ly khong? $'
.CODE
main PROC
MOV AX,@DATA ;Nap du lieu
MOV DS,AX ;cho DS
;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
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
;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.
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 hoc mon Vi xu ly khong? $'
Continue:
Main PROC
;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
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 VÀ CHẠY 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 tên_tệp[.phần_mở_rộng]
Hoặc: TASM 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ể quay lại bước 1 để sửa tệp nguồn và dịch lại cho đến khi không có lỗi.
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 tệp_đt1[+tệp_đt2+...+tệp_đtn]
Hoặc: TLINK 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 tên_tệp_exe 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
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
Bước 3: Liên kết các tệp *.OBJ thành tệp chương trình.
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
Chia sẻ với bạn bè của bạn: |