1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

187 473 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 187
Dung lượng 3,14 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

để đặ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 2

LẼ M Ạ N H THẠNH (chu biên) NGUYỄN KIM TUẤN

Trang 3

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ươ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 4

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ỹ 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 5

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 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 6

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ả

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 9

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 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 10

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

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 11

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 ụ 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 12

mov 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 13

Chươ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 14

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

; offset lưu trong SI và địa chi đoạn lưu

; trong DS vào AX

Trang 15

Chươ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 16

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 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 17

End 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 19

Nế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 20

in 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 21

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

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 22

22 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 23

D_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 24

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

• 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 26

26 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 28

28 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 29

Org 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 30

30 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 31

C 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 32

32 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 33

C á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 35

1110 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 36

Chú ý: Đẻ 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 37

v.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 38

38 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 40

Bả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

Ngày đăng: 29/12/2019, 13:09

TỪ KHÓA LIÊN QUAN