Tải bản đầy đủ (.pdf) (187 trang)

Hướng dẫn lập trình với assembly

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.14 MB, 187 trang )

ĐẠ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


×