ĐẠI HỌC QUỐC GIA
HN
TRUNG TÂM
T1IỎNG TIN • TH Ư VIỆN
004/22
V-GO
NHÀ XUẤT BẢN KHOA HỌC VÀ KỸ THUẬT
LẼ M Ạ N H THẠNH (chu biên)
NGUYỄN KIM TUẤN
HƯỚNG DẨN LẬP TRÌNH
VỚI ASSEMBLY
q p
NHÀ XUẤT BẢN KHO A HỌC V À KỸ THUẬT
HÀ N Ộ I -2001
M ỤC LỰC
•
*
Trang
LỜI NÓI DẦU...................................................................................................................5
Chương 1. NHẬP MÔN LẬP TRÌNH HỢP NGỮ........................................................ 7
I. Tóm tắt lý th u y ế t....................................................................................... 7
1.1. Cấu trúc của một chươngtrinh hợpngữ............................................ 7
1.2. Biến và khai báo bien....................................................................... 9
1.3. Giới thiệu một số toán tử..................................................................9
1.4. Giới thiệu một số hàm củangắt 21h...............................................11
1.5. Các ché độ địa c h ỉ.............................................................................14
1.6. Một số ví d ụ ...................................................................................... 15
II. Câu hỏi tự kiểm t r a ................................................................................16
III. Bài tập có lời giải................................................................................... 18
Phần bài giải..........................................................................................19
IV. Bài tập không lời g iả i............................................................................45
Chương 2. NGĂN XEP & CHƯƠNG TRÌNH CON...................................................... 46
I. Tóm tát lý th u y ết..................................................................................... 46
1.1. Ngăn xép (Stack)..............................................................................46
1.2. Chương trình con (Sub-Program)....................................................48
1.3. Truyền tham so cho chương trình con.............................................52
II. Câu hỏi tự kiểm t r a ................................................................................53
III. Bài tập có lời giải................................................................................... 54
Phần bài giải......................................................... ............................... 56
IV. Bài tập không lời g iả i............................................................................87
Chương 3. LẬP TRÌNH THƯỜNG TR Ú ...................................................................... 88
I. Tóm tắt lý thuyết.................................................................................... 88
4_____________________________________________________
_____HƯ ONG DAN LẠP TRINH VO I ASSEMBl EY
1.1. Vector ngắt và bảng vector n g á t......................................................88
1.2. Kỹ th u ật chặn n g ắt............................................................................ 89
1.3. Kỹ thuật lập trình thuồng tr ú .......................................................... 90
II. Câu hỏi tự kiểm tra ...................................................................................91
III. Bài tập có lời giải..................................................................................... 92
Phần bài giải........................................................................................... 93
IV. Bài tập không lời g iả i............................................................................132
Chương 4. LẬP TRÌNH TRÊN ĐÌA VÀ TÁP TIN ....................................................... 133
I. Tóm tắt lý th u y ế t..................................................................................... 133
1.1. Một số khái niệm ..............................................................................133
1.2. Bảng Partition và Master Boot...................................................... 135
1.3. Tổ chức lưu trừ thông tin trên đ ĩ a ................................................. 137
1.4. Giới thiệu một số hàm/ ngắt cúa D O S...........................................142
II. Bài tập có lời g iải.................................................................................... 146
Phần bài giải............................................................................................147
III. Bài tập không lời g iả i............................................................................182
PHỤ L Ụ C .........................................................................................................................183
TÀI LIỆU THAM KHẤO................................................................................................186
LÒI NÓI ĐẨU
Assembly (hợp ngữ) là một ngôn ngữ lập trình cấp thấp, tiếp cận với nó chúng
ta co nhiều điều kiện đê hiểu hơn vé cáu trúc máy tính và tổ chức hoạt động của các
hệ điều hành mà cụ thê là máy tính PC và hệ điều hành MS-DOS. Do đó Assembly
là một môn học bắt buộc đôi với sinh viên thuộc các chuyên ngành Công nghệ
Thông tin, Toán - Tin, Điện tử - Tin học,... cùa các trường Đại học, Cao đẳng trên
cả nước.
Hiện nay tài liệu viết về ngôn ngữ Assembly xuất hiện khá nhiều nhưng tài liệu
viết về hướng dẫn lập trinh Assembly thi rất hiếm. Đây là một trở ngại lớn đôi với
những sinh viên muốn tiếp cận với lập trình Assembly, bởi phong cách lập trinh
của Assembly co khác so với các ngôn ngữ lập trình cấp cao. Mặt khác, để lập trinh
dưực VỚI Assembly thi trước hết người lập trình phái có những hiểu biết nhất định
vè máy tinh và hệ điều hành.
Với lý do trên, chúng tôi biên soạn cuốn Hướng dan lập trìn h với Assembly.
Sách dược viết dưới dạng: đưa ra yêu cầu íđi' bài tập) lập trình, giới thiệu kiến thức
cần thiết chuẩn bị cho lập trinh và hướng dân các bước thực hiện, cuối cùng là đưa
ra mã lệnh đầy đu cứa chương trình. Đày sẽ là tài liêu bô ích chu những ai muốn
tiếp cận VỚI lập trinh Assembly cũng như muốn khai thác sâu hơn hệ thống máy
tính và hệ điều hành bằng ngôn ngữ Assembly.
Sách gồm bôn chương, mỗi chương đều được chia thành ba phần: Tóm tắt lý
thuyết, bài tập và hướng dẫn lập trình, bai tập đề nghị. Chương 1 hướng dẫn viết
các chương trình đơn giản nhằm củng cố lại những hiểu biết về thanh ghi, bộ nhớ,
các chê độ xác định địa chi bộ nhớ của CPU, các ngắt Ihàm của DOS và BIOS, ...
và những kiến thức cơ bán vể Assemblv. Đặc biệt la trong chương này chúng tôi
muôn các bạn làm quen với cấu trúc chương trinh dạng COM được viết cho chương
trình biên dịch AS6 (A86.com), đây là trình biên dịch mà chúng tôi dũng đê dịch
hầu như tất cả các chương trinh được viết trong sách này. Các chương trình ở
chương 2 nhằm giúp các bạn hiểu rõ hơn về cấu trúc và hoạt động của Stack và làm
quen với cách viết chương trinh con trong Assembly. Ngắl, kỹ thuật chặn ngắt và
kết hợp chặn ngắt trong lập trình thường trú bộ nhớ là mục tiêu của chương 3,
trong chương này chúng tôi muốn giới thiệu với các bạn một cấu trúc chương trình
b
H U Ớ N G DÂN LẬP TRÌNH VÓI ASSEMBLY
thường trú điên hình nhất giúp hạn cài đặt bảt kỳ một chương trinh thường trú nào
một cách đơn giản nhất và tránh được sự xung đột với các chương trinh khác, cỏ
thẻ nói chương 4 là chương dành riêng cho đỉa và tập tin, chương này giúp các bạn
hiếu rõ hơn vế đĩa và tô chức lưu trữ thông tin trẽn đĩa cũng như kỹ thuật truy xuất
đến các khôi thông sô quan trọng của đĩa.
Tuy đã rất cô gắng trong quá trinh biên soạn nhưng cuốn sách không thể tránh
khỏi những thiếu sót, chúng tôi rất mong nhận được nhữĩitĩ ý kiến đóng góp quý
báu cúa các bạn đồng nghiệp và quý độc giả.
Chúng tôi xin chăn thành cảm ơn quý thầy cô và các bạn sinh vién ở Khoa
Công nghệ Thông tin, Trường Đại học Khoa học H uế đả giúp đở và động viên chúng
tôi biên soạn cuốn sách này. Chúng tôi củng xin cảm ơn Nhà xuất bán Khoa học và
Kỹ thuãt đả giúp chúng tôi đưa cuốn sách này đến VỚI bạn đọc, đặc biệt là đến với
sinh viên của chúng tỏi.
Các tác giả
CHƯƠNG 1
NHẬP MÔN LẬP TRÌNH HỢP NGỮ
•
•
•
I. rÓM TẮT l ý t h u y ế t
1.1. c ấ u trú c c ủ a m ộ t ch ư ớ n g trìn h hdp n g ữ
a. Cấu trúc CT d ạ n g EXE
b. Cấu trúc CT d ạ n g COM
.Model
Small
.Model
•Stack
lOOh
■Code
Sraall
Org lOOh
•Data
;Các khai báo dữ liệu
•
<start>:
Jmp <Quadata>
Code
; Các kha i háo dữ liệu
<Main> Proc
<Quadata>:
;Các lệnh
; Các lệnh
<Main> Endp
End
End
cStart>
Chú ỷ:
•
Đối với chương trình dạng EXE có khai báo đoạn data, nên viết hai lệnh
sau ở đầu chương trình:
mov
ax,@data
mov
ds,ax
để đặt địa chỉ đoạn của đoạn Data vào DS.
•
Đe két thúc chương trình dạng EXE ta dùng hàm 4Ch của ngắt 21h.
Ví dụ:
•
mou
ah,4ch
Int
21h
Đẻ két thúc chương trình dạng COM ta có thể dùng ngát 20h của DOS hoặc
lệnh RET.
Ví du:
lnt
20h
HƯ ỚNG D Ẫ N LẬP TRÌNH VOI ASSEMBLV
Ví dụ: Viết chương trình in ra màn hinh câu thòng báo Khoa CNTT ở hai dạng
EXE và COM.
D ạng EXE
.Model
Small
■Stack
100h
.Data
TB
DB
'Khoa CNTT $ '
■Code
Main Proc
mov
ax,@data
mov
ds,ax
mov
ah,09h
lea
Int
dx,TB
21h
mov
ah,4ch
Int
21h
Main endp
END
D ạng COM
Small
■Model
•Code
ORG
lOOh
Start:
Jmp
TB
Quadata
Quadata
DB
'Khoa CNTT $ '
Proc
mov
ah,09h
lea
dx,TB
Int
21h
Int
20h
Quadata
Endp
END S tart
C hương L NHẬP M Ó N LẬP TRÌNH HỌP NGŨ
1.2. B iế n v à k h a i b á o b iế n
Bién trong hợp ngữ có vai trò như biến trong các ngón ngữ láp trình khác. Mỗi
biến có một kiểu dữ liệu riêng, và đựơc gán bởi một địa chỉ trong bộ nhớ. Trong hợp
ngữ ta dùng các toán tử giả sau đây để khai báo biến:
DB
khai báo biến kiểu Byte.
DW
khai báo bién kiểu Word.
DD
khai báo biến kiểu Doubleword.
DQ
khai báo bién 4 word.
DT
khai báo biến 10 byte.
a. K hai báo biến kiểu byte
DB
<Giá trị khởi tạo>
B_đem
DB
0 ; khỏi tạo giá trị 0
B_đem
DB
? ; khòng khối tạo giá trị đau
TB
DB
'Khoa CNTT $'
TB
DB
0Dh,0Ah,'Khoa CNTT $'
Ki_tu
DB
'ABC'
Ki_tu
DB
41h,42h,43h
TB
DB
'Khoa CNTT',0Dh,0Ah,'$'
<Tên biến>
DW
So_phan_tu
DW
-2
Mang
DW
10,20,30
Mang
DW
10 Dup (0)
Tu
DW
1234h
<Tên biến>
Ví dụ:
6. Khai b á o biến kiểu Word
Ví dụ:
Byte thấp của Tu có giá trị 34: địa chi Từ
Byte cao của Tu có giá trị 12: địa chì Từ + 1
1.3. G iổi th iê u m ô t số to á n tử
•
•
a. Toán tử DUP
C ú p h áp :
< sổ lần >
DUP
(<giá trị>)
10
H U Ớ N G DẪN LẬP TRÌNH V Ó I ASSEMBLY
T ác dụng: <giá rị> sẽ được lặp lại n lần với n đươc xác định bỏi <số lần>. Ta
thường dùng toán tử Dup để khai báo một dày (mảng) các phần tử có cùng kiểu dừ
liệu và cùng giá trị khỏi đau.
Ví dụ 1:
Mangl
DB
10
Dup (0)
Khai báo trên tương đương
M angl
DB
0, 0, 0, 0,0, 0, 0, 0, 0, 0
Ví dụ 2: Mang2
DB
1 2 ,3 2 ,5
Dup (10)
Khai báo trên tương đương
Mang2
DB
12, 32, 10, 10, 10, 10, 10
Ví dụ 3: Mang3
DB
5, 4, 2Dup (2, 3 Dup (0), 1)
Khai báo trên tương đương
Mang3
DB
5, 4, 2, 0, 0, 0, 1, 2, 0, 0, 0, 1
b. Toán tứ PTR
<kiẻu>
Cú p háp:
PTR
Trong đo: <kiểu> có thể là:
<biẻu thức>
Byte, Word, Dword, Near,
«cbiểu thức> tương ứng là:
Far
Bién, Toán hạng bộ nhớ,Nhân
T ác dụng: Thay đỗi dạng của cbiểu thức> sang <kiểu>
Ví dụ: Có khai báo
Mov
Mov
TuKep
DD
Bang
DW
AL,Byte PTR Bang
BX.Word PTR TuKep
?
500
Dup(?)
;nạp byte đau cùa Bang vào AL
;nạp nội dung 2 byte thâp
;của bién TuKep vào BX
Mov
;nạp giá trị 00 vào ô nhớ có địa
Byte PTR [BX],0
;chi xác định bởi BX
c. Toán tử LABEL
LABEL
<Tẽn biến>
Cú p háp:
<BYTE/ WORD>
T ác dụng: Dùng để khai báo biến, nhưng khai báo bàng toán tử này giúp
chúng ta giải quyét được vấn đề m âu thuản kiểu khi sử dụng.
Ví dụ.
TU
Label Word
TU là biến kiểu Word
Tu_thap
DB
lAh
Tu_thap là biến kiểu Byte
Tu_cao
DB
45h
Tu_cao là bién kiểu Byte
Cìương 1 NHẬP MÔN LẬP TRÌNH HỌP NGỮ
__________
____ 2 1
Theo cách khai báo này thì các biến TU va Tu_thap được gán cùng một địa chi
ô ì hớ, hay
Mov AX, TU
; AL= Tu_thap
; AH= Tu_cao
d. Toán tử $
T ác dụng: Cho giá trị hiện thòi của bộ đếm giá trị bộ nhớ
Thường dùng để tính độ dài của một chuỗi
Ví dụ:
String
Length
DB
Truong Đai hoc
Khoa hoc
DB
'Khoa còng nghệ Thòng tin'
DB
$-Offset String
¡length chứa độ dài của String
1.4. G iơi th iệ u m ộ t số h à m c ủ a n gắt 21h
а. Hàm Olh của n g ắ t 21h
T ác dụng: Nhập một kí tự từ bàn phím, két quả trả về trong AL
Vào:
AH
= Olh
Ra:
AL
= 0, nếu phím vừa gõ là phím
chức năng
= giá trị ASCII của kí tự tương ứng với phím gõ
Vi dụ: Muốn nhập một kí tự vào AL ta viét
mov
ah, Olh
int
21h
б. H àm 02h của n g ắ t 21h
T ác dụng: Xuất một kí tự ra màn hinh
Vào: AH
DL
Ra:
= 02h
= giá trị ASCII của kí tự hoặc kí tư cần in
ra
không có
Ví dụ 1: Đẻ xuất kí tự A ra màn hình ta viết
mov
dl,'A'
mov
ah, 02h
int
21h
; hoặc mov
dl,4lh
Ví dụ 2: Đẻ xuất kí tự liên tiép bát đầu từ kí tự A ta viết
Mov
cx, 10
Mov
ah,2
Mov
dl,41h
; so lần lặp của lệnh Loop
; kí tự bát đầu
12
H U Ớ N G DẪN LẬP TRÌNH VÓ I ASSEMBLY
Lap_xuat:
Int
21h
; xuất kí tự
Inc
dl
; chuẩn bị xuất kí tự ké tiếp
Loop
Lap_xuat
; lạp đủ cx lần (đú 10 kí
tự)
c. Hàm 09h của n gắt 21h
T ác dụng: Xuất một xâu kí tự ra màn hình, xâu cần xuất phải két thúc bằng
dắu $.
Vào: AH
= 09h
DS: DX
Ra:
Ví dụl:
= địa chỉ đầy đủ của xâu cần xuất
không có
mov
ah, 09h
mov
DS, seg <xâu cần xuất>
mov
DX, offset <xâu can xuat>
Int
21h
Ví dụ 2: Giả sử ta có khai báo
T_Bao DB
'Tin học Đại Cương$'
thì đoạn lệnh sau chỉ in ra màn hình xau Đại Cương
mov
ah, 09h
mov
DS, seg T_Bao
mov
DX, offset T_Bao
Add
DX,8
Int
21h
; trỏ dx về đầu xâu
; di chuyển dx về tại kí tự Đ
điều này chứng tỏ hàm 09h/21h chỉ in xâu bát đầu tại vị trí được chi bởi DX (DS:
DX) đến khi gặp kí tự $.
e. Hàm OAh của n g ắ t 21h
T ác dụng: Nhập 1 xâu dài tói đa 255 ký tự từ bàn phím. Cho phép dùng
Backspace để sửa khi nhập sai và kết thúc nhập khi gõ Enter.
Vảo:
AH
= OAh
DS: DX = Địa chỉ của vùng đệm lưu chuổi. Vùng đệm phải có dạng
Byte 0: số byte tói đa có thể nhập
Byte 1: chứa giá trị 0
Byte 2 trỗ đi: để trống (lưu các ký tự sẽ nhập sau này).
Chương 1. NHẬP M Ô N LẬP TRÌNH HỌP NGŨ
Ra :
13
DS: DX = không đổi
Byte 0: không đỗi
Byte 1: chứa số các ký tu đã nhập.
Byte 2 trỏ đi: chứa các kv tư đà nhập.
Nhu vậy ta nên khai báo biến đệm cho hàm 0Ah/21h theo dạng sau:
D_nhap
DB
80,0,80 Dup (' ')
Ví dụ 1: Đe nhập một xâu kí tự vào biến D nhap ta thức hiện như sau:
•Data
D_nhap
DB
80,0,80 Dup (?); khai báo đệm lưu chuỗi
•Code
mov
mov
mov
int
ah,0Ah
DS,Seg D_nhap
; lưu địa chi segment của biến đệm
nhập vào DS
DX,Offset D_nhap ; luu địa chỉ offset của biến đệm nhập
vào DX
; hay trỏ dx về đau I)_Nhap
21h
Ví dụ 2: Viết chương trình nhập vào một chữ cái viết thường và in chử đó ra
dưới dạng viết hoa ở dòng tiép theo.
Small
■Model
•Code
Org
100h
; chương trình dang com
Start:
Jm p
Quadata
TB1 DB
'Nhap mot ky tu: $ ’
TB2 DB
ODh.OAh, 'Ky tu 0 dang viet hoa: $
Proc
Quadata
mov
ah,09h
; gọi hàm 09h để xuất xâu
lea
dx,TBl
; chuẩn bị xuất xâu TB1
Int
21h
mov
ah,01h
; gọi hàm Olh để
Int
21h
; đọc một ký tự vao AL
Mov
cl,al
; lưu tạm giá tri ASCII của
đoc vào CL
Sub
cl,20h
; đỗi sang hoa
14
H U Ớ N G DẨN LẬP TRÌNH V Ó I ASSEMBLY
mov
lea
Int
mov
ah,09h
dx,TB2
21h
ah,02h
mov
dl,cl
21h
Int
20h
Int
Endp
End Start
; chuản bị xuất xâu TB2
; gọi hàm 02h để in kí tự trong DL ra
màn hình
; lưu vào DL để chuẩn bị in ra
;kết thúc chương trình dạng com
1.5. C ác ch ế đ ộ d ịa ch ỉ
Các phương pháp xác định địa chỉ thường dùng là:
а. Định vị thanh ghi
Theo cách này giá trị của toán hạnh được truy xuất nằm ngay trong thanh ghi
của CPU.
Ví dụ:
MOV
AX, BX
; chuyển nội dung cúa BX vào AX
б. Định vị tức thời
Toán hạng tức thời là dừ liệu 8 hay 16 bít nằm ngay trong cáu lệnh, toán hạng
tức thời được lưu trữ ngay trong đoạn mã. Toán hạng tức thời không thể dùng làm
toán hạng đích.
Ví dụ:
MOV
AL,12h
; nạp số 12h vào AL
c. Định vị bộ nhở
1. Đ ịnh vị trự c tiếp: Địa chi offset của ô nhớ chứa dừ liệu toán hạng nàm trực
tiep trong câu lệnh và địa chỉ segment ngầm định chứa trong DS.
Ví dụ:
MOX
BX, [1234]
; nạp nội dung của ônhớ có địa
; chỉ DS:1234 vào BX.
2. Định vị trực tiế p thanh ghi: Địa chi offset của ô nhớ chứa nội dung của
toán hạng nằm trong các thanh ghi BX, BP, SI, DI.
Địa chỉ đoạn ngầm định chứa trong DS nếu dùng BX, SI, DI
Địa chi đoạn ngầm định chứa trong ES nếu dùng BP
Ví dụ 1:
MOV
AX, [SI]
; nạp nội dung của ô nhớ mà địa chỉ
; offset lưu trong SI và địa chi đoạn lưu
; trong DS vào AX.
Chương I NHẬP M Ô N LẬP TRÌNH HỌP NGỮ
Ví dụ 2:
MOV
AX, [BP]
15
; nạp nội dung của ỏ nhớ mà địa chĩ
; offset lưu trong BP và địa chi đoạn lưu
; trong ES vao AX
3. Đ ịnh vị ctí sở: Địa chỉ offset của toán hang được tính là tổng của nội dung
thanh ghi BX hoặc BP và một độ dịch (displacement), độ dịch là một số nguyên âm
hoặc dương. Đìa chỉ đoạn là đoạn hiệntại.
Ví dụ:
MOV
AX, [BP]+2
; chuyển nội dung của ô nhớ mà địa chỉ
;offset là nội dung của BP cọng với 2 và
;địa chỉ đoan là đoạn hiẹn tại vào AX
4. Định vị chỉ m ục: Địa chỉ offset của toán hạng được tính là tổng của nội
(lung thanh ghi SI hoặc DI và một độ dịch (displacement), độ dịch là một so nguyên
âm hoặc dương. Địa chỉ đoạn là đoạn hiên tại.
Ví dụ ỉ:
MOV
AX, [SI] - 2
chuyển nội dung của ô nhớ mà địa chỉ
offset là nội dung của SI trừ với 2 và
địa chi ; đoạn là đoạn hiện tại vào AX
Chú ỷ:
•
•
Ví dụ trên có thể viết lại bằng các cách sau:
MOV
AX, [SI - 2]
MOV
AX, 2 - [SI]
MOV
AX, [SI] 2
MOV
AX, 2 [SI]
Trong các che độ địa chi trên,địa chỉ đoan (hoặc thanh ghi đoạn) của toán
hạng thường được ngầm định trong các thanh ghi DS/KS hoặc trong đoạn
hiện tại (cùng với đoạn mả), trong thực tế có lúc ta cần truy xuất đén các
đoạn khác khi đó ta phải ghi rõ thanh ghi đoạn của đoạn cần truy xuất
trong câu lệnh. Chế độ này còn được gọi là chế độ ghi rõ đoạn.
Ví dụ 2:
MOV
AX,ES:[1234J
ADD
BX, DS:[SI]
CMP
byte PTR DS:[SIJ, 23h
1.6. M ột số v í d ụ
Ví dụ 1: Giả sử tại điạ chỉ 0A00:0100 trong bộ nhớ có chứa một xâu kí tự gồm 7
kí tự, hãy viết đoạn lệnh để in xâu này ra màn hình.
Khi can duyệt qua các ô nhớ liên tục trong bỏ nhớ ta nèn sứ dụng kỷ thuật sau:
16
H U Ó N G DẪN LẬP TRÌNH VÓI ASSEMBL
.
Trỏ SI (ES: SI)/ DI (ES: DI) về đầu vùng nhớ
•
Thay đỗi SI/ DI để lần lượt trỏ đến các ô
nhớ tiếp theo
Trong ví dụ này để trỏ ES: SI về đầu xâu ta cho ES = OAOOh, SI = OlOOh
Mov
ax, OAOOh
; trò ES: SI
Mov
ES, ax
; về đầu xâu
0A00:0100
Mov SI, OlOOh
Mov cx, 7
Lap_xuat:
ES: SI
Mov ah,02
Mov
dl, Byte PTR ES: [SI] ;lấy byte kí tự được chi bởi SI lưu vào DI
Int
21h
Inc
SI
; trỏ tới kí tự kế tiếp
Loop Lap_xuat
; lặp đến hét xâu
Ví dụ 2: Giả sử tại điạ chi OBOO: 0010 trong bộ nhó' có chứa một Byte dữ liệu,
hãy viết đoạn lệnh kiểm tra bít thư 3 cúa byte này (= 1/ = 0).
Mov ax, OBOOh
; trỏ DS: DI
Mov DS, ax
; ô nhớ 0000:0010
Mov DI, OOlOh
Mov
Al, byte PTR DS:[0010h]
; lưu byte cần kiểm tra
vào Ai
Test AL,00001000b
Je
Bang_khong
; Zf = 0, bít 3 = 0
Ví dụ 3: Viết chương trình để khởi động lại máy, tức là khi thực hiện chương
trình này máy tính sẽ khởi động lại (tương tự như khi an nút Reset hoặc nhấn
Ctrl + Alt + Del).
Ta biết tại địa chỉ F000:E05B trong vùng nhớ ROM BIOS có chứa đoạn chương
trinh dùng để Reset lại hệ thống, do đó chương trình của chúng ta chi đơn giản là
nhảy đen nhãn chứa địa chỉ này.
•Code
Org
100h
Jm p
Quadata
Reset
DD
Start:
5BE000íDh
; F000:E05B
C/ương L NHẬP M Ô N LẬP TRÌNH HỌP NG Ũ
17
Quadata:
Jm p
End
Chú ỷ:
Reset
S tart
Xem lại bản chất của lệnh JMP
Địa chỉ khởi động ỏ trên có thể khác nhau ở một só PC, ví dụ:
mov
ES, OFFFFh
mov
BX, ES: 0
Jm p
Word PTR [BX]
II CÂU HỎI T ự KIỂM
tra
C âu 1. Giả sử các so liệu sau đây được nạp vào bộ nhớ bát đầu tại địa chỉ offset
10)h:
byte_l
DB
5
word_2
DW
lABCh
byte_ 3
DB
'XIN CHAO'
a) Cho biết địa chỉ offset của các biến trên.
b) Nội dung của byte tại offset 1002h.
c) Nội dung của byte tại offset 1004h.
d) Cho biết địa chi offset của ký tự 'C' trong xâu 'XIN CHAO’.
C âu 2. Viết cáp lệnh của hợp ngữ để thực hiện các phép gán sau:
•A = B - 2 * A
B = 3 * c + 12
A=-(A+B )
c = A / 3 - B *2
C âu 3. Viét các lệnh để thực hiện các phép gán sau:
AX = 1 + 4 + 7 + ... + 148
BX= 100 + 95 + ... + 5
C âu 4. Hãy cho biét nội dung mới của toán hạng đích và trạng thái mới của các
cờ 0F,SF, ZF, PF, và OF trong các lệnh sau (giả sử ban đầu các cờ đều bị xóa về 0):
a) ADD
b) SƯB
c) DEC
2 HO T V
AX, AX
AL, BL
AL
; AX chứa 7FFFh và BX chứa 000 lh
; AL chứa Olh và BL chứa FFh
; trong đó AL chứa OOh
HƯ Ớ NG DẪN LẬP TRÌNH V Ó I ASSEMBLY
18
; trong đó AL chứa 7Fh
; AX chứa lABCh và BX chứa 712Ah
; trong đó AL chứa 80h và BL chứa FFh
g) SUB
AX, BX
; AX chứa OOOOh và BX chứa 8000h
; trong đó AX chứa 000lh
h) NEG
AX
Câu 5. Phân biệt sự khác nhau giữa chương trình dạng COM và dạng EXE]. Tù
d) NEG
e) XCHG
f) ADD
AL
AX, BX
AL.BL
đó nhận xét về cấu trúc chương trình dạng COM và EXE trong hợp ngừ.
III. BÀI TẬP CÓ LỜI GIẢI
Bài 1. Viết chương trình in nội dung bảng mã ASCII ra màn hình.
B ài 2. Viét chương trình nhập vào một xâu ký tự (dùng hàm 01 của ngát 21h),
kết thúc khi gõ Enter và trong chương trình có lưu lại số các kí tự đã nhập.
Bài 3. Viết chương trình nhập vào một xâu kí tự (dùng hàm OAh của ngát
21h), sau đó dùng hàm 09h của ngát 21h để in ra xâu kí tự đã nhập.
B ài 4. Viết chương trình nhập vào một xâu bằng hàm OAh, sau đó đỗi tất cả ki
tự đã nhập sang dạng viết hoa và in ra màn hình ở dòng tiếp theo.
B ài 5. Viết chương trìn h nhập vào một xâu kí tự (dùng hàm OAh của ngát
21h), sau đó in ra các lẵ tự số CO'. ..'9') trong xâu đả nhập.
Bài 6. Viết chương trình nhập vào hai số có tổng nhỏ hơn 10 và in ra tổng của
hai số vừa nhập.
B ài 7. Viết chương trình nhập vào một từ, sau đó in ra các ki tự trong tù theo
chiều dọc. Ví dụ:
Nhập
TAN
Xuất
T
A
N
Bài 8. Viết chương trình để màn hình xuất hiện thông báo:
Bạn có muốn xóa màn hỉnh không (C/ K)?
Néu gõ vào c hoặc c thì chương trình sẽ xóa màn hình và kết thúc.
Nếu gõ một kí tự khác thì chương trinh chỉ kết thúc mà không xoá màn hình.
Bài 9. Viết chương trình để in ra dạng phóng đại của kí tự N trên m àn hình.
Bài 10. Viét chương trình cho biết loại máy tính đang sử dụng là loại gi. Biét
rằng giá trị của Byte dử liệu tại địa chỉ F000:FFFE cho ta biết loại máy tính đang
sử dụng. Cụ thể như sau:
Chương 1. NHẬP M Ô N LẬP TRÌNH HỌP NGỮ
Nếu byte tại FOOO:FFFE
19
bằng F8: Máy PS/2 model 70 and 80
bằng FA: Máy PS/2 model
băng FC: Máy PC/AT
bằng FE: Máy PC/XT
B ài 11. Byte thấp của word tại địa chỉ 0000: 0400 trong vùng dừ liệu của
BIOS, cho biết một số thông tin về cấu hình hê thong. Byte nàv được mỏ tả như sau
7
6
5
4
3
đrv
2
ram
1
0
Co
X
.................
1 bit 1: Co (coprocessor)
= 1: có coprocessor 8087
= 0: không có coprocessor 8087
2 bit 2,3:Ram (ram trên Main )
= 01:
16k; 10: 32k
= 11: trên 64k
2 bit 6,7: Drv (số ỗ đĩa mềm)
=00
1 ổ; 01: 2 ỗ
=10
3 ổ; 11: 4 ổ
Dựa vào thông tin trên để viết chương trình cho biét máy tính đang sứ dụng có
coprocessor hay không, dung lương ram là bao nhiêu, có bao nhiêu ổ đĩa mềm bằng
cách xuất hiện thông báo lên màn hinh.
B ài 12. Sử dụng hàm 52h/ 21h để viết chương trình ản ổ đĩa D hoặc c & D của
PC.
B ài 13. Viết chương trình để xoá Password khi vảo chương trình Setup CMOS.
PHAN
bài
G í Ải
B ài 1:
Bài này minh họa cách thể hiện cấu trúc lệnh lặp FOR trong hợp ngữ.
Trong hợp ngữ ta dùng lệnh LOOP đễ thực hiện vòng FOR, c x được đặt bằng
số lần lặp (trong bài là 256 lần).
Các bước thực hiện chương trình:
•
Cho số phần tử của bảng mã ASCII vào cx, để chuẩn bị cho lệnh LOOP.
•
Cho giá trị ASCII của phần tử đầu tiên trong bảng vào DL, để in ra màn
hình bằng hàm 02h của ngắt 21h.
•
Dùng lệnh LOOP để lặp lại thao tác trên cho 255 ki tư tiếp theo, bằng cách
tàng dần giá trị của DL lên 1 đơn vị.
H Ư Ớ N G DẪN LẬP TRÌNH V Ó I ASSEMBLY
20
Nội dung chướng trình:
.Model
small
■Stack
lOOh
•Code
Main
proc
mov
ah,2
; chuẩn bị in
mov
cx,256
; 256 kí tự trong bảng mâ ASCII
mov
dl,0'
; kí tự đầu tiên
In_loop:
int
21h
in ra kí tự đau tiên
push
dx
lưu dl, lưu thứ tự của kí tự vừa in
mov
dl,’ 1
in kí tự tráng
int
21h
giữa mỗi kí tự
pop
dx
phục hồi dl, thứ tự của kí tự vừa in
inc
dl
chuản bị in kí tự tiép
loop
In_loop
lặp lại thao tác in
mov
ah,4Ch
int
21h
Main
End
endp
Main
B à i 2:
Bài này minh họa cách thể hiện cấu trúc lệnh lặp REPEAT trong hợp ngữ.
Hàm Olh của ngát 21h chi cho phép nhập một kí tự vào al, để nhập mộtxâu kí
tự ta lặp lại việc nhập một kí tự cho đen khi gặp phím Enter, trong khi nhập nhớ
tăng dần BX lên một đơn vị để ghi nhận số kí tự đã nhập.
Các bước thực hiện chương trình:
•
Chuẩn bị BX để lưu số kí tự được nhập
•
Nhập một kí tự vào AL (dùng hàm Olh của ngắt 21h)
•
Kiểm tra có phải là phím Enter hay không ( AL = ODh ?)
Nếu AL = ODh thi kết thúc
Chương l N HẬP M Ô N LẬP TRÌNH HỌP NGŨ
Nếu AL khác ODh thì tăng BX và quay lại 2
xor
bx,bx
; bx luu tổng số kí tự đưọc nhập
mov
ah,01
; chuẩn bị nhập 1 kí tự
int
21h
; nhập kí tụ vào al
cmp
al,0Dh
; có phải ENTER
je
K_thuc
; đúng thi kểt thúc
inc
bx
; sai thi tăng BX và tiếp tục
jmp
Lapnhap
;lặp lại
lapnhap:
Nội du n g chương trình:
•Model Small
■Stack
lOOh
.Data
TB_Nhap
DB
'Nhap vao 1 xau ky tu: $'
.Code
Main
Proc
mov
ax,@data
; khởi tạo DS
mov
ds,ax
mov
ah,09
; gọi hàm 09h để xuất một xâu
lea
dx,TB_Nhap
; lưu địa chỉ otĩset của bién TB_Nhap
vào DX
int
21h
xor
bx,bx
mov
ah,01
; bx lưu tổng số kí tự đưọc nhập
lap_nhap:
int
21h
cmp
al,0Dh
có phải ENTER ?
je
K_thuc
đúng thi dừng
inc
bx
sai thi tăng Bx và liổp tục
jmp
K_thuc:
mov
Lap_nhap
ah,4Ch
22
H U O N G DAN LAP TRINH V O I ASSEMBLY
Int
Main
21h
endp
End
B a i 3:
Ta c6 the dung ham Olh de nhap mot xau ki tu, nhung cach nay khong cho
phep xoa ki tii khi da nhap va kh6 to chute vung dem luu, de kh&c phuc dieu nay ta
dung ham OAh cua ng&t 21h.
Bai nay minh hoa cach truy xuat noi dung o nhd b&ng che do dia chi gian tiep
thanh ghi. Day la phan ra t quan trong trong lap trinh hop ngu.
Cac biidc thiic hien chiidng trinh :
•
Khai bao bien D_Nhap theo qui dinh cua ham OAh
•
Goi ham OAh cua ngM 21h de nhap mot xau ki tu vao dem D_Nhap
•
Chuan bi dieu kien de xuat xau b4ng ham 09h, ham nay qui dinh xau can
xuat phai ket thuc boi $ do do ta phai them ki tu $ vao cuoi xau viia nhap.
Theo cau true cua dem thi dia chi cuoi xau vua nhap la D_Nhap[2+ SN],
trong do SN la so ki tu vua nhap duoc doc ra tu byte thu 1 cua D_Nhap
mov
bl,D_Nhap[l]
; BX lifu so ki tu da nhap
mov
bh,0
Them '$' vao dia chi D_Nhap[2+BX]
mov
D_Nhap[bx+2],'$'
Luu dia chi offset cua ki tu dau tien trong xau can xuat vao DX (theo yeu
cau cua ham 09h ng^t 21h)
lea
•
dx,D_Nhap[2]
; ho^c Add
Dx,
Goi ngSit 21h de xuat ki tvi.
N oi du ng chu'dng trinh :
.Model small
.Code
Org
lOOh
Start:
JM P
TT_Chinh
TB_Nhap
DB
'Nhap vao 1 xau: $'
TB_Xuat
DB
0Dh,0Ah,'Xau da nhap: $’
2
Chương L NHẬP M Ô N LẬP TRÌNH HỢP N GỮ
D_Nhap
DB
23
80,0,80 dup (0)
;lưu ý cách khai báo này
T T C h in h
PROC
mov
ah,09h
lea
dx,TB_Nhap
int
21h
mov
ah.OAh
; goi hàm OAh để chủa bị nhập một xâu
lea
dx,D_Nhap
; ì ưu địa chì của đẹm nhập vào DX
int
21h
mov
ah,09h
lea
dx,TB_Xuat
int
21h
mov
bl,D_Nhap[l]
mov
bh,0
mov
D_Nhap[bx+2],'$'
mov
ah,09h
lea
dx,D_Nhap[2]
int
21h
int
20h
; lưu so phần tử được nhập vào bx
; thêm $ vào cuối xâu vừa nhập
; trỏ BX về đầu xâu cần xuất
TT_Chinh ENDP
END
B à i 4:
Bài này minh họa cách thể hiện cấu trúc lệnh lặp FOR trong hợp ngữ và kỹ
th u ật duyệt nội dung các ô nhớ liên tục nhau (trong bài là biến D_Nhap) bằng chế
độ địa chỉ gián tiếp thanh ghi.
Các bước thực hiện chương trình:
•
Khai báo biến D_Nhap theo qui định của hàm OAh
•
Gọi hàm OAh của ngắt 21h để nhập một xâu kí tư vào đệm D_Nhap
•
Lưu só kí tự thực sự nhập tại byte 1 của D_Nhap váo c x để chuẩn bị cho
lệnh lặp LOOP.
mov
cl,D_Nhap[l] ;
mov
ch,0
; xoá byte cao của c x
24
H U Ớ N G DẦN LẬP TRÌNH VÓ I ASSEMBI Y
•
Lưu kí tự đẩu vào AL đê kiếm tra
mov
bx,2
; D_Nhap[2J vị trí bắt đầu cùa xâu vừa nhảp
mov
AL,D_Nhap[BX]
Nếu 'a' < AL hoặc AL> 'z' thi IN_RA và duyệt kí tự tiếp theo
Còn không thì đỗi thành hoa sau đó IN_RA và duyệt kí tự tiếp
cmp
al,'a'
jl
In_ra
cmp
al,'z'
jg
In_ra
sub
al,20h
; đổi sang chữ hoa
In_ra:
•
; không phỉa là kí tự thường
mov
ah,02h
mov
dl,al
int
21h
Tăng BX để trỏ đến kí tự tiếp
ADD
•
bx,l
(vì D_Nhap có kiểu byte nên chi tảng 1 đơn vị)
Lặp lại quá trình kiểm tra/ đổi thành hoa/ in ra cho đén khi c x = 0 (hét
xâu)
loop
Lapjhoa
N ội dung chương trinh:
.Model small
■Code
Org
100h
Start:
JM P
TT_Chinh
TB_Nhap
DB
'Nhap vao 1 xau: $'
TB_Xuat
DB
0Dh,0Ah,'Xau da nhap duoi dang viet hoa: $’
D_Nhap
DB
80,0,80 dup (0)
TT_Chinh
PROC
mov
ah,09h
lea
dx,TB_Nhap
int
21h
Chương 1. NHẬP M Ó N LẬP TRÌNH HỢP N G Ũ
mov
ah,0Ah
lea
dx,D_Nhap
int
21h
mov
ah,09h
lea
dx,TB_Xuat
int
21h
mov
cl,D_Nhap[l]
mov
ch,0
mov
bx,2
25
; bắt đẩu từ kí tự đẩu trong xâu
Lap_hoa:
Mov
al,D_Nhap[bx]
cmp
al,'a’
ji
cmp
In_ra
Jg
In_ra
sub
al,20h
al,'z'
; đổi sang chữ hoa
; không phải là kí tư thường
In_ra:
; in ra
Mov
ah,02h
mov
dl.al
int
21h
add
bx,l
; tăng bx để trỏ đến kí tự tiếp
loop
Lap_hoa
; lặp lại
int
20h
ENDP
TT_Chinh
END
B ài 5:
Bài này hoàn toàn tương tự như bài 4, nhưng ở đây chi đơn giản là in ra các
phần tử thoả mãn điều kiện.
Nội du ng chương trình:
■Model
.Code
Small