Kỹ thuật vi xử lý - Chương 3 pot - Pdf 19

Trờng đại học kỹ thuật Công Nghiệp
Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính

28

http://
www.ebook.edu.vn
Chơng 3 Lập trình bằng hợp ngữ cho 8088 trên máy tính IBM PC và các
máy tơng thích IBM PC

1. Giới thiệu chung
Sau khi đã giới thiệu một số lệnh cơ bản của bộ vi xử lý 8088 ta sẽ dùng các lệnh
đó để lập trình dùng hợp ngữ trên các máy tính IBM PC (hoặc các máy tơng thích máy
IBM PC). Vì loại máy tính này có cấu trúc tiêu biểu của một hệ vi xử lý, hơn nữa ta cũng có
thể sử dụng nhiều chức năng sẵn có cho chơng trình 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 và của BIOS. Có thể sử dụng chơng trình
dịch hợp ngữ MASM 5.10 (Macro Assembler phiên bản 5.10) của Microsoft với các định
nghĩa đoạn đơn giản và chế độ bộ nhớ nhỏ. Ngoài ra ta cũng có thể sử dụng chơng trình
dịch hợp ngữ TASM 2.0 (Turbo Assembler phiên bản 2.0) của Borland International để
thực hiện dịch chơng trình của chúng ta.
Ngôn ngữ assembly (hợp ngữ)
Các chơng trình thực hiện chuyển đổi chơng trình của ngời sử dụng đợc viết
bằng một ngôn ngữ nào đó sang một ngôn ngữ khác đợc gọi là chơng trình dịch
(translate). Ngôn ngữ đợc sử dụng để viết chơng trình nguồn đợc gọi là ngôn ngữ
nguồn còn ngôn ngữ của chơng trình mà do chơng trình nguồn chuyển sang đợc gọi là
ngôn ngữ đích.
Ngời ta đã phân chơng trình dịch làm 2 loại dựa trên mối quan hệ giữa ngôn ngữ
nguồn và ngôn ngữ đích nh sau:
- Khi ngôn ngữ nguồn về căn bản là một sự biểu diễn bằng ký hiệu cho một ngôn
ngữ máy bằng số thì chơng trình dịch đợc gọi là assembler và ngôn ngữ nguồn
đợc gọi là ngôn ngữ assembly (hợp ngữ).

trình bằng ngôn ngữ máy nữa.
Ngoài sự tơng ứng (ánh xạ) 1 - 1 của các lệnh assembly vào các lệnh máy, ngôn
ngữ assembly còn có một tính chất khác nữa làm cho nó khác hẳn các ngôn ngữ lập trình
bậc cao, đó là ngời lập trình bằng ngôn ngữ assembly có thể truy cập tới tất cả các đặc
điểm trong máy tính vật lý. Ví dụ, nếu có một bit báo tràn số (Overflow bit) thì chơng trình
bằng ngôn ngữ assembly có thể truy cập và kiểm tra trực tiếp bit này, trong khi đó chơng
trình bằng ngôn ngữ bậc cao (Pascal, C . . .) không thể làm đợc việc đó.
Một sự khác biệt lớn và quan trong nữa giữa chơng trình assembly và chơng trình
bằng ngôn ngữ bậc cao là chơng trình bằng ngôn ngữ assembly chỉ có thể chạy đợc trên
một họ máy, trong khi đó chơng trình đợc viết bằng ngôn ngữ bậc cao nói chung có thể
chạy đợc trên nhiều họ máy, đây chính là một u điểm lớn của ngôn ngữ bậc cao so với
ngôn ngữ assembly.
Nói chung, tất cả các việc có thể thực hiện đợc bằng ngôn ngữ máy đều có thể thực
hiện đợc bằng ngôn ngữ assembly, tuy nhiên ngôn ngữ bậc cao không làm đợc nh vậy
một cách hiệu quả.
Khi xây dựng các ứng dụng lớn, thông thờng ngời ta chọn ngôn ngữ bậc cao vì nó
hớng tới thuật toán giải quyết vấn đề (Ngôn ngữ hớng bài toán - problem-oriented
language) mà không chọn ngôn ngữ assembly vì khi đó ngời lập trình phải chú ý tới các
chi tiết nhỏ nhặt khi lập trình. Ngợc lại, khi xây dựng các chơng trình nhỏ thực hiện các
thao tác can thiệp sâu vào phần cứng máy tính thì ngời ta thờng chọn ngôn ngữ
assembly vì tính tối u, hiệu quả và khả năng mạnh mẽ của nó.
2. Giới thiệu khung chơng trình
Với bất kỳ ngôn ngữ nào, khi ta lập trình bằng ngôn ngữ đó ta cũng phải tuân thủ
chơng trình viết đúng cú pháp, quy định khung chơng trình. Từ đó chơng trình mới đợc
dịch ra mã máy, rồi mới tạo ra các chơng trình chạy đợc (phần mở rộng: *.EXE hoặc
*.COM).
Một chơng trình hợp ngữ bao gồm các dòng lệnh, mỗi lệnh đợc viết trên một dòng
- Một dòng lệnh có thể là lệnh thật dới dạng gợi nhớ (nmenomic) hay dạng ký hiệu
(symbolic) của bộ vi xử lý.
- Hoặc hớng dẫn chơng trình dịch (Essembler directive).

Tên và nhãn sẽ đợc chơng trình dịch gán bằng các địa chỉ cụ thể của ô nhớ.
Quy tắc đặt tên (cũng khá giống nh quy tắc đặt tên trong ngôn ngữ Pascal)
- Dùng các ký tự thuộc bộ chữ cái (không phân biệt chữ hoa, chữ thờng)
- Không đợc bắt đầu bằng chữ số, không đợc chứa dấu cách
- Độ dài: 1 21 ký tự
- Có thể sử dụng các ký tự đặc biệt nh: ?, ., _, @, $, %
- Trong trờng hợp nếu dùng dấu chấm (.), thì nó phải đợc đặt ở vị trí đầu tiên
của tên hoặc nhãn.
- Nhãn thờng kết thúc bằng dấu hai chấm (;)
Trờng mã lệnh
Trờng này gồm mã các lệnh thật hoặc giả (hớng dẫn chơng trình dịch)
- Lệnh thật: lệnh dạng gợi nhớ (nmemonic) của bộ vi xử lý. Lệnh này sẽ đợc
chơng trình dịch dịch ra mã máy.
- Hớng dẫn chơng trình dịch thì không đợc dịch.
Trờng các toán hạng
Trờng này là dữ liệu cho các thao tác
Tuỳ từng lệnh cụ thể mà có thể có 2, 1 hoặc không có toán hạng nào
Ví dụ:
Mov al, al ;Lệnh này có 2 toán hạng
Rol bx, cl ;Lệnh này có 2 toán hạng
Not bl ;Lệnh này có 1 toán hạng
Ret n ;Lệnh này có 1 toán hạng
Ret ;Lệnh này không có toán hạng nào
Sti ;Lệnh này không có toán hạng nào
Nop ;Lệnh này không có toán hạng nào
Với hớng dẫn chơng trình dịch, trờng này 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 đại học kỹ thuật Công Nghiệp

Với kiểu ký tự, ngoài cách trên ta còn có thể dùng mã ASCII của ksy tự đó.
Ví dụ:
'0' ;Ký tự 0
30h ;Mã ASCII của ký tự 0
Với 2 cách viết trong ví dụ trên là nh nhau đối với chơng trình dịch assembler.
c. Biến và hằng
Một biến bất kỳ đợc sử dụng trong chơng trình hợp ngữ phải đợc định nghĩa,
chơng trình dịch sẽ gán cho biến đó một địa chỉ xác định trong bộ nhớ.
Biến đơn
Một biến đơn trong chơng trình hợp ngữ đợc định nghĩa theo mẫu sau:

Tên_biến Kiểu Giá trị khởi tạo

Tên: do ngời sử dụng tự đặt theo quy tắc đặt tên
Kiểu: là kích thớc (phạm vi) biểu diễn của biến. Có các kiểu sau:
DB (Define Byte): Kiểu byte (1 byte)
DW (Define Word): Kiểu word (2 byte)
DD (Define Double Word): Kiểu double word (4 byte)
DF (Define Farword): Kiểu farword (6 byte),
chỉ dùng với bộ vi xử lý 80386
DQ (Define Quadword): Kiểu Quadword (8 byte)
Trờng đại học kỹ thuật Công Nghiệp
Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính

32

http://
www.ebook.edu.vn
DT (Define Ten byte): Kiểu Ten byte (10 byte)
Trong một biến có kích tớc lớn hơn 1 byte thì byte cao ở địa chỉ cao, byte thấp

Ar1 dw 100 DUP(5)
;Định nghĩa một biến có tên là Ar1, gồm 100 phần tử, mỗi phần tử có kích
;thớc 2 byte (gồm 200 byte đợc dành chỗ cho nó trong bộ nhớ từ địa chỉ ứng
;với Ar1 để chứa với cùng một giá trị khởi đầu cho mỗi 2 byte (word) là 5).
;Phần tử đầu tiên của mảng có địa chỉ trùng với địa chỉ của Ar1, các phần tử
tiếp ;theo có địa chỉ Ar1+2, Ar1+4, Ar1+6, . . .

Ar2 dd 20 DUP(?)
;Định nghĩa một biến có tên là Ar2, gồm 20 phần tử, mỗi phần tử có kích thớc
;4 byte (gồm 80 byte đợc dành chỗ cho nó trong bộ nhớ từ địa chỉ ứng với Ar2
;và cha đợc khởi đầu giá trị). Phần tử đầu tiên của mảng có địa chỉ trùng với
;địa chỉ của Ar, các phần tử tiếp theo có địa chỉ Ar2+4, Ar2+8, Ar2+12, . . .
Đặc biệt ta có thể dùng toán tử DUP lồng nhau để khởi đầu giá trị các phần tử
của mảng.
Ví dụ:
Ar3 db 2, 2, 2 DUP(1, 3 DUP(5), 4)
Trờng đại học kỹ thuật Công Nghiệp
Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính

33

http://
www.ebook.edu.vn
;Định nghĩa một biến có tên là Ar3, gồm 12 phần tử, mỗi phần tử có kích thớc
1 byte (gồm 12 byte đợc dành chỗ cho nó trong bộ nhớ từ địa chỉ ứng với Ar3
để chứa các giá trị khởi đầu cho mỗi byte). Phần tử đầu tiên của mảng có địa
chỉ trùng với địa chỉ của Ar3, các phần tử tiếp theo có địa chỉ Ar3+1, Ar3+2, . . .
Dãy thứ tự giá trị các phần tử là: 2, 2, 1, 5, 5, 5, 4, 1, 5, 5, 5, 4
Biến xâu
Biến kiểu xâu ký tự là trờng hợp dặc biệt của biến mảng mà các phần tử của

- Vùng mã lệnh: Dùng để chứa mã lệnh của chơng trình.
- Vùng ngăn xếp: Dùng để phục vụ cho các hoạt động của chơng trình nh
gọi chơng trình con, trở về chơng trình chính từ chơng trình con.
Một chơng trình hợp ngữ cũng có cấu trúc nh vậy, để 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 (có cấu trúc giống nh vậy).
Chúng ta sẽ khai báo quy mô sử dụng bộ nhớ đối với các vùng nhớ đó để sử dụng
một cách phù hợp, tiết kiệm, hiệu quả và đúng với cấu trúc chơng trình.
Khai báo quy mô sử dụng bộ nhớ
Khai báo này xác định kích thớc cho đoạn mã và dữ liệu của chơng trình.
Trờng đại học kỹ thuật Công Nghiệp
Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính

34

http://
www.ebook.edu.vn
Sử dụng hớng dẫn chơng trình dịch .Model đặt trớc các hớng dẫn khác
trong chơng trình theo mẫu nh sau:

.Model Kích_thớc

Ví dụ:
.Model Small
.Model Tiny
Có các kiểu Kích_thớc bộ nhớ cho chơng trình hợp ngữ nh sau:
- Tiny (hẹp): Mã lệnh và dữ liệu nằm gọn trong một đoạn
- Small (nhỏ): Mã lệnh trong một đoạn, dữ liệu trong một đoạn
- Medium (Trung bình): Mã lệnh hơn một đoạn, dữ liệu trong một đoạn
- Compact (Gọn): Mã lệnh trong một đoạn, dữ liệu hơn một đoạn
- Large (Lớn), Huge (Rất lớn - khổng lồ): Mã lệnh và dữ liệu hơn một đoạn.

.Code
Tên_CTC Proc
Các lệnh ;Các lệnh của thanh chơng trình chính
Trờng đại học kỹ thuật Công Nghiệp
Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính

35

http://
www.ebook.edu.vn
Call Tên_ctc ;Gọi chơng trình con
.
.
.
Tên_CTC Endp
Tổng quát: Một thủ tục đợc định nghĩa nhờ cặp thủ tục 'Proc - Endp ', chơng
trình chính cũng là một thủ tục đợc định nghĩa nh trên. Lệnh giả Proc dùng để báo
bắt đầu một thủ tục và lệnh giả Endp dùng để báo kết thúc thủ tục đó. Một chơng
trình con cũng đợc định nghĩa dới dạng một thủ tục nhờ các lệnh giả 'Proc - Endp '
nh sau:
Tên_ctc Proc
Các lệnh của chơng trình con ở đây
Ret
Tên_ctc Endp
Chú ý: Trong chơng trình con, tại cuối chơng trình có lệnh Ret là lệnh trở về
chơng trình chính từ chơng trình con.
Để kết thúc toàn bộ chơng trình, ta dùng hớng dẫn chơng trình dịch End nh
sau:
End Tên_CTC
Khung của chơng trình hợp ngữ để dịch ra chơng trình *.exe

Mov ds, ax
Mov es, ax
Trờng đại học kỹ thuật Công Nghiệp
Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính

36

http://
www.ebook.edu.vn
của Intel, vì lý do kỹ thuật mà chúng không cho phép chuyển giá trị số (chế độ địa chỉ
trực tiếp) vào các thanh ghi đoạn nên ta phải dùng thanh ghi ax làm trung gian.
Thanh ghi ax cũng có thể thay thế bằng các thanh ghi đa năng khác.
@Data là tên của đoạn dữ liệu, .Data dđịnh nghĩa bởi hớng dẫn chơng trình
dịch chơng trình dịch sẽ dịch tên @Data thành giá trị địa chỉ của đoạn dữ liệu.
Chơng trình ví dụ1.asm để dịch ra *,exe, thực hiện xuất một dòng ký tự lên
màn hình. Dòng ký tự ở đây là lời chào bất kỳ đợc hiện giữa 2 dòng trống:
.Model Small
.Stack 100
.Data
Chao db 'Xin chao, chuc mung ban da thanh cong voi chuong trinh dau tay$'
Crlf db 0dh, 0ah, '$'
.Code
Vidu1 Proc
Mov ax, @Data ;Lấy địa chỉ của đoạn dữ liệu
Mov ds, ax ;Khởi tạo đoạn dữ liệu
Mov es, ax
;Về đầu dòng mới dùng hàm 9 của ngắt 21h để "hiển thị" cặp ký tự
;xuống dòng (lf: line feed) và về đầu dòng (cr: carriage return)
Mov ah, 9
Lea dx, crlf


http://
www.ebook.edu.vn
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ả không
gian nhớ khi phải lu trữ chúng trên bộ nhớ ngoài (đĩa từ).
Để có thể tạo ra đợc chơng trình với phần mở rộng .com thì chơng trình
nguồn hợp ngữ phải có kết cấu thích hợp, một ví dụ nh sau:
.Model Tiny
.Code
ORG 100h
Start: Jmp Continue
;Định nghĩa các biến, mảng, hằng ở đây
Continue:
Tên_CTC Proc
;Các lệnh của chơng trình chính
;Trở về DOS dùng ngắt 20h
Int 20h
Tên_CTC Endp
;Các chơng trình con nếu có đợc định nghĩa ở đây
End Start

Nhìn vào khung chơng trình hợp ngữ để dịch ra chơng trình .com ta thấy
không có khai báo đoạn ngăn xếp và đoạn dữ liệu, khai báo quy mô sử dụng bộ nhớ
là Tiny (tuy nhiên có thể sử dụng quy mô bộ nhớ là Small). ở đầu đoạn mã có lệnh
giả Org (Origin: điểm xuất phát) và lệnh Jmp (nhảy). Lệnh Org 100h dùng để gán điạ
chỉ bắt đầu cho chơng trình là 100h trong đoạn mã, bỏ qua vùng nhớ kích thớc
100h (256 byte) cho đoạn mào đầu (PSP) từ địa chỉ 0 đến địa chỉ 255.
Lệnh Jmp dùng để nhảy qua phần bộ nhớ dành cho việc định nghĩa các dữ liệu
(về nguyên tắc, dữ liệu có thể đợc đặt ở đầu hoặc cuối đoạn mã nhng ở đây, nó
đợc đặt ở đầu để có thể áp dụng các định nghĩa đơn giản đã nói). Đích của lệnh

.Code
ORG 100h
Start: Jmp Continue
Chao db 'Xin chào . . .$'
Crlf db 0dh, 0ah,'$'
Continue:
Main Proc
Mov ah, 9 ;Về đầu dòng mới dùng hàm 9 của ngắt 21h
Lea dx, Crlf
Int 21h ;Hiển thị lời chào
Mov ah, 9
Lea dx, Chao
Int 21h
Mov ah, 9 ;Về đầu dòng mới dùng hàm 9 của ngắt 21h
Lea dx, Crlf
Int 21h
Int 20h ;Trở về DOS dùng ngắt 20h
Main Endp
;Các chơng trình con nếu có đợc định nghĩa ở đây
End Start
3. Cách tạo và cho chạy một chơng trình hợp ngữ
Các bớc thực hiện việc tạo ra và cho chạy một
chơng trình hợp ngữ nh sau:
i. Soạn thảo văn bản chơng trình nguồn (dùng các
phần mềm soạn thảo nh: SK, NCedit, Bked, Turbo
Pascal, . . .), nên dùng NCedit cho đơn giản. Tệp
chơng trình nguồn này phải đợc gán phần mở rộng
là .asm.
ii. Dùng chơng trình dịch MASM (hoặc TASM) để dịch
tệp *.asm ra mã máy dới dạng *.obj. Nếu trong

Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính

39

http://
www.ebook.edu.vn
4. Các cấu trúc lập trình cơ bản trong assembly
Thông thờng trong thực tế, ngời ta thờng phân tích bài toán và thiết kế chơng
trình (hệ thống nói chung) bằng phơng pháp thiết kế từ trên xuống (top-down) tơng ứng
với kỹ thuật lập trình có cấu trúc.
Nội dung của phơng pháp là chia bài toán tổng thể (hay chơng trình đang thiết kế)
thành những bài toán nhỏ hơn (có thể là các khối chức năng). Các bài toán nhỏ này lại
đợc chia thành các bài toán nhỏ hơn nữa cho đến khi mỗi bài toán nhỏ này trở thành
những bài toán đơn giản, dễ thực hiện.
Việc lập trình giải quyết bài toán nhỏ để tạo thành khối chức năng thành phần ngời
ta thờng sử dụng các cấu trúc lập trình cơ bản để thực hiện nhiệm vụ các khối đó. Với
cách tiến hành nh vậy làm cho chơng trình viết ra trở thành có cấu trúc, mang theo
những u điểm là rõ ràng, dễ phát triển, dễ hiệu chỉnh hoặc cải tiến và nâng cấp.
Khi phân tích và viết chơng trình để giải quyết các công việc khác nhau ta có 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 lựa chọn
if dk then s1 [else s2]
case V of . . . [else]
Cấu trúc lặp
while dk do s
repeat s1, s2, . . ., sn until dk
for index=v1 to v2 do s
Các cấu trúc lập trình cơ bản trên đều có một đặc điểm là tính cấu trúc. Chỉ có
một lối vào cấu trúc và một lối ra cấu trúc đó.


vào

Trờng đại học kỹ thuật Công Nghiệp
Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính

40

http://
www.ebook.edu.vn
shl ax,cl ;ax*4
mov ax,cx ;lu kết quả sang cx
mov al,bl ;nạp biến b vào al
mul bl ;ax al*bl
sub ax,cx ; ax ax-cx, ax chứa kết quả của biểu thức b
2
4ac
b. Cấu trúc lựa chọn
if dk then cv
Nếu điều kiện (dk) cho giá trị đúng thì thực hiện cv (công
việc). Ngợc lại công việc bị bỏ qua. Để thực hiện điều này, ta sử
dụng cặp lệnh so sánh (cmp) và lệnh nhẩy có điều kiện để nhẩy
qua một số lệnh (công việc nào đó) trong chơng trình hợp ngữ.
Ví dụ:
Nhập một ký tự từ bàn phím, kiểm tra xem nếu ký tự đó không
là ký tự điều khiển thì hiển thị lên màn hình ở đầu dòng tiếp theo,
ngợc lại (là ký tự điều khiển) thì không làm gì và ra khỏi cấu trúc.
mov ah,1 ;Nhập 1 ký tự
int 21h ;bằng hàm 2 của ngắt 21h
mov bl,al ;Cất mã ASCII của ký tự nhận đợc

cv

ra

vào

dk

đ

s

cv1

ra

vào

dk

đ

s

cv2

Trờng đại học kỹ thuật Công Nghiệp
Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính

41

Tb1: ;Hiển thị thông báo 1
jmp Ra ;hiển thị xong thì ra khỏi cấu trúc
Tb2: ;Hiển thị thông báo 2
jmp Ra ;hiển thị xong thì ra khỏi cấu trúc
Tb3: ;Hiển thị thông báo 3
jmp Ra ;hiển thị xong thì ra khỏi cấu trúc
Tb4: ;Hiển thị thông báo 4
Ra: ;Ra khỏi cấu trúc
d. Cấu trúc For do
Đây là vòng lặp với số lần lặp n biết trớc. Ban đầu biến chỉ
số lần lặp k đợc gán bằng không, chừng nào nó còn nhỏ hơn n
thì thực hiện lặp lại công việc (cv), k đợc tăng 1 sau mỗi lần thực
hiện cv.
Trong sơ đồ bên, ta có thể đặt biến chỉ số k=n và kiểm tra
xem sau mỗi lần lặp (thực hiện cv) thì k>0? Sẽ còn lặp khi biểu
thức so sánh này là đúng, tất nhiên k sẽ đợc giảm 1 sau mỗi lần
lặp. Điều này hoàn toàn phù hợp với sự làm việc của lệnh LOOP
mà chúng ta đã biết.

Ví dụ:
Hiển thị lên màn hình 80 dấu * trên một dòng
mov ah,2 ;Dùng hàm 2 của ngắt 21h
ra

vào

n1

E



http://
www.ebook.edu.vn
mov dl,'*' ;để hiển thị ký tự
mov cl,80
for: int 21h
loop for
e. Cấu trúc While do
Đây là vòng lặp với số lần lặp không biết trớc. Chừng nào
biểu thức điều kiện còn đúng thì thực hiện lặp lại công việc (cv),
để đảm bảo cho tính dừng của giải thuật thì công việc (cv) phải
có sự tác động đến dk dới hình thức nào đó.
Nhìn vào sơ đồ khối của vòng lặp này ta thấy rất giống với
cấu trúc của vòng lặp for - to tuy nhiên ta không thể dùng lệnh
LOOP để điều khiển cho vòng lặp này vì lệnh LOOP lặp lại đoạn
chơng trình do NHAN chỉ ra với số nguyên lần đợc xác định
trớc trong thanh ghi CX. Ta sẽ sử dụng các lệnh nhảy có điều
kiện để điều cho vòng lặp này.
Ví dụ:
Tính tổng ax = 1+4+7+ . . .
Cộng cho đến khi ax> 100
xor ax,ax ;Ban đầu tổng tích luỹ bằng 0
mov bx,1 ;Đặt phần tử đầu tiên vào thanh ghi bx
while: cmp ax,100 ;Kiểm tra điều kiện (yêu cầu) của bài toán
ja End_while ;ax>100 (đúng), ra khỏi cấu trúc (có thể dùng jnbe)
add ax,bx ;ngợc lại, cộng tiếp
add bx,3 ;chuyển lên phần tử tiếp theo của dãy
jmp while ;Sau khi cập nhật ax, kiểm tra lại điều kiện của bài toán
End_while: Ra khỏi cấu trúc
f. Cấu trúc Repeat until


vào

đ

s

cv

dk

ra

Trờng đại học kỹ thuật Công Nghiệp
Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính

43

http://
www.ebook.edu.vn
5. Truyền tham số
Khi xây dựng các ứng dụng cụ thể, ta cần quan tâm tới việc truyền tham số giữa
chơng trình chính cho chơng trình con hoặc giữa các modul chơng trình với nhau. Với
assembly, ngời ta thờng dùng các cách truyền sau:
Truyền tham số qua thanh ghi (truyền tham trị)
Truyền tham số qua ô nhớ (biến)
Truyền tham số qua ô nhớ có địa chỉ trong một thanh ghi nào đó (tham biến)
Truyền tham số qua ngăn xếp (stack).
Các ví dụ minh hoạ:
6. Các ví dụ cụ thể

3 Xác định vị trí và kích
thớc hiện thời của con
trỏ.
ah=3; bh=số trang; ch=dòng quét đầu;
cl=dòng quét cuối;
dh=dòng; dl=cột
5 Chọn trang hiển thị. ah=5; al=số trang;
dh=dòng; dl=cột
Không
6 Cuốn màn hình hay cửa
sổ lên một số dòng xác
định.
ah=6; al=số dòng cuốn
(al=0 thì cuốn cả màn hình
hay cửa sổ); bh=thuộc tính
của các dòng trống;
(ch,cl)=(dòng,cột) góc trên
trái của cửa sổ;
(dh,dl)=(dòng,cột) góc dới
phải của cửa sổ
Không
7 Cuốn màn hình hay cửa
sổ xuống một số dòng
xác định.
ah=6; al=số dòng cuốn
(al=0 thì cuốn cả màn hình
hay cửa sổ); bh=thuộc tính
của các dòng trống;
(ch,cl)=(dòng,cột) góc trên
trái của cửa sổ;

0ch Viết điểm ảnh đồ hoạ
0dh Đọc điểm ảnh đồ hoạ
0eh Viết ký tự trong chế độ
telex

0fh Xác định chế độ màn
hình

10h (hàm
con 10h)
Thiết lập thanh ghi màu
10h (hàm
con 12h)
Thiết lập nhóm các
thanh ghi màu

10h (hàm
con 15h)
Xác định thanh ghi màu
10h (hàm
con 17h)
Lấy nhóm thanh ghi
màu

11h Xác định cấu hình của
thiết bị

12h Xác định kích thớc bộ
nhớ quy ớc


2 Lấy các cờ bàn phím ah=2; al=các cờ (8); al7=1:
Phím insert đợc ấn;
al6=1: Phím Caps Lock
đợc ấn; al5=1: Phím
Num Lock đợc ấn;
al4=1: Phím Scrol Lock
đợc ấn; al3=1: Phím Alt
đợc ấn; al2=1; Phím Ctrl
đợc ấn; al1=1: Phím Shif
trái đợc ấn; al0=1: Phím
Shif phải đợc ấn
10h Đọc ký tự tự bàn phím
(loại 101 phím)
ah=10h ah=scan code của phím;
al=mã ASCII của ký tự
17h
Máy in
0 Viết ký tự ra máy in

Trờng đại học kỹ thuật Công Nghiệp
Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính

45

http://
www.ebook.edu.vn
Các ngắt của DOS
Số hiệu
ngắt
Hàm Công dụng Tham số vào Tham số ra

tự kết thúc bằng $
Không
2ah Xác định ngày tháng ah=2ah; al=ngày (0=chủ nhật,
1=thứ hai, , 6=thứ bảy);
cx=năm (1980 2099);
dh=tháng (1 12); dl=ngày
(1 31)
2bh Đặt ngày tháng ah=2bh;
cx=năm(1980 2099);
dh=tháng (1 12);
dl=ngày (1 31)
al=00h nếu ngày hợp lệ;
al=ffh nếu ngày không
hợp lệ
2ch Xác định thời gian ah=2ch; ch=giờ (0 23);
cl=phút(0 59);
dh=giây (0 59); dl=phần
trăm giây(0 99)
2dh Đặt thời gian ah=2dh; ch=giờ (0 23);
cl=phút(0 59);
dh=giây (0 59); dl=phần
trăm giây(0 99)
al=00f nếu tgian hợp lệ;
al=ffh nếu thời gian không
hợp lệ
30h Xác định số phiên bản
của DOS hiện hành
ah=30h; bx=0000h; cx=0000h;
al=số chính của phiên
bản (trớc dấu chấm);

http://
www.ebook.edu.vn
35h Xác định vector ngắt
(nhận địa chỉ của một
vector ngắt)
ah=35h; al=số hiệu ngắt; es:bx=con trỏ trỏ đến
chơng trình phục vụ
ngắt
36h Xác định dung lợng
còn trống trên đĩa
ah=36h; dl=ổ đĩa
(0=default, 1=A, );
bx=số free cluster;
dx=số cluster/đĩa;
cx=số byte/sector;
ax=số sector/cluster,
=ffffh nếu ổ đĩa không
hợp lệ
39h Tạo th mục con
(MkDir)
ah=39h; ds:dx=con trỏ trỏ
đến một chuỗi ASCIIZ
(đờng dẫn-path)
ax=mã lỗi nếu CF=1
3ah Xoá thu mục con
(RmDir)
ah=3ah; ds:dx=con trỏ trỏ
đến một chuỗi ASCIIZ
(đờng dẫn-path)
ax=mã lỗi nếu CF=1

một thiết bị (chuyển một
số byte cho trớc từ một
tệp vào bộ đệm cho
trớc)
ah=3fh; bx=thẻ tệp;
ds:dx=địa chỉ bộ đệm;
cx=số byte đọc;
ax=số byte đọc đợc,
=mã lỗi nếu CF=1
40h Ghi vào một tệp hay vào
một thiết bị (chuyển một
số byte cho trớc từ bộ
đệm vào một tệp cho
trớc)
ah=40h; bx=thẻ tệp;
ds:dx=địa chỉ bộ đệm (dữ
liệu để viết); cx=số byte
đợc viết;
ax=số byte viết đợc,
=mã lỗi nếu CF=1
41h Xoá một tệp trong một
th mục đã định (Unlink)
Xoá một danh mục
tơng ứng với tên tệp
trong th mục
ah=41h; ds:dx=địa chỉ của
một ASCIIZ
ax=mã lỗi nếu CF=1,
không cónghĩa nếu CF=0
42h Di chuyển con trỏ

byte nhớ yêu cầu;
ax:0=địa chỉ khối nhớ cấp
phát;
ax=mã lỗi nếu CF=1;
ax không có nghĩa gì nếu
CF=0


Nhờ tải bản gốc
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status