để đặ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... 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
Trang 1ĐẠI HỌC QUỐC GIA
Trang 2LẼ M Ạ N H THẠNH (chu biên) NGUYỄN KIM TUẤN
Trang 3M Ụ 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ương trinh hợp ngữ 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ủa ngắ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 T R Ú 88
I Tóm tắt lý thuyết 88
Trang 41.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ỹ th u ậ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 T IN 133
I Tóm tắ t lý th u y ế t 133
1.1 Một số khái n iệm 133
1.2 Bảng Partition và M aster 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
4 _ _H Ư O N G D AN LẠP TRINH VO I ASSEMBl EY
Trang 5LÒ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 Assem bly 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 A S6 (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
Trang 6b 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ả
Trang 7để đặ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
Trang 8■CodeMain Proc
movmovmovlea IntmovIntMain endp
Jmp
TB Quadata
mov lea Int Int Quadata
Small100h
DB 'Khoa CNTT $ '
ax,@datads,axah,09hdx,TB21hah,4ch21h
Small
Q uadata
DB 'Khoa CNTT $ ' Proc
ah,09hdx,TB21h20hEndp
END S tart
Trang 9C 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 h ai báo biến kiểu byte
Ví dụ:
<Tên biến>
B_đem B_đem
TB
TB Ki_tu Ki_tu TB
DB
DBDBDBDBDBDBDB
<Giá trị khởi tạo>
0 ; khỏi tạo giá trị 0
? ; khòng khối tạo giá trị đau 'Khoa CNTT $'
0Dh,0Ah,'Khoa CNTT $' 'ABC'
41h,42h,43h'Khoa CNTT',0Dh,0Ah,'$'
<Giá trị khỏi tạc»
-2
10,20,30
10 Dup (0)1234h
6 K hai b á o biến kiểu Word
Trang 1010 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
Khai báo trên tương đươngMang3 DB 5, 4, 2, 0, 0, 0, 1, 2, 0, 0, 0, 1
b Toán tứ PTR
C ú p h áp : <kiẻu> PTR <biẻu thức>
Trong đo: <kiểu> có thể là: Byte, Word, Dword, Near, Far
«cbiểu thức> tương ứng là: 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 AL,Byte PTR Bang
Mov BX.Word PTR TuKep
Mov Byte PTR [BX],0
c Toán tử LABEL
C ú p h áp : <Tẽn biến>
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
;nạp giá trị 00 vào ô nhớ có địa
;chi xác định bởi BX
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
Tu_thapTu_cao
Trang 11Theo 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 ụ n g : 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
DB 'Khoa còng nghệ Thòng tin'Length DB $-Offset String ¡length chứa độ dài của String
1.4 G iơi t h 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 ụ n g : Nhập một kí tự từ bàn phím, két quả trả về trong AL
= 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
Ví dụ 2: Đẻ xuất kí tự liên tiép bát đầu từ kí tự A ta viết
Mov cx, 10 ; so lần lặp của lệnh Loop
Trang 12mov DS, seg <xâu cần xuất>
mov DX, offset <xâu can xuat>
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
Trang 13Chương 1. NHẬP M Ô N LẬP TRÌNH HỌP NGŨ 13
Byte 0: không đỗiByte 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:
vào DX
; hay trỏ dx về đau I)_Nhapint 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
Trang 142 Đị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
; offset lưu trong SI và địa chi đoạn lưu
; trong DS vào AX
Trang 15Chương I NHẬP M Ô N LẬP TRÌNH HỌP NGỮ 15
Ví dụ 2: MOV AX, [BP] ; 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 Đ ịn h vị ctí sở: Địa chỉ offset của toán hang được tính là tổng của nội dungthanh 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ện tại
; 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
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, 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
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:
Trang 1616 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 ES, ax ; về đầu xâuMov SI, OlOOh
Mov cx, 7Lap_xuat:
ES: SI
Mov ah,02Mov dl, Byte PTR ES: [SI] ;lấy byte kí tự được chi bởi SI lưu vào DI Int 21h
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 DI, OOlOhMov Al, byte PTR DS:[0010h] ; lưu byte cần kiểm tra vào AiTest AL,00001000b
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ấnCtrl + 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
Trang 17End S tart
Địa chỉ khởi động ỏ trên có thể khác nhau ở một só PC, ví dụ:
II CÂU HỎI T ự KIỂM t r a
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:
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:
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 AX, AX ; AX chứa 7FFFh và BX chứa 000 lh
b) SƯB AL, BL ; AL chứa Olh và BL chứa FFh
Trang 18; AX chứa lABCh và BX chứa 712Ah
; trong đó AL chứa 80h và BL chứa FFh
; AX chứa OOOOh và BX chứa 8000h
; trong đó AX chứa 000lh
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ù
đó nhận xét về cấu trúc chương trình dạng COM và EXE trong hợp ngừ
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ìn h 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ìn h 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
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ìn h để 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ìn h 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:
III BÀI TẬ P CÓ LỜI GIẢI
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)?
Trang 19Nếu byte tại FOOO:FFFE 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
B ài 12 Sử dụng hàm 52h/ 21h để viết chương trình ản ổ đĩa D hoặc c & D củaPC
B ài 13 Viết chương trình để xoá Password khi vảo chương trìn h 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ị
Trang 20in kí tự tránggiữa mỗi kí tựphục hồi dl, thứ tự của kí tự vừa in chuản bị in kí tự tiép
Các bước thực h iệ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 E nter hay không ( AL = ODh ?)
Nếu AL = ODh thi kết thúc
Trang 21Chươ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
xormovlapnhap:
intcmpjeincjmp
bx,bxah,01
21hal,0DhK_thucbxLapnhap
; gọi hàm 09h để xuất một xâu
; lưu địa chỉ otĩset của bién TB_Nhap vào DX
; bx lưu tổng số kí tự đưọc nhập
có phải ENTER ?đúng thi dừngsai thi tăng Bx và liổp tục
Trang 2222 H U O N G DAN LAP TRINH V O I ASSEMBLY
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 trin h :
• 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 th u 1 cua D_Nhap
mov bl,D_Nhap[l] ; BX lifu so ki tu da nhap
• Goi ngSit 21h de xuat ki tvi
Trang 23D_Nhap DB 80,0,80 dup (0) ;lưu ý cách khai báo này
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] ;
Trang 2424 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
• 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)
TB_Nhap DB 'Nhap vao 1 xau: $'
TB_Xuat DB 0Dh,0Ah,'Xau da nhap duoi dang viet hoa: $’
Trang 2626 HƯ Ớ N G D Ẫ N LẬP TRÌNH V Ơ I ASSE/VíBlY
Start:
TBX DB 0Ah,0Dh,'Cac ki tu so trong xau: $'
D_Nhap DB 80,0,80 DƯP (0) ;đệm nhập theo yêu cầu của hàm I AhBegin:
mov ah,02h ; '0' =< AL <= '9' thi in ra
Trang 27; tăng bx để trỏ tới kí tự tiếp theo
; duyệt tiếp
l ì à i 6:
Bài này trìn h bày cách đỗi một số sang kí tự số tương ứng và ngược lại
DOS không có hàm nhập số, chỉ có hàm 01 của ngát 21h dùng để nhập một kí
tự, do đó để nhập số ta nhập kí tự số CO' 9 ) tương ứng sau đó chuyển sang số Ta biết trong bảng mã ASCII các kí tự số xép liên tục nhau và có giá trị ASCII tương
là 30h , 31h, , 39h, tức là để có một giá trị số ta lấy giá trị ASCII của kí tự só tưong ứng trừ đi 30h và ngược lại để in một ra màn hình một số ta phải cộng số đó với 30h sau đó gọi hàm 02h của ngắt 21h để in ra Rõ ràng điều này chi áp dụng được với các số có giá trị nhỏ hơn 9, đói với các số lớn hơn 9 ta phải tự thiết ké các hàm xuất nhập số
C ác bước th ự c hiện chương trình:
sub al,30h ; đỗi kí tự thành số tương ứng
Trang 2828 H U Ö N G DÂN LÂP TRI NH VÖ I ASSEMBLY
Start:
JM P Q uadata
TB3 DB 0Dh,0Ah,'Tong cua hai so la : $'
sub al,30h ; dôi ki tii thành sô tiiöng üftig
sub al,30h ; dôi ki tu thành sô tiiöng ring
Trang 29Org lOOh
Start:
JM P TT_Chinh
TB_Nhap DB 'Nhap vao 1 xau: $'
TB_Xuat DB 0Dh,0Ah,'Xuat theo chieu doc:',0Dh,0Ah,'$'
Trang 3030 H Ư Ớ N G D ẪN LẬP TRÌNH V Ớ I ASSEMBLY
B à i 8:
Bày này trình bày cách tra cứu và sử dụng một hàm/ngát của DOS/ BIOS, thao tác này rấ t cần thiết đổi với những người mới làm quen với lập trình hợp ngữ Bài này cũng trình bày cách thực hiện cấu trúc lệnh IF ELSE với điều kiện kép OR
Đẻ hiểu được bài này trước chúng ta nên tra chức năng của hàm 00H vả OFh của ngát lOh BIOS
Các bước thực hiện chương trìn h :
• Gọi hàm Olh cúa ngắt 21h để nhập một kí tự (vào AL)
• Kiểm tra giá trị trong AL có phải là 'Ơ hoặc (OR) 'c' không
Nếu đúng thì nhảy đen thực hiện các lệnh sau nhàn Xoa_MH
Néu không thì nhảy đến nhăn K_thuc để kết thúc chương trình
• Tại nhãn Xoa_MH ta dùng hàm OFh của ngát lOh để lấy Mode m àn hìnhhiện tại và dùng hàm OOh của ngát lOh để đặc lại mode màn hình Khi đặcmode màn hình màn hình sẽ bị xoá
Trang 31C hương 1. NHẬP M Ô N LẬP TRÌNH HỢP NG Ũ 31
cmp al,'c' ; kí tự gõ vào có phải 'c' ?
Xoa_MH:
rnov ah,0Fh ; lay mode màn hình hiện Lạo lưu vào AL
Bài này minh hoạ cách sử dụng c x cho hai vòng lặp lồng nhau
Đe thực hiện trước hét ta phải khai báo một biến (chu_n) dưới dạng ma trận điểm kí tự (khái niện ma trận điểm ki tự sẽ giải thích sau), ơ đây ta chọn ma trận điểm 8x8, tức biến chu_n gồm 8 byte
Thực hiện chương trình:
1 Trò SI về đầu bién chu_n
2 Lưu byte được trỏ bởi SI vào BL
3 Kiểm tra từng bit trong BL (từ trái sang phải)
Néu bàng 1: in ra kí tự có mã Ascii 219
Nếu bằng 0: in ra kí tự có mã Ascii 32 (kí tự tráng)
(lặp đủ 8 lần)
4 Xuống dòng
5 Tăng SI để tiếp tục cho byte ké tiếp
6 Quay lại 1 (cho đủ 8 lần)
Như vậy chương trình phải thực hiện 2 vòng lặp (For) lồng nhau, một để duyệt qua 8 bit của 1 bvte và một duyệt qua 8 byte của chu_n
Trang 3232 H U O N G D AN LAP T r I n H VO I ASSEMJLY
Nội du n g chương trình :
Small.Model
movaddpushmovlap2:
shljcmovmovintloopjmp
bl.tsi]
si, 1cxcx,8
bl,lBang_l ah,02 dl,”
21hLap2X_dong
OCEh64h54h44h044hCEh
Trang 33C ác bùóc thực hiện chương trình:
1 Trỏ cặp thành ghi ES: DI về địa chi FOOO:FFFE
2 Lấy Byte tại ô nhớ được trỏ bởi ES:DI lưu vào AL
3 Lần lược so sánh AL với các giá trị F8h, FAh' FCh, FEh để xuất ra thông báo trả lời thích hợp
Trang 351110 V
lea int Jmp
Xuat_TB 1 :
mov lea intKet_thuc:
Mov IntMain Endp
END
B à i 11 :
Bài này tương tự nhu bài trên, nhung 0 dây ta phải kiêm tra bít chú khôngkiêm tra giá trị cúa byte hoặc word Đe kiêm tra giá trị của các bít trong một thanhghi ta co thê chia ra các truòng hợp sau:
Ví du đê kiêm tra bít thu 2 (tù phải sang) của AL ta phai dùng dãy mật nạ là: 00000010 và thực hiện Test AL, 00000010b
2 Kiêm tra nhiều bít không liên Lục: Dịch nội dung thanh ghi để kiểm tra lần lượt tùng bít 1
3 Kiỏni tra nhiêu bít liên tục nhau: Dịch nòi dung của thanh ghi cần kiêm tra sao cho nhóm bít cần kiểm tra dịch về các bít tháp nhất của thanh ghi í dịch sang trái), xoá các bít trước đó (các bít không kiểm tra), sau đó so sánh nội dung của thanh ghi vói giá trị cân kiém tra
ah,09dx,TB221hKet_thuc ; in xong thì kết thúc
ah,09dx,TB321h
ah,4ch21h
Trang 36Chú ý: Đẻ kiểm tra giá trị của cờ ta dùng các lệnh nhảy bị ảnh hưởng bởi cờ
cần kiểm tra Ví dụ để kiểm tra bít thứ 2 (tù phải sang) của AI ta thực hiện như sau:
Các bước th ự c h iệ n chư ơ ng trìn h :
1 Trỏ cặp thành ghi ES: DI về địa chi 0000: 0400
2 Lấy Word tại ô nhớ được trỏ bởi ES:DI lưu vào AX
3 Kiểm tra bít 2 cùa AL (bít Co)
Trang 37v.hừtng 1. NHẬP M Ô N LẬP TRÌNH HỌP NGỮ
4 Kiểm tra giá trị tại 2 bít 3,4 của AL (2 bít Ram)
chuyển sang BL để kiểm tra
5 Kiểm tra giá trị tại 2 bít 7,8 của AL (2 bít Drv)
; chuyển sang BL để kiểm tra
Trang 3838 H Ư Ớ NG DẪN LẬP TRÌNH VƠI A S S tM ỉl
Main Proc
mov mov Mov Mov Mov Mov
ax,@data ds,ax
Trang 40Bảng danh sách được mô tả như sau (chi liệt kê các phần tử cần thiết)
4 0 _ HƯ Ớ NG DẤN LẬP TRÌNH V Ó I ASSEMBL