Gt Ngon Ngu Lt Assembly

125
sở GIÁO DỤC VÀ ĐÀO TẠO HÀ NỘI NGUYỄN THÀNH TRUNG G I Á O T R Ì N H NGÔN NGỮ LẬP TRÌNH ASSEMBLY (Dùng trong các trường THCN) NHÀ XUẤT BẢN HÀ NỘI - 2007

Transcript of Gt Ngon Ngu Lt Assembly

Page 1: Gt Ngon Ngu Lt Assembly

s ở GIÁO DỤC VÀ ĐÀO TẠO H À N Ộ I

NGUYỄN THÀNH TRUNG

G I Á O T R Ì N H

NGÔN NGỮ LẬP TRÌNH

ASSEMBLY

(Dùng trong các trường THCN)

N H À XUẤT BẢN H À N Ộ I - 2007

Page 2: Gt Ngon Ngu Lt Assembly

N H À XUẤT BẢN H À N Ô I 4 - TỐNG DUY TÂN, QUẬN HOÀN KIẾM, HÀ NỘI

ĐT: (04) 8252916, 8286766, - FAX: (04) 9289143

GIÁO TRÌNH NGÔN NGỮ LẬP TRÌNH ASSEMBLY

NHÀ XUẤT BẢN HÀ NỘI - 2007

Chịu trách nhiệm xuất bản: NGUYỄN KHẮC OANH

Biên tập: PHẠM QUỐC TUẤN

NGUYỄN THỊ THU HẰNG Bìa:

TRẦN QUANG Kỹ thuật vi tính:

HOÀNG THÚY LUÔNG Sửa bàn in:

NGUYỄN THỊ THU HẰNG

In 500 cuốn, khổ 17x24cm, tại Nhà in Hà Nội - Công ty Sách Hà Nội. 67 Phó Đức Chính - Ba Đình - Hà Nội. Quyết định xuất bản: 160-2007/CXB/446GT-27/HN, số 313/CXB ngày 02/3/2007. So in: 294/3. In xong và nộp lưu chiểu quý IU năm 2007.

Page 3: Gt Ngon Ngu Lt Assembly

L ờ i g i ớ i t h i ê u

A 7 ước ta đang bước vào thời kỳ công nghiệp hóa, hiện Ì V đại hóa nhằm đưa Việt Nam trỏ thành nước công

nghiệp văn minh, hiện đại. Trong sự nghiệp cách mạng to lớn đó, công tác đào tạo

nhân lực luôn giữ vai trò quan trọng. Báo cáo Chính trị của Ban Chấp hành Trung ương Đãng Cộng sản Việt Nam tại Đại hội Đáng toàn quốc lần thứ IX đã chỉ rõ: "Phát triển giáo dục và đào tạo là một trong những động lực quan trọng thúc đẩy sự nghiệp công nghiệp hóa, hiện đại hóa, là điều

kiện đẽ phát triển nguồn lực con người - yếu tô cơ bản đế

phát triển xã hội, tăng trường kinh tế nhanh và bền vững". Quán triệt chủ trương, Nghị quyết của Đảng và Nhà nước

và nhận thức đúng đắn vé tầm quan trọng của chương trình, giáo trình đối với việc nâng cao chất lượng đào tạo, theo đê nghị của Sỏ Giáo dục và Đào tạo Hà Nội, ngày 23/9/2003, Úy ban nhân dán thành phố Hà Nội đã ra Quyết định số 5620/QĐ-UB cho phép sỏ Giáo dục và Đào tạo thực hiện đề

án biên soạn chương trình, giáo trình trong các trường Trang học chuyền nghiệp (THCN) Hà Nội. Quyết định này thể hiện sự quan tâm sáu sắc của Thành ủy, UBND thành phố trong việc nâng cao chất lượng đào tạo và phát triển nguồn nhún lực Thủ đô.

Trên cơ sở chương trình khung của Bộ Giáo dục và Đào tạo bơn hành và những kinh nghiệm rút ra từ thực tế đào tạo, Sở Giáo dục và Đào tạo đã chỉ đạo các trường THON tổ chức biên soạn chương trình, giáo trình một cách khoa học, hệ

3

Page 4: Gt Ngon Ngu Lt Assembly

thống và cập nhật những kiến thức thực tiễn phù hợp với đối tượng học sinh THCN Hà Nội.

Bộ giáo trình này là lài liệu giáng dạy và học tập trong các trường THCN ở Hà Nội, đồng thời là tài liệu tham kháo hữu ích cho các trường có đào tạo các ngành kỹ thuật - nghiệp vụ và đông đào bạn đọc quan tâm đến vấn đê hướng nghiệp, dạy nghê.

Việc tổ chức biên soạn bộ chương trinh, giáo trình này là một trong nhiều hoạt động thiết thực của ngành giáo dục và đào tạo Thủ đô để kỷ niệm "50 năm giải phóng Thù đô ", "50 năm thành lập ngành " và hướng tới kỷ niệm "1000 năm Thăng Long - Hà Nội".

Sở Giáo dục và Đào tạo Hà Nội chân thành cảm ơn Thành ủy, UBND, các sở, ban, ngành của Thành phố, Vụ Giáo dục chuyên nghiệp Bộ Giáo dục và Đào tạo, các nhà khoa học, các chuyên gia đầu ngành, các giáng viên, các nhà quán lý, các nhà doanh nghiệp đã tạo điêu kiện giúp đỡ, đóng góp ý kiến,

tham gia Hội đồng phản biện, Hội đồng thẩm định và Hội đổng nghiệm thu các chương trình, giáo trình.

Đây là lần đầu tiên Sở Giáo dục và Đào tạo Hà Nội tố chức biên soạn chương trình, giáo trình. Dù đã hết sức cố gắng nhưng chắc chắn không tránh khỏi thiếu sót, bất cập. Chúng tôi mong nhận được những ý kiến dóng góp của bạn đọc đế từng bước hoàn thiện bộ giáo trình trong các lần tái bản sau.

GIÁM ĐỐC SỚ GIÁO DỤC VÀ ĐÀO TẠO

4

Page 5: Gt Ngon Ngu Lt Assembly

L ờ i n ó i đ ẩ u

'gòn ngữ Assembly hay còn gụi là Hợp nqữ lù ngôn ngữ lập trình bậc Ì V thấp các chí thi lệnh là cúc từ tiếng Anh dược viết tắt cho một hành

dộng nào dó. Các lệnh trong Hợp ngữ tương lác trực tiếp với các thanh ghi hay các ô nhớ nằm trong phán cứng của hệ thống vi xử lý. Vì vậy, dể viết được Hợp ngữ người lập trình phải có kiến thức vé phẩn cứng máy tính cũng như hệ vi xử lý.

Ưu điểm cùa Hợp ngữ là cúc chương trình ứng dụng dược viết bằng ngôn ngữ này thì tốc độ xử lý tãiiíỊ lên thêm mười đến hai mươi phẩn trăm, mà lại chiếm ít bộ nhớ hơn các chương trình viết bằng ngôn ngữ bậc cao khác, bén cạnh đó Hợp ngữ thích nghi một cách chính xác với các đặc điểm của từng hệ thống máy tính và các thiết bị ngoại vi của nó. Tút cả các chức năng phần cứng của thiết bị đêu có thể thực hiện dược bằng các chương trình viết bung Hợp nục. Một ưu điểm nữa của nẹôn ngữ Hợp lì ạ ừ là có thê liên kết với ngôn ngữ bậc cao khác như c, Pascal tạo ra sự tối ưu trong các chương trình sử dụng.

Ngày nay máy tính được sứ dụng ngày càng rộng rãi trong lĩnh vực đo lường và diêu khiển tự dộng, trong dớ yêu cẩu về tốc độ, bộ nhớ được ấn định trước bởi thiết bị thì việc sứ dụng Hợp ngữ là rất cẩn thiết.

Mối loại máy lính đêu có dạng Họp ngữ riêng và trình hợp dịch riêng gọi lờ Assembler. Với máy tính PC- IDM có hai chương trình hợp dịch đó là Macro Assembler (MASM) của hãng Microsoỷt và Turbo Assember (TASM) của hãng Borland. Giữa hai chương trình này có sự khác nhau đôi chút, nhưng về công dụng như nhau và tương thích với nhau. Trong giáo trình này sẽ đề

cập nhiều đến trình dịch hợp ngữ MASM cửa Microsoỷt, còn gọi là trình dịch Macvo Assembler.

5

Page 6: Gt Ngon Ngu Lt Assembly

Đối tượng giáo trình này là sinh viên chuyên ngành kỹ thuật viên liu học của các trường Trung học kỹ thuật và dạy nghề. Đế học (lược món này người đọc Cấn có các kiến thức vé kỹ thuật vi xử lý. kiến trúc máy tính vù cũng dã

học qua ngôn ngữ lập trình Pascal. Nội dung chương trình dược chia làm bấn chương với các nội dim% sau:

Chương l: Giới thiệu tóm tắt một số phần về bộ vi xử lý 8086, 8088 như các loại dữ liệu, cấu trúc chung của các bộ vi xử lý 80x8, số lượng và công dụng của các thanh ghi, khái niệm và tác dụng về ngắt, các kiểu định địa chi cho các toán họng và khuôn dạng tệp lệnh.

Chương 2: Trình bày vê cú pháp của hợp li gí?, cách khai báo bộ nhớ. các biến, các hằng và cấu trúc cơ bản của chương trình Assưìììh dơn giàn, các bước lập trình cần thực hiện, cách sử dụng các cấu trúc cơ bản khi vào viết

Hợp ngữ, Phân biệt ý ưa hơi chương trình EXE và .COM. Chương 3: Trình bày các phương pháp liên kết giữa ngôn ngữ bậc cao

Pascal với ngôn ngữ Assetnbly. Chương 4: Các bài toán lập trình với số nguyên, lập trình cho các chuỗi

và thiết bị vào/ra. Phụ lục: Giới thiệu các ngắt của DOS và BIOS gi úp người học tra cứu, sử

dụng trong các bài toán lập trình. Tóm lại, giáo trình này nhầm giúp cho sinh viên các kiên thức cơ bàn vé

lập trình Hợp ngữ, đồng thời củng cố thêm các kiến thức đã dược học về phần cứng máy tính, cũng như kỹ thuật vi xử lý nói chung.

6

Page 7: Gt Ngon Ngu Lt Assembly

C h ư ơ n g Ì

Tổ CHỨC CỦA BỘ VI XỬ LÝ 8086

ì. CÁC DẠNG Dữ LIỆU c ơ BẢN CỦA BỘ VI x ử LÝ

1. Dạng số và hệ đếm

Ngày nay chúng la thường dùng 10 chữ số 0, 1,2, 3, 4, 5, 6, 7, 8, 9 đổ biểu diễn trong các phép tính toán và trao đổi trong công việc. Nó là hệ cơ số mười hay nói gọn là hệ mười.

Trong máy tính thì khác. Máy tính được cấu tạo và liên kết bởi một hệ thống các chất bán dẫn và các hệ mạch điện tử. Vì vậy mọi hoạt động của máy trên hai trạng thái có điện và không có điện của các mạch điện tử. Do vậy để biếu diễn một giá trị số chúng ta phải dùng hệ cơ số hai (Binary number sys-tem, viết tắt là hệ B). 0 và Ì cũng là giá trị có thể có của một chữ số hệ hai (Binary digit, viết tắt là bít). Hệ hai là hệ đếm dùng trong các máy tính.

Một số hệ hai gồm một cụm 8 bít gọi là Byte, cụm 16 bít tạo thành một từ là (Word), 32 bít tạo thành một từ kép (double vvord). Chữ số đầu tiên bên trái trong dãy các số hệ hai gọi là bít có ý nghĩa lớn nhất (Most significant bít, MSB), còn bít cuối cùng trong dãy hệ hai có ý nghĩa bé nhất (Least significant bít, LSB).

Một số hệ mười viết như sau: 78342,56, sẽ có giá trị bằng tổng cùa các tích 7, 8, 3, 4, 2, 5, 6 với các trọng số 10' tương ứng như sau:

78342,56 = 7xl0 4 + 8x10-*+ 3xl0 2 + 4X101 + 2x10° + 5x10"'+ 6x10-2 Tương tự như vậy, một số hệ hai viết như sau: 10110,01, sẽ có giá trị bằng

tổng của các tích 1,0,1,1,0,0,1 với các trọng số 2' tương ứng như sau: 10110,01 = Ì X 2 4 + 0 X 23 + Ì X 2 2 + Ì X 21 + 0 X 2° + 0 X 2-' + Ì X 2-2

7

Page 8: Gt Ngon Ngu Lt Assembly

Giữa hệ mười và hệ hai còn tồn tại một hệ lai. hệ BCD cho các số hệ mười mã hoa bằng hệ hai (Binary Coded Decimal number). rất thích hợp cho các thiết bị đo cho phần hiển thị số ở đầu ra dùng các loại đèn hiện số khác nhau. ở đây ta dùng 4 số hệ hai để mã hoa một số hệ mười có giá trị năm tron° khoảng 0...9. Như vậy ờ đây ta không dùng hết các tổ hợp có thế có cùa 4 bít.

Vì tầm quan trọng cùa các sỏ BCD nên các bộ vi xử lý thưừng có các lệnh thao tác với chúng.

Ví dụ: Số 840 nếu biểu diễn theo kiểu số BCD thì được 1000 0100 0000. Kết quả này cũng gợi ý cho ta cách thức chuyến đổi giữa 2 loại sô.

Nếu ta dùng hệ hai để biểu diễn các số có giá trị lớn ta sẽ gặp điều bất tiện là số hệ hai thu được quá dài. Ví dụ để biểu diễn số 255 ta cần đến 8 bít viết

như sau: 255 = l i u l i u B

Trong thực tế để viết kết quả biêu diễn cùa các số cho gọn lại người ta tìm các nhóm 4 số hệ hai (Ì nibble) thành một số hệ mười sáu. Khác với hệ BCD vừa nói, hệ 16 dùng hết các tổ hợp có thể của 4 bít để biểu diễn các giá trị số. Để làm được điều này người ta sử dụng các chữ số sẵn có của hệ muôi 0...9 để biểu diễn các giá trị số ứng với 0...9 và dùng thêm các chữ cái A...F để biếu

diễn các giá trị còn lại ứng với 10...15. Đế phân biệt một số hệ mười sáu với các số hệ khác ta kèm thêm chữ H ở cuối. Ta cũng dễ nhận thấy rằng số mười chỉ là một bộ phận của hệ 16.

Hệ hai Hệ 16 Hệ hai Hệ 16 0000 0 1000 8 0001 1 1001 9 0010 2 1010 A 0011 3 l o n B 0100 4 1100 c 0101 5 no i D 0110 6 m o E

o m 7 n u F

8

Page 9: Gt Ngon Ngu Lt Assembly

2. Chuyền đổi giữa các hệ đêm Đổi sỏ hệ mười sang hẹ hai Quy tắc: Lấy số cần đổi chia cho 2 và ghi nhớ phần dư. tiếp theo lá)

thương của phép chia trước đó chia cho 2 và ghi nhớ phần dư. Làm như vậy cho tới khi được thương bằng 0. Đáo ngược thứ tự dãy các sỏ dư sẽ dược các chữ số của hệ hai cần tìm.

Trong trường hợp số hệ mười cần đổi có thêm phán lé cho dâu phay thì đầu tiên ta phải đổi rẽ từng phần rồi sau đó cộng các kết quá lại. Đỏi với phần nguyên ta có thể làm theo 2 cách đã nói ở liên. Riêng đỏi với phần sau dấu phay ta đổi theo quy tắc trình bày sau đây.

Lấy số cần đổi nhân với 2. tích nhận được sẽ gồm phần nguyên và phần lé nhị phân. lấy phần lé nhị phân của tích thu được nhân liếp với 2. Làm như vậy cho tới khi tích chẩn bằng 1. Chọn riêng các phần nguyên (phần trước dấu phẩy) của các tích thu được và sắp xếp lại sẽ được các chữ sô sau dấu phẩy của hệ hai cần tìm.

Ví dụ: Đổi 0,125 ra số hệ hai. Ta thực hiện phép nhân lần lượt theo các bước trên:

0.125 X 2 0,250 0,250 X 2 0,500 0,500 X 2 1,000

và thu được kết quả là 0,125 = 0,001 B (phần được đóng trong khung). Kết hợp các ví dụ trên lại, nếu phải đổi số 34,125 ra hệ hai ta thu được kết

quả cuối cùng là 34,125 = 100010,001 B. Đổi sô hệ hai và hệ sô Hex: Ví dụ: 2B3Ch đổi ra hệ hai

2 B 3 c 0010 lon 0011 1100

Đổi sô hệ thập phản và hệ sò Hex Ví dụ: Đổi số 1978 ra hệ Hex

9

Page 10: Gt Ngon Ngu Lt Assembly

Đầu tiên chia 1978 cho 16 nhân được thương số 123 và số dư là 10 1978 = 123 X 16 + 10

số dư chính là hàng đơn vị của số biêu diễn dạng số Hex. 10 = Ah Cứ liếp tục chia cho đến khi thương số bằng 0. Chuyển đổi các số dư

Hcx và ghép chúng lại với nhau theo thứ tự ngược lại. 1978 = 123 X 16 + 10(Ah) 1978 = 7BAh

123= 7 x l 6 + l l ( B h ) 7 = 0 X 16 + 7(7h)

3. Các phép tính vối số nhị phân và hệ Hexa

Sô nhị phân: - Phép cộng:

0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1=0 dư Ì

Ví dụ: no

+ 011 no phần dư 1001

- Phép trừ: 0-0 = 0 0 -1 = 1 nợ Ì 1 -0=1 1-1=0

Ví dụ: no

-011 l i phần nợ 011

10

Page 11: Gt Ngon Ngu Lt Assembly

Sô Hexa:

Bảng cộng số Hex

0 ỉ 2 3 4 5 6 7 8 9 A B c D l i F

0 0 1 2 3 4 5 6 7 8 9 Ả B c D F. F

1 1 2 3 4 5 6 7 8 9 A B c D E F 10

2 2 3 4 5 6 7 8 9 A B c D E F l o n

3 3 4 5 6 7 8 9 A B c D E F 10 l i 12

4 4 5 6 7 8 9 A B c D E F 10 11 12 13

5 5 6 7 8 9 A B c D E F 10 l i 12 13 14

6 6 7 8 9 A B c D E F 10 l i 12 13 14 15

7 7 8 9 A B c D E F 10 l i 12 13 14 15 16

8 8 9 A B c D E F 10 l i 12 13 14 15 16 17

9 9 A B c D E F 10 l i 12 13 14 15 16 17 18

A A B c D E F 10 11 12 13 14 15 16 17 18 19

B B c D E F 10 l i 12 13 14 15 16 17 18 19 1A

c c D E F 10 l i 12 13 14 15 16 17 18 19 1A1B

D D E F 10 l i 12 13 14 15 16 17 18 19 1A1B 1C

E E F 10 l i 12 13 14 15 16 17 18 19 1A1B 1C1D

F F 10 l i 12 13 14 15 16 17 18 19 1A1B 1C1D1E

Ví dụ: 5B39h + 7AF4h

D62Dh Sử dụng bảng cộng ta có thê tra ra các phép trừ Ví dụ: D26F

BA94 17DB

Page 12: Gt Ngon Ngu Lt Assembly

4. Dạng ký tự Được lưu nữ theo dạng mã ASCII (American Standard Codc information

Intcrchangc) Mã chuẩn, mồi ký tự chiếm một byte. Máy tính không biết sì vé

ký lự ASCII mà chi xem chúng như là một byte bất kỳ. với một ngoại lệ. Trong báng mã ASCII tiêu chuẩn người la dùng 7 bít để mã hoa các ký tự

thỏníi dụng. như vậy bảng mã này sẽ có 128 ký tự ứng với mã số từ 0-127. Khi tra các bàng này ta đọc mã của ký tự theo thứ lự cột-hàng.

Bàng mã ASCII (American Standcưd Code inỊonnaiion Interchange -Mã tiên chuẩn /rao dổi thỏm; liu)

Hexa-deđmal

0 1 2 ì 4 5 6 7

0 <ML>

0

<DLE>

16

<SP>

32 0 48

@ 64

p 80 96

p 112

ì <SOH>

1

<DC1>

17 t 33

1 49

A 65

Q 81

a 97

q 113

2 <srx>

2

<DC2>

18 34 2 50

b 66

R 82

b 98

r 114

3 <ETX>

3

<DC3>

19 #

35 3 51

c 67

s 83

c 99

s 115

4 <EOT>

4

<DC4>

20 $

36 4 52

D 68

T 84

d 100

t 116

5 <ENQ>

5

<NAK>

21 %

37 5 53

E 69

u 85

e loi

u 117

6 <ACK>

6

<SYN>

22 &

38 6 54

F 70

V 86

f 102

V 118

7 <bel>

7

<etb>

23 í 39

7 55

G 71

w 87

g 103

w 119

8 <bs>

8

<CAN>

24 ( 40

8 56

H 72

X 88

h 104

X 120

12

Page 13: Gt Ngon Ngu Lt Assembly

9 <m>

<EM>

25 ) 41

9 57

ì 73

Y 89

i 105

ỵ ' 121

A <LP>

10

<SUB>

26 42 58 J

74 z

90 j

106 l

122 b <VT>

11

<ESO>

27 +

43 59 k

75 [

9 i k

107 1 123

c <FF>

12

<IS>

28 44 < 60

L 76

\ 92

1 108

1 124

D <CR>

13

<GS>

29 45 61 M

77 1 93

in 109

1 125

E <SO>

14

<RSI>

30 46 > 62

N 78

A 94

n 110 126

F <SI>

15

<us>

31 / 47

9 63

() 70 95

0 IU

<Di-;i.>

127

5. Biểu diễn sô nguyên nhị phân trong máy tính

5.1. Biểu diễn số nguyên không dâu

Số nguyên không dấu (unsigned integer) biêu diễn các sô nguyên dương. Số nguyên không dấu rất thích hợp để biêu diễn các đại lượng luôn dương. chẳng hạn địa chi cua ó nhớ, bộ đếm hay mã ASCII của ký tự (chúng ta sẽ thấy sau này). Bởi vì các số nguyên khôn!! dấu được định nghĩa là các số dương nên không cần dùng bít nào của nó để biểu diễn dấu. do đó 8 bít của một byte hay 16 bít cùa một word đều được dùng để biểu diễn số.

Số nguyên không dấu lớn nhất có thể chứa trong một byte là l i u l i u = FFh = 255

Số nguyên không dấu lớn nhất có thể chứa trong một Word là:

l i u l i u l i u l i u l i u = FFFFh = 65535 Trong trường hợp không đủ chúng ta có thể sứ dụng hai vvord hoặc hơn nữa.

13

Page 14: Gt Ngon Ngu Lt Assembly

5.2. Biếu diên số nguyên có dấu Kít dấu

Số nguyên có dấu (signed inleger) có the là số dương hoặc số âm. Bít nặng nhài MSB được dùng đe biêu diễn dâu cùa sò. MSB bằng 0 biếu diễn số dương. còn bằng Ì biêu diễn sô âm.

Các số âm được lưu trong máy tính dưới dạng số bù 2. đè hiếu được khái niệm số bù ĩ. trước liên chúng la hãy cùng nhau tìm hiểu khái niệm sô bù 1.

Số bù Ì cùa sô nguyên nhận được bằng cách lấy phần bù cùa các bít của nó. có nghĩa là đảo bít: thay mỏi bi! 0 bằng Ì và ngược lại, Ì bằng 0.

Ví dụ: Tim sỏ bù Ì cùa 5 = 0000 0000 0000 0101 Số bù một của 5 = l i u l i u l i u 1010

Số bù hai: Đế nhận được sò bù 2 của một số nguvên ta chi việc cộng Ì vào sò bù Ì

cùa nó. Ví dụ: Tim số bù 2 của 5?

Theo kết quả ở trẽn.

Số bù Ì cùa 5 l i u l i u l i u 1010 +]_

Số bù ĩ của 5 l i u l i u l i u l on Bây giờ hãy cộng 5 với số bù 2 cứa nó

Sốbù2cúa5 liu liu liu lon số 5 +0000 0000 0000 0101

Tống nhận được 10000 0000 0000 0000

Chúng ta nhận được một số 17 bít vì một word bộ nhớ chi có thể lưu được 16 bít, phần nhớ Ì nằm ở bít già nhất msb sẽ bị mất, do đó kết quà 16

bít bằng 0. Do tổng cùa 5 và số bù 2 cùa nó bằng 0. số bù 2 của 5 rõ ràng biểu diễn giá trị -5.

14

Page 15: Gt Ngon Ngu Lt Assembly

l i . CÁC BỘ VI XỨ LÝ 80x86 CỦA ITKL

1. Giói thiệu về các bộ vi xử lý Bộ óc cùa các máy tính là một bộ vi xử lý nó thực hiện tất cá các cõng việc

xử lý các lệnh và dữ liệu. Các bộ vi xứ lý khác nhau chú yếu ớ tốc độ của chúng, dung lượng bộ nhớ, các thanh ghi và bus dữ liệu. Một bus dữ liệu chuyên dữ liệu giữa bộ vi xứ lý. bộ nhớ và các thanh ghi phần bẽn ngoài (nghĩa

là quán lý việc lưu thông dữ liệu). Sau đây là mỏ tá vắn tất các bộ vi xử lý khác nhau của Intcl.

Bộ vi xử lý 8088/80188: Các bộ vi xử lý này có các thanh ghi 16-bit và bus dữ liệu 8-hít. có thê

định địa chi một bộ nhớ nội đến Ì M (với 20 đường địa chi). Các thanh ghi cổ thê xử lý đổng thời 2 byte trong khi bus dữ liệu mỗi lần chí có the chuyên một byte. 80188 là phiên bản cùa 8088 với một vài lệnh được thủm vào. Cá hai loại vi xử lý này đều hoạt động ở chế độ thực (real mocle), nghĩa là một chương trình ở một thời điểm.

Bộ vi xử lý 8086/80186: ' Các bộ vi xử lý này tương tự như 8088/80188 nhưng bus dữ liệu 16-bit và

chạy nhanh hơn. 80186 là phiên bản của 8086 với một vài lệnh được thêm vào. Bộ vi xử lý 80286: Bộ vi xử lý này chạy nhanh hơn các bộ vi xử lý trước đó và có thể định địa

chi một bộ nhớ lên đến 16 MB (với 24 đường địa chi). Bộ vi xử lý này có thế

hoạt động ở chế độ thực và chế độ bảo vệ (protccted modc) cho lập trình đa nhiệm (multitasking).

Bộ vi xử lý 80386: Bộ vi xử lý này có các thanh ghi 32-bit và bus dữ liệu 32-bit, có thế định

địa chi một bộ nhớ lên đến 4 GB (với 32 đường địa chi). Bộ vi xử lý này có thể hoạt động ở chế độ thực và chế độ bảo vệ cho lập trình đa nhiệm.

Bộ vi xử lý 80486: Bộ vi xử lý này có các thanh ghi 32-bit và bus dữ liệu 32-bit (mặc dù có

phiên bản chỉ có bus dữ liệu 16-bit) và được thiết kế với các đặc tính nâng cao.

15

Page 16: Gt Ngon Ngu Lt Assembly

Bộ vi xử lý này có the hoạt động ớ chế độ thực và chế độ bảo vệ cho lập trình đa nhiệm. Bộ vi xứ lý Pcntium: Bộ vi xử lý này có các thanh ghi 32-bit và bus dữ liệu 64-bit, có khá năng thực thi nhiều hơn mội lệnh trong Ì chu kỳ xung clock.

2. Cấu trúc bộ vi xử lý 80x86

BU

Thanh ghi đa năng

Thanh ghi con trỏ và chi số

ẢM AI. lỉu BL CH CL DU DL

SP BP SI DI

ALU

CU

IP

Bìu

cs DS ss ES

Bus

Thanh ghi đoan

Đệm lệnh

Bộ vi xử lý được chia thành 2 đơn vị logic: đơn vị thực thi lệnh EU (exe-cution unit) và đơn vị giao tiếp bus Bìu (bus interíace unit) như ở hình dưới

16

Page 17: Gt Ngon Ngu Lt Assembly

đây. Vai trò của EU là thực thi các lệnh trong khi Bìu phán phối các lệnh và dữ liệu đến BU. EU chứa đơn vị số học-logic ALU (arithmetic logic unit), đơn vị điêu khiến cu (control unit) và một tập các thanh ghi. Các đạc trưng này cung cấp khả năng thực thi các chi thị và thực hiện các phép toán số học-logic.

Execution Unit: đơn vị xử lý EU Bua Interíace: đơn vị giao tiếp bus Bìu

Program control: điều khiên chương trình Bus control unit: đơn vị điều khiên bus

Instruction Queue: hàng đợi lệnh Arithmethic-Logic Unit: đơn vị số học logic ALU Control Unit: đơn vị điều khiển cu Flags register: thanh ghi cờ Instruction Pointer: con trỏ lệnh rp Nhiệm vụ quan trọng của Bìu là quản lý đơn vị điều khiến bus, các thanh

ghi segment và hàng đợi lệnh (instruction queue). Bìu điểu khiển các bus để chuyển dữ liệu đến EU, đến bộ nhớ và đến các thiết bị xuất nhập bên ngoài trong khi các thanh ghi segment cho phép ta định địa chỉ bộ nhớ.

Nhiệm vụ khác của Bìu là tìm nạp các lệnh. Vì các lệnh của một chương trình đang thực thi ở trong bộ nhớ, Bìu phải tìm nạp các lệnh từ bộ nhớ và đặt chúng vào hàng đợi lệnh.

EU và Bìu làm việc song song, trong đó Bìu đi trước một bước. EU thông báo cho Bìu khi cần truy xuất dữ liệu trong bộ nhớ hoặc một thiết bị ngoại vi. EU cũng yêu cầu các chỉ thị từ hàng đợi lệnh của Bìu. Trong khi EU đang bận thực thi một lệnh, Bìu tìm nạp một lệnh khác từ bộ nhớ. Việc tìm nạp trước này giúp tăng tốc độ xử lý của bộ vi xử lý.

Các bộ vi xử lý 80486 trở về trước chỉ sử dụng kỹ thuật đường ống đơn (single pipeline) nên bị hạn chế trong việc thực thi các lệnh, một lệnh phải được hoàn tất trước khi bắt đầu lệnh tiếp theo. Pentium và các bộ vi xứ lý sau này có cấu trúc đường ống đôi (double pipeline) cho phép chúng thực hiện song song nhiều thao tác.

17

Page 18: Gt Ngon Ngu Lt Assembly

HI. CÁC THANH GHI CÙA BỘ VI x ử LÝ 8086/8088 Thông tin được lưu giữ bên trong bộ vi xử lý nằm trong các thanh ghi. Bộ

vi xử lý 8086/8088 có 14 thanh ghi. Các thanh ghi được phán chia theo chức năng của chúng dưới các dạng sau:

1. Các thanh ghi dữ liệu AX, BX, cx, DX Gồm 4 thanh ghi, được người lập trình sử dụng cho các thao tác với dữ

liệu. Bộ vi xử lý có thê thao tác với dữ liệu trong bộ nhớ nhưng tốc độ xử lý sẽ nhanh hơn nếu dữ liệu được lưu trong các thanh ghi. Vì vậy hiện nay các bộ vi xử lý hiện đại đều được cấu tạo nhiều thanh ghi hơn.

Các bytc cao và bytc thấp trong các thanh ghi này có thể truy nhập riêng biệt. Byte cao thanh ghi AX gọi là AU, byte thấp gọi là AL. Tương tự như vậy các byte cao và bvte thấp của các thanh ghi BX. cx . DX lần lượt là BU và BL. CH và CL, DH và DL. Nhờ điều này mà ta có thêm nhiều thanh ghi khi làm

việc với số liệu kích thước bytc. Bốn thanh ghi trên có công dụng chung là thanh ghi dữ liệu, ngoài ra chúng còn thực hiện các chức năng đặc biệt sau:

AX 15 8 7 0 bít AH AL

BX 15 8 7 Obit BH BL

cx 15 8 7 Obit CH CL

DX 15 8 7 Obit DH DL

- Thanh ghi AX (Accumulator register): Thanh ghi chứa. AX là thanh ghi được sử dụng trong các lệnh số học, logic và chuyên dữ liệu vì việc sù dụng chúng tạo ra mã máy ngắn nhất.

- Thanh ghi BX (Base register): Thanh ghi cơ sở. BX đóng vai trò thanh ghi địa chí.

18

Page 19: Gt Ngon Ngu Lt Assembly

- Thanh ghi CXịCount register): Thanh ghi đếm. cx đóng vai trò bộ đếm

vòng lặp, CL cũng được sứ dụng là biến đếm trong các lệnh dịch hay quay vòng.

- Thanh ghi DX(Daia register): Thanh ghi dữ liệu. DX được sử dụng trong các thao tác nhân và chia, nó cũng được sử dụng trong các thao tác vào/ra (in/out).

2. Các thanh ghi đoạn cs, DS, ES, ss Một chương trình ngôn ngữ máy điên hình gồm các lệnh và dữ liệu. Ngoài

ra còn có một cấu trúc dữ liệu khác gọi là ngăn xếp (Stack) được bộ vi xử lý sử dụng để thực hiện các lời gọi thủ tục. Mã, dữ liệu và ngăn xếp của chương trình được nạp vào các đoạn bộ nhớ khác nhau, ta gọi chúng là các đoạn mã (Code segment), đoạn dữ liệu (Data segment), và đoạn ngăn xếp (stack segment).

Để theo dõi các đoạn khác nhau của chương trình, 8088 được cung cấp 4 thanh ghi đoạn 16 bít để chứa các địa chi đoạn. Đó là các thanh ghi cs, DS. ss lần lượt chứa địa chi các đoạn mã, đoạn dữ liệu và đoạn ngăn xếp. Nếu

chương trình cần truy nhập đến một đoạn dữ liệu thứ hai nó có thể sử dụng thanh ghi đoạn dữ liệu phụ ES (Extra segment).

Tại mọi thời điểm, chì những ô nhớ được định địa chỉ bởi 4 thanh ghi đoạn mới có thể được truy nhập. Có nghĩa là chí có 4 đoạn bộ nhớ hoạt động, tuy nhiên nội dung của các thanh ghi đoạn có thế được thay đổi bởi chương trình để truy nhập đến các đoạn khác nhau.

3. Các thanh ghi con trỏ và chỉ số IP Con trỏ lệnh (Instruction Pointer): Luôn trỏ vào lệnh tiếp theo sẽ được

thực hiện trong đoạn mã cs. BP Con trỏ cơ sở (Base Pointer): Luôn trỏ vào một dữ liệu nằm trong đoạn

ngăn xếp ss.

SP Con trỏ ngăn xếp (Stack Pointer): Luôn trỏ vào đính hiện thời của ngăn xếp nằm trong đoạn ngăn xếp ss .

SI Chỉ số gốc (Source index): Chi vào dữ liệu trong đoạn dữ liệu DS. DI Chi số đích (Destination index): Chi vào dữ liệu trong đoạn dữ liệu ES.

19

Page 20: Gt Ngon Ngu Lt Assembly

4. Thanh ghi cờ Là thanh ghi 16 bít, nhưng chỉ có 9 bít đế làm các bít cờ và nó chia ra 6

bít điều kiện 3 bít điều khiển.

X X X X o D ì T s z X A X p X c

X không được định nghĩa

Các cờ cụ thể: c hoặc CF (Carry flag) Cờ nhớ: CF = Ì bằng Ì khi có nhớ. p hoặc PF (Parity flag) Cờ Parity: PF = Ì số chữ số trong kết quá là số chẵn. A hoặc AF (Auxihary carry flag) AF = Ì khi có nhớ hoặc mượn từ một số

BCD thấp (4bit thấp) sang số BCD cao (4bit cao). z hoặc ZF (Zero flag) Cờ rỗng: ZF = Ì khi kết quả bằng 0. s hoặc SF (Sign flag) Cờ dấu: SF = Ì khi kết quả âm. o hoặc OF (Overflow flag) Cờ tràn: OF = Ì khi kết quả là số bù 2 vượt ra

ngoài giới hạn biểu diễn dành cho nó. T hoặc TF (Tráp flag) Cờ bẫy: TF = Ì khi bộ vi xử lý làm việc ờ chế độ

chạy từng lệnh. ì hoặc IF (Interrupt enable flag) Cờ cho phép ngắt: IF = Ì thì bộ vi xử lý

cho phép các yêu cẩu ngắt (Che được) được tác động. D- DF (Direction flag) Cờ hướng: DF = Ì khi bộ vi xử lý làm việc với

chuỗi ký tự từ phải sang trái (từ địa chí thấp tới địa chỉ cao).

IV. NGẮT VÀ PHÂN LOẠI NGẤT

1. Khái niệm Ngắt là các chương trình con Thủ tục và Hàm có sẵn trong máy. Hàm ngắt không có tên mà thay vào đó là Ì con số O...FF Mỗi hàm ngắt lại chứa bên trong nó nhiều hàm con.

2. Phân loại ngắt Có 3 loại ngắt sau:

20

Page 21: Gt Ngon Ngu Lt Assembly

2.1. Ngát cứng Về cơ bản các ngắt được hiểu là cho phép các thiết bị phần cứng ngắt các

thao tác của CPU. Ví dụ, khi ta nhấn một phím bất kỳ, bộ vi xử lý phái được báo để đọc một

mã phím vào bộ đệm bàn phím. Các ngắt cứng nói chung xảy ra như sau: - Thiết bị phần cứng cần phục vụ gửi tín hiệu yêu cầu ngắt đến bộ vi xử lý; - Bộ vi xử lý treo công việc đang thực hiện và chuyển điều khiên cho

chương trình phục vụ ngắt. - Chương trình phục vụ ngắt phục vụ ngắt cứng với việc thực hiện một vài

thao tác vào ra. - Điều khiển được trả về cho chương trình đang thi hành tại thời điểm bị treo. Thực hiện một chương trình phục vụ ngắt tương ứng như gọi một thủ tục.

Trước khi chuyến điều khiển cho phục vụ ngắt, đầu tiên bộ vi xử lý ghi địa chỉ của lệnh tiếp theo (địa chỉ trở về) vào ngăn xếp. Bộ vi xử lý còn cất thanh ghi cờ vào trong ngăn xếp để đảm bảo phục hồi lại trạng thái của chương trình bị ngắt. Các chương trình phục vụ ngắt còn phục vụ hồi mọi thanh ghi khác mà chúng sử dụng.

2.2. Ngắt mềm

Ngắt mềm được các chương trình sử dụng đế yêu cầu các phục vụ của hệ thống. Một ngắt mềm (software interrupt) xảy ra khi chương trình gọi một phục vụ ngắt bằng lệnh INT. Dạng của lệnh INT như sau:

INT n (số hiệu ngắt) - Bộ vi xử lý coi số hiệu ngắt này cũng giống như số hiệu ngắt phát sinh bởi

một thiết bị phần cứng. Trong đó n là số hiệu ngắt nằm trong khoảng 00-FFh (256 vectơ ngắt) được nạp vào bộ nhớ RAM khi khởi động chương trình và mỗi kiểu ngắt = Ì vectơ ngắt. Ì vectơ ngắt cần 4 byte để chứa địa chỉ đầy đủ cho CS:IP của chương trình con phục vụ ngắt.

Như vậy 256 vectơ ngắt chiếm 256 X 4 = 1024 byte = 1KB

Ví dụ: gọi ngắt chờ nhập ký tự từ bàn phím MOV AH,1 Im 21h

21

Page 22: Gt Ngon Ngu Lt Assembly

2.3. Ngát cứng nội bộ Có một loại ngắt cứng nội bộ (processor exception). Một ngắt cứng nội bộ

xảy ra khi có một xử lý đặc biệt chẳng hạn như xảy ra tràn khi chia. Mỗi trạng thái tương ứng với một loại ngắt duy nhất. Ví dụ, phép chia tràn tương ứng với ngắt 0 và như thế khi một phép chia bị tràn, bộ vi xứ lý tự động thi hành ngắt 0 xử lý tình huống tràn.

3. xử lý ưu tiên khi ngắt Tại một thời điếm có nhiều yêu cầu ngắt thuộc các loại ngắt khác nhau bộ

vi xử lý sẽ xử lý theo thứ tự ưu tiên sau: - Ngắt nội bộ INT 0 (phép chia hết cho 0) INT n.

- Ngắt không che được NMI. - Ngắt che được INTR. - Ngắt để chạy từng lệnh INT Ì.

4. Ngắt 21 h của DOS và BIOS sử dụng trong các lệnh VÀO/RA Hàm 1: Nhận một ký tự dạng ASCỈ1 từ bàn phím:

Vào: AH = Ì Ra: AL = mã ASCII nếu một phím được ấn. Ví dụ: Mov AH,1

im 21h Ký tự nhận được nằm ở thanh ghi AL Hàm 2: Đưa ra màn hình một ký tự dạng ASCII được chứa trong thanh ghi DL. Vào: AH = 2

DL = mã ASCII của ký tự hiển thị Ra: AL = mã ASCII của ký tự hiển thị Ví dụ : mov AH,2

mov "*" im 21h

dùng hàm này sẽ hiện ký tự "*" ra màn hình

22

Page 23: Gt Ngon Ngu Lt Assembly

Hàm 9: Hiển thị một chuỗi Vào: DX=địa chí tương đối (oíĩset) của chuỗi.

chuỗi ký tự được kết thúc bằng dấu $. Ví dụ: .DATA

Thao DB 'Hello,you!$'

loa DX.Tbao mov AH,9 im 21h

dùng hàm này sẽ hiện dòng ký tự "Hello,you!" ra màn hình Hàm 4Ch: Trở về DOS:

Ví dụ: mov AH,4Ch int 21h

Khi dùng hàm này chương trình kết thúc, trở về DOS

V. CÁC PHÉP ĐỊNH ĐỊA CHỈ

1. Vấn đề gọi địa chỉ của toán hạng Trừ một số ít lệnh không cần toán hạng, đa số lệnh của bộ vi xử lý cần toán

hạng, tức dữ liệu cho lệnh. Dữ liệu đó có thế là số liệu cho các phép toán số học hay logic hoặc địa chí cho hành động nhảy chương trình. Dữ liệu trên có thế tìm thây trong số liệu tức thì ghi ngay trong lệnh, trong thanh ghi và trong ô nhớ. Bộ vi xử lý sẽ gọi các dữ liệu trên bằng cách phát địa chi để đọc các toán hạng vào các thanh ghi của Bộ vi xử lý. Mỗi dòng lệnh chỉ có một mã lệnh, tức một hành động duy nhất nhưng toán hạng tức số liệu cho lệnh có thể đọc, tìm ở trong ba nguồn số liệu trên, đặc biệt trong ô nhớ có nhiều phương pháp gọi tìm số liệu (trực tiếp, gián tiếp, thanh ghi cơ sở, chí sô v.v...). Chính sự phong phú của các phương pháp hay chế độ gọi địa chi này mà sô lệnh mở rộng của một Bộ vi xử lý rất lớn tuy rằng số lệnh cơ bán có hạn.

23

Page 24: Gt Ngon Ngu Lt Assembly

2. Các phương pháp địa chỉ của toán hạng

2.1. Chê độ địa chỉ thanh ghi Trong chế độ địa chỉ này người ta dùng các thanh ghi bên trong bộ vi xử

lý như là các toán hạng để chứa dữ liệu cần thao tác. Vì vậy khi thực hiện lệnh có thê đạt tốc độ truy nhập cao hơn so với các lệnh có truy nhập đến bộ nhớ.

Ví dụ: MOV BX,DX;chuyển n ộ i dung DX vào BX. MOV DS,AX;chuyển n ộ i dung AX vào DS. ADD AL,DL;cộng n ộ i dung AL và DL r ồ i đưa vào AL

2.2. Chê độ địa chỉ tức thì Trong chế độ địa chỉ này toán hạng đích là một thanh ghi hay một ô nhớ.

còn toán hạng nguồn là một hằng số và ta có thê tìm thấy toán hạng này ừ ngay sau mã lệnh. Có thể dùng chế độ địa chỉ này để nạp dữ liệu cần thao tác vào bất kỳ thanh ghi nào (trừ các thanh ghi đoạn và thanh cờ) hoặc vào bất kỳ ô nhớ nào trong đoạn dữ liệu DS.

Ví dụ: MOV BL,80 /chuyển 80 vào BL MOV AX,0FFFH /chuyển 0FFFH vào AX để r ồ i đưa MOV DS,AX ;vào DS (v ì không t h ể chuyển

/ t r ự c t i ế p vào thanh ghi đoạn) MOV [ BX] ,20 /chuyển 20 vào ô nhớ t a i đ ị a

/ c h ỉ DS:BX

2.3. Chế độ địa chỉ trực tiếp

Trong chế độ địa chỉ này một toán hạng chứa địa chi lệch cùa ô nhớ vùng chứa dữ liệu còn toán hạng kia chỉ có thể là thanh ghi mà không được là ô nhớ.

Ví dụ: MOV AL,[ 197ŨH] / chuyển n ộ i dung ô nhớ DS:1970h vào AL. MOV [ 8450H],cx /chuyển n ộ i dung cx vào 2 ô nhớ l i ê n

t i ế p DS:8450 và DS:84511.

24

Page 25: Gt Ngon Ngu Lt Assembly

2.4. Chẽ độ địa chí gián tiếp qua thanh ghi

Trong chế độ địa chí này một toán hạng là một thanh ghi được sử đụn" đế

chứa địa chi lệch cùa ô nhớ chứa dữ liệu, còn toán hạng kia chi có thê là thanh ghi mà không được là ó nhớ .

Ví dụ: MOV AL, [ BX] ;chuyển nội dung ô nhớ có đ ịa

; c h ỉ DS:BX vào AL. MOV [ S I ] , Ch ;chuyển n ộ i dung CL vào ô nhớ

; có đ ịa ch ỉ DS:SI. MOV [ DI] , AX ;chuyển nôi dung AX vào 2 ô nhớ

/ l i ê n t i ế p có đ ịa ch ỉ DS: DI và ; DS: (DI + 1) .

2.5. Chê độ địa chỉ tương đòi cư sở Trong chế độ địa chi này toán hạng đích là mội thanh ghi, còn toán hạng

nguồn là các thanh ghi cơ sở như BX và BP và các hằng số được dùng đê tính địa chi hiệu dụng trong các vùng nhớ DS và ss.

Ví dụ: MOV cx,[ BX] +10 /chuyển n ộ i dung 2 ô nhớ l i ê n t i ế p

có đ ịa ch ỉ DS:(BX+10) và ;DS: (BX+11) vào cx.

MOV cx,[ BX+10] ; Ì cách v i ế t khác của lênh t r ê n . MOV AL,[ BP] +5 /chuyển nôi dung ô nhớ SS:(BP+5)

;vào AL.

2.6. Chế độ địa chỉ tương đỏi chí sò Trong chế độ địa chi này toán hạng đích là một thanh ghi. còn toán hạng

nguồn là các thanh ghi chi số như SI và DI và các hàng số được dùng để tính địa chi hiệu dụng trong vùng nhớ DS.ES.

Ví dụ: MOV AX, (SI)+10 /Chuyển n ộ i dung 2 ó nhớ l i ê n t i ế p

có đ ị a ch ỉ DS:(SI+1Ũ) và DS:(SI+11) vào AX

25

Page 26: Gt Ngon Ngu Lt Assembly

2.7. Chê độ địa chí tương đòi chi sỏ cơ sú Kết hợp hai chế độ địa chi chi sò và cơ sớ ta có chế độ địa chi chi sô cơ sờ.

Trong chê độ địa chi này ta dùng cá thanh ghi cơ sớ lẫn thanh ghi chi số và hằng sô để tính địa chi hiệu dụng cùa toán hạng nguồn, còn toán hạng đích là mội thanh ghi.

Ví dụ: MOV AX,[ BX] [ SI] +8 /chuyển n ộ i dung hai ô nhớ l i ê n t i ế p có đ ịa ch ỉ DS:(BX+SI + 8) và DS:(BX+SI + 9) vào AX. MOV AX,[ BX+SI + 8] ; Ì cách v i ế t khác của l ệnh t r ê n MOV CL,[ BP+DI + 5] /chuyển n ộ i dung ó nhớ ss:(BP+DI+5) vào CL.

VI. TỆP LỆNH BỘ VI XỬ LÝ 8086/8088 Tệp lệnh của bộ vi xử lý 8086/8088 có thế chia thành 6 nhóm sau:

1. Nhóm các lệnh chuyển dữ liệu

1.1. Lệnh MOV Cú pháp: MOV đích, nguồn Chức nâng: Chuyến giá trị toán hạng nguồn vào toán hạng đích Ví dụ: MOV AH/VVORDl ; Chuyến nội dung ô nhớ WORDl vào thanh ghi AH. MOV AX,BX : Chuyến nội dung thanh ghi BX vào trong AX (Sao

nội dung BX vào AX) Các khá năng kết hợp cho phép của các toán hạng trong lệnh MOI'

Toán hạng đích

Toán hạng nguồn

Thanh ghi còng dụng

chung

Thanh ghi đoạn

Ônhớ Hàng số

Thanh ghi công dụng chung Được Được Được Không

Thanh ghi đoạn Được Không Được Không Ônhớ Được Được Không Không

Hằng số Được Không Được Không

26

Page 27: Gt Ngon Ngu Lt Assembly

1.2. Lệnh PUSH

Cú pháp: PUSH nguồn Chức nâng: Chuyển giá trị toán hạng nguồn vào đinh ngăn xếp

Ví dụ:

PUSH BX ; Cất nội dung trong BX vào đính ngăn xếp

1.3. Lệnh PUSHF

Cú pháp: PUSHF

Chức năng: Cất giá trị thanh ghi cờ vào đinh ngân xếp

1.4. Lệnh POP

Cú pháp: POP đích

Chức năng: Chuyển giá trị từ đính ngăn xếp vào toán hạng đích

Ví dụ:

POP DX ; lấy 2 byte từ đinh ngăn xếp đưa vào thanh ghi DX.

1.5. Lệnh POPF

Cú pháp: POPF Chức năng: Chuyển giá trị từ đỉnh ngăn xếp vào thanh ghi cờ

1.6. Lệnh XCHG

Cú pháp: XCHG đích, nguồn

Chức năng: Hoán chuyển giá trị giữa toán hạng nguồn và toán hạng đích

Ví dụ :

XCHG AH, BL; hoán chuyển nội dung giữa hai thanh ghi.

1.7. Lệnh IN

Cú pháp: IN AL, địa chỉ cổng (cổng 8 bít)

IN AX, địa chỉ cổng (cổng 16 bít) Chức nâng: Đọc giá trị 8 hoặc 16 bít từ Ì cổng vào thanh ghi

27

Page 28: Gt Ngon Ngu Lt Assembly

1.8. Lệnh OUT Cú pháp: OUT địa chi cống (cổng 8 bít). AL

OUT địa chi cổng (cổng 16 bít), AX Chức năng: Chuyển giá trị Ì byte của thanh ghi AL hoặc 2 Byte của

thanh ghi AX ra cổng (PORT) Ví dụ: Địa chi cổng là FFFFh ta có lệnh như sau:

MOV FFFFh, AX ;chuyển nội dung trong AX ra cổng có địa chí FFFFh

1.9. Lệnh LEA Cú pháp: LEA thanh ghi. biến nhớ Chức nàng: Đưa phần địa chí OFFSET của toán hạng nguồn (Biến

nhớ) vào thanh ghi đích. Đích thường là một trong các thanh ghi BX, cx. DX. BP, SI, DI.

Gốc là tên biến trong đoạn DS được chi rõ trong lệnh hoặc ô nhớ cụ thể Ví dụ: LEA DX, TIN ; nạp địa chỉ lệch của TIN vào DX LEA CX,[BX] [DI] ; nạp vào cx địa chi hiệu dụng do BX và DI chi ra

2. Nhóm các lệnh sô học

2.1. Lệnh ADD Cú pháp: ADD đích, nguồn Chức năng: Cộng giá trị của toán hạng nguồn với giá trị của toán

hạng đích và kết quả được đưa vào toán hạng đích. Ví dụ:

ADD AL,AH ; cộng nội dung 2 thanh ghi 8 bít AH+AL và giá trị sau khi cộng đê vào trong AL

2.2. Lệnh ADC Cú pháp: ADC đích, nguồn Chức năng: Cộng giá trị của toán hạng nguồn với giá trị của toán

hạng đích và bít cờ CF. kết quả được đưa vào toán hạng đích.

28

Page 29: Gt Ngon Ngu Lt Assembly

Ví dụ: ADC AL, AH ;AL = AH+AL+CE nếu CF = Ì kết quá cộng

thêm Ì còn CF = 0 lệnh như ADD.

2.3. Lệnh INC Cú pháp: INC đích Chức năng: Tăng giá trị toán hạng đích lên Ì Ví dụ:

INC AL ; nếu AL = 20h thì INC AL = 20h+1h = 21 h

2.4. Lệnh SUB

Cú pháp: SUB đích. nguồn Chức năng: Trừ giá trị của toán hạng đích với giá trị của toán hạng

nguồn và kết quả được đưa vào toán hạng đích.

Ví dụ: SUB AL.BL ; Lấy nội dung ở thanh ghi AL trừ đi nội dung ờ thanh ghi

BL, giá trị còn lại gửi vào trong AL

2.5. Lệnh SBB

Cú pháp: SBB đích, nguồn Chức năng: Trừ giá trị của toán hạng đích với tổng cùa toán hạng

nguồn với giá trị cờ và kết quả được đưa vào toán hạng đích.

Ví dụ: SBB AL,BL ; AL=AL- (BL+CF). nếu CF=0 lệnh trên giống lệnh

SUB.

2.6. Lệnh ĐÉC Cú pháp: ĐÉC đích Chức năng: Giảm giá trị toán hạng đích đi Ì Ví dụ:

ĐÉC c x ; giảm giá trị trong cx đi Ì

29

Page 30: Gt Ngon Ngu Lt Assembly

2.7. Lệnh NEO Cú pháp: NEG đích Chức năng: Đảo dấu giá trị toán hạng đích Ví dụ:

NEG BU : Đảo dấu giá trị trong BU. O-(AH)

2.8. Lệnh CMP Cú pháp: CMP đích, nguồn Chức năng: So sánh giá trị toán hạng đích với giá trị toán hạng nguồn Ví dụ:

CMP AL.ODh ; Nếu AL là phím xuống dòng? JE THOÁT ; Đúng, thoát ra

2.9. Lệnh MUL Cú pháp: MUL nguồn Chức núng: Nhân nội dung thanh ghi AL, AX với toán hạng nguồn.

Giá trị 2 toán hạng là không dấu. Nếu là 8 bít cất giá trị nhân vào trong AX, còn 16 bít cất vào DX:AX

Ví dụ: nhân hai số 10 và 35 ta có các lệnh

MOV AL,10 ; Chuyển lo vào trong AL MOV BL,35 ; Chuyển 35 vào trong BL MUL BL ; Kết quả lưu trong AX là 350

2.10. Lệnh IMUL Cú pháp: IMUL nguồn Chức năng: Nhân nội dung thanh ghi AL, AX với toán hạng nguồn.

Giá trị 2 toán hạng là có dấu. Nếu là 8 bít cất giá trị nhân vào trong AX. còn 16 bít cất vào DX:AX

Ví dụ: nội dung trong BL = -35 ta có các lệnh

30

Page 31: Gt Ngon Ngu Lt Assembly

MOV AL.10 ; chuyến 10 vào trong AL

IMUL BL ; két quá lưu trong AX là -350

2.11. Lệnh DIV ('li pháp: DIV nguồn Chức nàng: Chia nội dung thanh ghi AX hoặc DX:AX với toán hạng

nguồn. Giá trị 2 toán hạng là không dấu. Nếu giá trị toán hạng bị chia là 16 bít thì thương đặt trong thanh ghi AL

và phần dư đặt trong AU. Nếu toán hạng bị chia là 32 bít thì thương sẽ đặt trong thanh ghi AX. phần

dư cất vào trong thanh ghi DX. Ví dụ: AX chứa 0005h, DX chứa OOOOh và BX chứa 0002h DIV BX ; chia 5 cho 2 ta nhận được 2 dư Ì. Trong đó AX = 0002h

còn DX = 0001h

2.12. Lệnh IDIV Cú pháp: IDIV nguồn Chức năng: Chia nội dung thanh ghi AX hoặc DX:AX với toán hạng

nguồn. Giá trị 2 toán hạng là có dấu. Nếu giá trị toán hạng bị chia là 16 bít thì thương đặt trong thanh ghi AL

và phần dư đặt trong AU. Nếu toán hạng bị chia là 32 bít thì thương sẽ đặt trong thanh ghi AX. phần

dư cất vào trong thanh ghi DX.

3. Nhóm các lệnh thao tác bít

3.1. Lệnh NÓT Cú pháp: NÓT đích Chức năng: Bù Ì toán hạng đích (thực hiện việc đảo giá trị từng bít Ì

của toán hạng đích Ví dụ:

AL = 0111 OOOlb NÓT AL ;AL= 1000 lllOb

31

Page 32: Gt Ngon Ngu Lt Assembly

3.2. Lệnh AND Cú pháp: AND đích, nguồn Chức năng: Và LOGIC giữa 2 toán hạng kết quá đặt ờ toán hạng đích Ví dụ:

AND AL, BL Trong đó BL =0111 0100B

AL = 1001 0101B AND AL, BL =0001 0100B Các bít tính theo báng sau:

AL BL Kết quá

0 0 0

0 1 0

1 0 0

1 1 1

3.3. Lệnh OR Cú pháp: OR đích, nguồn Chức nâng: Hoặc LOGIC giữa 2 toán hạng, kết quá đặt ờ toán hạng đích Ví dụ : OR AL, BL Trong đó BL = 01110100B

AL = Ì 0010101B OR AL, BL = Ị 1110101B Các bít tính theo bảng sau:

AL BL Kết quả 0 0 0 1 1 1 0 1 1 1 0 1

32

Page 33: Gt Ngon Ngu Lt Assembly

3.4. Lệnh XOR Cú pháp: XOR đích, nguồn Chức năng: Chức năng XOR LOGIC giữa 2 toán hạng, kết quả đặt ở

toán hạng đích (các bít có kết quá là Ì nêu giá trị các bít tương ứng cùa 2 toán hạng là khác nhau)

Ví dụ: XOR AL, BL Trong đó: BL=01110100B

AL= 10010101B XOR AL. BL = 11100001B

AL BL Kết quả 0 0 0 0 1 1 1 0 1 1 1 0

3.5. Lệnh SHL/SAL Cú pháp: SHL/SAL đích, Count Chức năng: Dịch trái các bít của toán hạng đích đi Count lần (giá trị

Count được đặt trong thanh ghi CL, nếu Count = Ì có thế đặt trực tiếp vào toán

hạng của lệnh). Một giá trị 0 sẽ được đưa vào vị trí bên phải nhất của toán hạng đích. còn bít bên trái nhài cùa nó được đưa vào cờ CF.

CF

Ví dụ: BL = 00001000 hệ thập phân là 8 ta dịch trái đi 3 lần BL MOV CL,3 : nạp số lần dịch vào CL SAL BL, CL; BL dịch trái 3 lần

33

Page 34: Gt Ngon Ngu Lt Assembly

Lúc này giá trị BL = 01000000 hệ thập phàn là 64. như vậy mỗi lán dịch trái giá trị trong BL nhân gấp đôi.

3.6. Lệnh SHR Cú pháp: SHR đích. Count Chức nâng: Dịch phải các bít của toán hạng đích đi Count lần (giá trị

Count được đặt trong thanh ghi CL, nếu Count = Ì có thể đặt trực tiếp vào toán

hạng của lệnh). Một giá trị 0 sẽ được đưa vào vị trí bên trái nhất của toán hạng đích, còn bít bên phải nhất cùa nó được đưa vào cờ CF.

0—" c ỉ ỉ ỉ Zl—• *~ CF

Ví dụ: BH = 10001000 hệ hex là 88h ta dịch phải đi 2 lần BU MOV CL,2 ; nạp số lần dịch vào CL SHR BH, CL ; BL dịch phải 2 lần

Lúc này gia trị BH = 00100010 hệ thập phân là 22h. như vậy mỗi lần dịch trái giá trị trong BU chia đôi. Sừ dụng chia không dấu.

3.7. Lệnh SAR Cú pháp: SAR đích, Count Chức năng: Dịch phải các bít cùa toán hạng đích đi Count lần (giá trị

Count được đạt trong thanh ghi CL, nếu Count = Ì có thê đặt trực tiếp vào toán

hạng của lệnh). Bít bên phải nhất của nó được đưa vào cờ CF, còn bít trái nhất vừa dịch về bên phải và vẫn giữ nguyên giá trị ban đầu.

CF

Ví dụ: BH = 11110000 hệ thập phân là -16 ta dịch phải đi 4 lần BH MOV CL,4; nạp số lần dịch vào CL SAR BH, CL; BL dịch phải 4 lần

34

Page 35: Gt Ngon Ngu Lt Assembly

Lúc này giá trị BH = 111111111 hệ thập phân là -1. như vậy mỗi lần dịch phái giá trị trong BH chia đôi. Sử dụng chia có dấu.

3.8. Lệnh ROL Cú pháp: ROL đích, Count Chức nâng: Quay vòng trái các bít của toán hạng đích đi Count lần (giá trị

Count được đặt trong thanh ghi CL, nếu Count = Ì có thể đặt trực tiếp vào toán

hạng của lệnh) mỗi lần quay giá trị bít cao nhất vừa chuyến vào thanh ghi cờ đồng thời chuyến vào bít thấp nhất

pjạ Ị Ị p CF ~*

Ví dụ: AL là số dương 10001000 hệ Hex là 88h ta quay trái đi 2 lần AL

MOV CL.2 ; nạp số lần dịch vào CL

ROL AL, CL; BL quay vòng trái 2 lần

Lúc này giá trị AL = 00100010 hệ thập phân là 22h

3.9. Lệnh ROR

Cú pháp: ROR đích, Count

Chức năng: Quay vòng phải các bít của toán hạng đích đi Count lần (giá trị Count được đặt trong thanh ghi CL, nếu Count = leo thể đặt trực tiếp vào

toán hạng của lệnh) mỗi lần quay giá trị bít thấp nhất chuyển vào thanh ghi cờ đồng thời chuyển vào bít cao nhất.

CF

Ví dụ: BL là số dương 10001000 hệ hex là 88h ta quay vòng phải đi 3 lần BL

35

Page 36: Gt Ngon Ngu Lt Assembly

MOV CL, 3 ; nạp số lần dịch vào CL

ROR BL, CL; BL quay vòng phái 3 lần Lúc này giá trị BL = 00010001 hệ thập phân là l lh

4. Nhóm các lệnh vói xâu kỷ tự

4.1. Lệnh MOVSB(W)

Cú pháp: MOVSB(W)

Chức năng: Chuyển một xâu ký tự theo từng Byte hay theo từng Word từ một vùng nhớ nguồn được trò bời DS : SI sang vùng nhớ đích được trỏ bởi ES : DI sau mỗi lần chuyển một byte hay một từ thì giá trị cùa SI và DI tự động tăng lên Ì (hoặc 2) khi cờ hướng DF = 0 hoặc giảm đi Ì (hoặc 2) khi cờ hướng DF = Ì

Ví dụ: Nếu muốn chuyển 2 byte đầu tiên của STRING1 đến STRING2

chúng ta có thể thực hiện các lệnh sau:

MOV AX,@DATA MOV DS.AX ;khởi tạo DS

MOV ES,AX ;và ES

LEA SI,STRING1 ;SI trỏ đến chuỗi nguồn

LEA DI,STRING2 ;DI trò đến chuỗi đích

CLD ;xoá DF

MOVSB ;chuyển byte đầu tiên

MOVSB ;rồi đến byte thứ 2

4.2. Lệnh CMPSB(W) Cú pháp: CMPSB(W)

Chức năng: So sánh hai xâu ký tự theo từng Byte (hay theo từng Word) nằm ở 2 vùng nhớ DS :SI và ES :DI trỏ đến 2 xâu ký tự sau mỗi lần so sánh từng byte (hay từng Word) thì giá trị của SI và DI tự động tăng lẻn l(hoặc2) khi cờ hướng DF = 0 hoặc giảm đi Ì (hoặc 2) khi cờ hướng DF = Ì

36

Page 37: Gt Ngon Ngu Lt Assembly

Ví dụ chúng ta có:

.DATA STRING1 DB 'ACD'

STRING2 DB 'ABC Đoạn lệnh dưới đây sẽ so sánh 3 byte của 2 chuỗi trên:

khởi tạo DS ;và ES ;Xử lý từ trái qua phải ;SI trỏ tới STRING1 ;DI trỏ tới STRING2 ;so sánh byte đầu tiên (A với A) ;so sánh byte thứ 2 (C với B) ;so sánh byte thứ 3 (D với C)

4.3. Lệnh SCASB(W) Cú pháp: SCASB(W) Chức năng: So sánh nội dung theo từng Byte (hay theo từng Word)

của vùng nhớ được trỏ bởi ES :DI với nội dung của thanh ghi AL (hoặc AX). Sau mỗi lần so sánh thì giá trị DI tự động tăng lên Ì (hoặc 2) khi cờ hướng DF = 0 hoặc giảm đi Ì (hoặc 2) khi cờ hướng DF = Ì. Kết quả sẽ tác động đến

giá trị cờ. Ví dụ nếu chuỗi:

STRING1 DB 'ABC được định nghĩa thì các lệnh sau sẽ kiểm tra xem 2 byte đầu của chuỗi có phải là chữ cái 'B' hay không

MOV AX, @DATA MOV ES, AX ;khởi tạo ES CLD ;xử lý từ trái sang

MOV AX, @DATA MOV DS, AX MOV ES, AX CLD LEA SI, STRING1 LEA DI, STRING2 CMPSB CMPSB CMPSB

37

Page 38: Gt Ngon Ngu Lt Assembly

LEA DI, STRING1 ;DI trỏ đến chuỗi STRINGÌ MOV AL, 'B' :kýtựđích SCASB ;duyệt byte đầu tiên SCASB ;duyệt bvtc thứ 2

4.4. Lệnh LODSB(VV) Cú pháp: LODSB(W) Chức năng: Chuyển nội dung theo từng Byte (hay theo từng Word)

của vùng nhớ được trỏ bởi DS :SI vào thanh ghi AL (hoặc AX). Sau mỗi lán chuyển thì giá trị SI tự động tăng lên Ì (hoậc2) khi cờ hướng DF = 0 hoặc giảm đi Ì (hoặc 2) khi cờ hướng DF = Ì

Ví dụ: có chuỗi được định nghĩa như sau: STRING1 DB 'ABC

Đoạn lệnh dưới đây lần lượt nạp các byte thứ nhất, thứ 2 và thứ 3 vào trong AL

MOV AX, @ DATA MOV DS, AX ;khởi tạo DS LEA SI, STRING1 ;SI trỏ tới STRING1 CLD ;xử lý từ trái sang phái LODSB ;nạpkýtựAvàAL LODSB ;nạp ký tự B vào AL LODSB ;nạp ký tự c vào AL

4.5. Lệnh STOSB(W) Cú pháp: STOSB(W) Chức năng: Chuyển nội dung theo từng Byte (hay theo từng Word)

của thanh ghi AL (hoặc AX) vào vùng nhớ được trỏ bời ES :DI. Sau mỗi lần chuyển thì giá trị DI tự động tăng lên Ì (hoặc 2) khi cờ hướng DF = 0 hoặc giảm đi Ì (hoặc 2) khi cờ hướng DF = Ì

Ví dụ về lệnh STOSB, đoạn lệnh dưới đây sẽ lưu 2 chữ "A" vào chuỗi STRING1:

38

Page 39: Gt Ngon Ngu Lt Assembly

AX, @DATA ES, AX DI, STRING1

AL, 'A'

MOV MOV LEA CLD MOV STOSB STOSB

5. Nhóm các lệnh rẽ nhánh

5.1. Lệnh CALL Cú pháp: Chức năng:

5.2. Lệnh RÉT Cú pháp: Chức năng:

5.3. Lệnh JMP Cú pháp: Chức nâng: Ví dụ:

MOV BX,0 JMP

khởi tạo ES DI trỏ đến STRING1

xử lý từ trái sang phải AL chứa ký tự cần lưu lưu chữ cái A lưu chữ A thứ 2

CALL tên chương trình con Gọi chương trình con

RÉT

Quay về chương trình đã gọi chương trình con

JMP nhãn Nhảy không điều kiện

THOÁT ;nhập 0 vào BX ;rồi thoát

6. Các lệnh nhảy có diều kiện Chức năng: Thực hiện việc nhảy nếu thoa mãn điều kiện (theo trạng thái

cùa các bít cờ)

6.1. Các lệnh nhảy có dâu Ký hiệu Chức năng Điều kiện nhảy JG/JNLE nhảy nếu lớn hơn ZF = 0 và Sĩ = OF

nhảy nếu không nhỏ hơn hay bằng

39

Page 40: Gt Ngon Ngu Lt Assembly

JGE/JNL nhảy nếu lớn hơn hay bằng SF = OF

nhảy nếu không nhỏ hơn

JL/JNGE nhảy nếu nhỏ hơn SFoOF

nháy nếu không lớn hơn hay bằng

JNE/JNG nhảy nếu nhỏ hơn hay bằng ZF = Ì hay SF = 0F

nhảy nếu không lớn hơn

6.2. Các lệnh nhảy không dâu Ký hiệu Chức năng Điều kiện nhảy

JA/JNBE nhảy nếu lớn hơn CF = 0 và ZF = 0

nhảy nếu không nhỏ hơn hay bằng

JAE/JNB nhảy nếu lớn hơn hay bằng CF = 0

nhảy nếu không nhỏ hơn

JB/JNAE nhảy nếu nhỏ hơn CF = Ì

nhảy nếu không lớn hơn hay bằng

JBE/JNA nhảy nếu nhỏ hơn hay bằng CF = Ì hay ZF = Ì

nhảy nếu không lớn hơn

6.3. Các lệnh nhảy điều kiện đơn Ký hiệu Chức năng Điều kiện nháy

JE/JZ nhảy nếu bằng ZF = Ì

nhảy nếu bằng 0

JNE/JNZ nhảy nếu không bằng ZF = 0

nhảy nếu khác 0

JC nhảy nếu có nhớ CF = Ì

JNC nhảy nếu không nhớ CF = 0

J0 nhảy nếu tràn 0F = Ì

JNO nhảy nếu không tràn OF = 0

40

Page 41: Gt Ngon Ngu Lt Assembly

JS nhảy nếu dấu ám JNS nháy nếu dấu dương JP/JPE nháy nếu cờ chẩn JNP/JPO nháy nếu cờ lé

SF= Ì SF = 0 PF = Ì PF = 0

Chú ý: Bước nháy cùa các lệnh này có điều kiện khổng vượt quá 128 byte.

7. Các lệnh lặp

7.1. Lệnh lặp LOOP Cú pháp: LOƠP labcl Chức năng: Lặp khối lệnh từ nhãn lệnh LOOP cho đến khi giá trị cùa

cx = 0. Mỗi khi thực hiện xong một vòng lặp giá trị cx tự động giảm di Ì. Ví dụ:

AL = 0 Số lần lặp bàng 16 Tăng AL lên Ì, AL=AL+1 Lặp lại 16 lần, AL=16

XOR MOV LÁP:

AL.AL CX.16 INC AL LOOP LÁP

7.2. LOOPZ/LOOPE label Cú pháp: LOOPZ/LOOPE label Chức năng: Lặp khối lệnh từ nhãn đến lệnh LOOPZ hoặc LOOPE cho đến

khi giá trị của c x = 0 và cờ Zero (ZF) bằng 1. Mỗi khi thực hiện xong một vòng lặp giá trị c x tự động giảm đi 1.

Ví dụ: MOV BL, AH ; Chuyến giá trị AH vào BL MOV cx, 50 ; số lần lặp cx=50

LÁP: INC BL ; tâng BL lên Ì, BL=BL+1 CMP BL.10 ; BL=10? LOOPE LÁP ; lặp lại cho đến khi AL = 10 hoặc đếm xong

7.3. LOOPNZ/LOOPNE label

Cú pháp: LOOPNZ/LOOPNE label

41

Page 42: Gt Ngon Ngu Lt Assembly

Chức núng: Lặp khối lệnh từ nhãn đến lệnh LOOPN/. hoặc LOOPNE cho đến khi giá trị cứa c x 0 và cờ Zero (ZF) bằng 0. Mỗi khi thực hiện xong một vòng lặp giá trị cx tự động giám di Ì.

Ví dụ:

MOV BL.AH khuyến giá trị AU vào BL MOV CX.50 ;số lần lặp cx=50

LÁP: INC BL ;tãng BL lên Ì, BL=BL+1 CMP BL.10 ;BL=10 ? LOOPNE LÁP ;lặp lại cho đến khi AL = 10 hoặc đốm xong

7.4. Lệnh REP Cú pháp: REP MOVSB Chức năng: Tác dụng làm cho lệnh chuyến một chuỗi (MOVSB) được

thực hiện n lần, với số lần được đặt trong cx. Ví dụ: chuyển một chuỗi STRING1 = 'HANOI' vào chuỗi STRING2. số

ký tự trong chuỗi STRING1 là 4, ta có thế làm như sau: CLD LEA SI.STRINGl ;nạp chuỗi lvào SI LEA DI,STRING2 ;nạp chuỗi 2 vào DI MOV cx,4 ;nạp số lần lặp vào c x REP MOVSB ;lặp cho đến khi chuyển hết ký tự từ chuỗi

Ì vào chuỗi 2.

8. Nhóm các lệnh còn lại

8.1. Lệnh ngát mềm INT

Cú pháp: INT số ngắt (số dạng HEXA) Chức năng: Thực hiện ngắt mềm

Ví dụ: sử dụng ngắt 21 để nhập một ký tự từ bàn phím MOV AH.l INT 21h

42

Page 43: Gt Ngon Ngu Lt Assembly

8.2. Lệnh IRET Cú pháp: IRET Chức năng: Trờ về chương trình chính (chương trình kích hoạt nó) sau khi

thực hiện chương trình con phục vụ ngắt. Túc dụng vào các bít cờ:

o D ì T s z A p c

8.3. Lệnh CLC Cú pháp: CLC Chức năng: Xóa giá trị cờ nhớ CF về O.CF = 0

o D ì T s z A p c

0

8.4. Lệnh CMC Cú pháp: CÚC Chức năng: Đáo giá trị hiện thời của cờ CF

o D ì T s z A p c

8.5. Lệnh STC Cú pháp: STC Chức năng: Đưa giá trị cờ CF lên Ì .CF = Ì

o D ì T s z A p c

Ì

43

Page 44: Gt Ngon Ngu Lt Assembly

8.6. Lệnh CLD Cú pháp: CLD Chức năng: Xóa giá trị cờ hướng DF về O.DF = 0. Lệnh này định

hướng thao tác theo chiều tiến về bên phái cho các lệnh liên quan đến chuỗi.

o D ì T s z A p c

0

8.7. Lệnh STD Cúyháp: STD Chức năng: Đưa giá trị cờ DF lên l.DF = Ì

o D ì T s z A p c

Ì

8.8. Lệnh C U Cú pháp: Chi Chức năng: Xóa giá trị cờ cho phép ngắt IF về O.IF = 0

0 D ì T s z A p c

0

8.9. Lệnh STI Cú pháp: STI Chức năng: Đưa giá trị cờ IF lên l.IF = Ì

0 D ì T s z A p c

Ì

44

Page 45: Gt Ngon Ngu Lt Assembly

Câu hỏi ôn tập

1. Cho biết các số thập phân dưới đây đâu là dạng dữ liệu byte, word a. 32767 C.65255 b.-128 d.-128

2. Cho biết các số hexa-decimal sau là ký tự nào trong bảng mã ASCII a.42h b.12 c.39h d.127

3. Hãy cho biết khi bộ vi xử lý lấy nội dung (dữ liệu) từ một ngăn nhớ trong bộ nhớ thì nội dung (dữ liệu) có còn tồn tại ở trong ngăn nhớ đó hay không?

4. Bộ vi xử lý 8088 có bao nhiêu thanh ghi 16 bít? và các thanh ghi nào dưới đây có khả năng tách ra thành hai thanh ghi 8 bít?

a.AX b.DS C.BP d.cx

5. Thanh ghi cờ của 8088 có bao nhiêu bít được sử dụng? bít ở vị trí thứ sáu là bít cờ nào?

6. Bộ vi xử lý 8088 đánh địa chỉ bộ nhớ từ 00-FFFFFh, chương trình ngắt được đạt ở vị trí nào trong đoạn bộ nhớ trên?

7. Các hàm nào dưới đây của ngắt 21h hiện ký tự ra màn hình MOV AH,1 MOV AH,2 MOV AH,4Ch

INT 21h INT 21h INT 21h 8. Hãy chỉ ra các đoạn mã lệnh sau ỏ chế độ địa chỉ nào?

MOV AX,[BX+5] MOV DI.AX MOV DX.BX MOV AX,[SI]+5 MOV CX.100 MOV CX,[BX][SI]+5 MOV AL,[BX] MOV [1272h],cx

9. Hãy cho biết mỗi lệnh dưới đây là hợp lệ hay không hợp lệ, trong đó W1 và W2 là các biến WORD;B1,B2 là các biến BYTE.

a. MOV DS, AX

b. MOV DS, 100h

c. MOV DS, ES

d. MOV W1,DS

e. XCHG W1,W2

45

Page 46: Gt Ngon Ngu Lt Assembly

f. SUB g. ADD h. ADD i. MOV

5, BI BI, B2 AL, 256 W1, BI

Bài tập 1. Chỉ dùng các lênh MOV, ADD, SUB. INC, ĐÉC và NEG hãy dịch các dòng lệnh

gán của ngôn ngữ bậc cao sau đây sang hợp ngữ với A, B. c là các biến kiểu word. a. A=B-C b.A = -(C + 2) c. c = A + B d. B = 3 * B + 7 e. B = B - A - 1 2. Viết các lệnh thực hiện các công việc sau đây: a. BX = 1 + 2 + 3 + 4 +9. b. AX = 100 + 95 + 90 +5. 3. Cho biết nội dung của AX.DX khi các lệnh sau là hợp lệ và được thực hiện: a. MUL BX trong đó AX chứa 0002h và BX chứa 0006h b. MUL BX trong đó AX chứa 00FFh và BX chứa 1000h c. IMUL cx trong đó AX chứa 0002h và cx chứa FFFFh d. IMUL BIÊN trong đó AX chứa 0002h và BIÊN chứa FFFFh e. IMUL 20h trong đó AX chứa FFE0h 4. Cho biết nội dung mới của AX, AL. AH và DX sau mỗi lệnh và hiện tượng tràn có

thể xảy ra không? a. DIV BX trong đó DX chứa OOOOh, AX chứa 0008h và BX chứa 0003h b. DIV BX trong đó DX chứa OOOOh, AX chứa FFFEh và BX chứa 0010h c. IDIV BX trong đó DX chứa FFFFh, AX chứa FFFCh và BX chứa 0003h d.DIV BL trong đó AX chứa OOODh, BL chứa 03h e.lDIV BL trong đó AX chứa FFFDh, BL chứa FEh 5. Thực hiện các phép tính logic sau đây: a. 10101111 AND 10001001

46

Page 47: Gt Ngon Ngu Lt Assembly

b. 10110001 OR 01001001

c. 01111100 XOR 11011010

d. NÓT 01011110

6. Viết các lệnh logic để thực hiện các công việc sau đây: Xoa các bít ở vị trí chẵn của AX, giữ nguyên các bít khác. Thiết lập các bít Isb và msb của BL trong khi giữ nguyên các bít khác. Đảo bít msb của BL. giữ nguyên các bít khác. Thay nội dung của biến word 1 bằng số bù 1 của nó. 7. Giả sử AL chứa 11001011b và CF = 1, cho biết nội dung mới của AL khi mỗi lệnh

sau được thực hiện. Điều kiện đầu đúng cho tất cả phấn của câu hỏi. a. SHL AU b. SHR AU c. ROL AL.CL trong đó CL chứa 2 d. ROR AL.CL trong đó CL chứa 3 e. SAR AL.CL trong đó CL chứa 2 f. RCL AU g. RCR AL CL trong đó CL chứa 3 8. Giả sử SI chứa 100h byte 100h chứa 10h DI chứa 200h byte 101h chứa 15h AXchứa4142h byte 200h chứa 20h DF = 0 byte 201 h chứa 25h Hãy cho biết toán hạng đích, toán hạng nguồn và các giá trị được chuyển trong mỗi

lệnh sau đây, đồng thời cho biết giá trị mới của SI và DI. a. MOVSB b. MOVSW c. STOSB d. STOSVV e. LODSB g. LODSW 9. Giả sử có các khai báo sau đây:

47

Page 48: Gt Ngon Ngu Lt Assembly

STRING1 DB TGHU' STRING2 DB ABCDE' DB 5 DUP(?)

Hãy viết các lệnh chuyển STRING1 vào cuối STRING2 để tạo ra chuỗi "ABCDEFGHIJ".

10. Hãy sử dụng các chế độ địa chỉ trong chương 10 để viết những lệnh tương đương với các lệnh thao tác chuỗi dưới đây. Giả sử rằng ỏ những chỗ cấn thiết SI đã chứa offset của chuỗi nguồn và DI đã chứa offset của chuỗi đích đồng thời DF = 0. Các bạn có thể dùng AL làm vùng nhớ trung gian. Đối với các lệnh SCASB và CMPSB các cờ phải phản ánh kết quả của phép so sánh.

a. MOVSB b.STOSB c. LODSB d. SCASB

48

Page 49: Gt Ngon Ngu Lt Assembly

C h ư ơ n g 2

LẬP TRÌNH BẰNG HỢP NGỮ

ì. GIỚI THIỆU HỢP NGỮ

1. CÚ pháp của hợp ngữ Chương trình hợp ngữ bao gồm các dòng lệnh. Một dòng lệnh là một lệnh

mà trình biên dịch sẽ dịch ra mã máy, hay là một hướng dẫn biên dịch để chỉ dẫn cho trình biên dịch thực hiện một vài nhiệm vụ đặc biệt nào đó. Mỗi lệnh hay hướng dẫn biên dịch thường có 4 trường:

Tên Toán tử Toán hạng ; Lời bình Các trường phải được phân cách nhau bằng ít nhất một ký tự trống hay

TAB. Cũng không bắt buộc phải sắp xếp các trường theo cột nhưng chúng nhất định phải xuất hiện theo đúng thứ tự nêu trên.

v ỉ dụ : Láp: MOV AH, Ì ,-Nhập một ký t ự t ừ bàn phím. Trong ví dụ này, trường tên là nhãn Láp, toán tử là MOV, toán hạng là AH

và Ì, lời bình là 'nhập một ký tự từ bàn phím'. Ví dụ: về hướng dẫn biên dịch:

Cong2so PROC Cong2so là tên và toán hạng là PROC. Dẫn hướng biên dịch này khai báo

một chương trình con có tên Cong2so.

1.1. Trường tên Trường tên được sử dụng làm nhãn lệnh, các tên thủ tục và các tên biến.

Chương trình biên dịch sẽ chuyển các tên thành các địa chỉ bộ nhớ. Các tên có thể có chiều dài từ Ì đến 31 ký tự, có thể chứa các chữ cái, chữ số và các ký

49

Page 50: Gt Ngon Ngu Lt Assembly

tự đặc biệt ( ? • © _ $ % ) . Không được phép chèn dấu trống vào giữa một tên. Nếu sử dụng dấu chấm (.) thì nó phải đứng đầu tiên. Các tên được bắt đầu bằng một chữ cái. Chương trình biên dịch không phân biệt chữ hoa và chữ thường trong tên.

Ví dụ các tên hợp lệ:

HANOìÌ

@_VIDU Lưu ý: các tên không hợp lệ:

- chúa mội khoang trông - bắt đau bcmg một CKLÍ sổ

- dấu c\\ắw\ không phoi lò ký tự đắn tiên

1.2. Trường toán tử Trong một lệnh, trường toán tử chứa mã lệnh dạng tượng trưng. Chương

trình biên dịch sẽ chuyển mã lệnh dạng tượng trưng sang mã lệnh của ngôn ngữ máy. Tượng trưng của mã lệnh thường biểu thị chức năng của các thao tác. Ví dụ như: MO V, ADD, SUB.

Trong một hướng dẫn biên dịch, trường toán tử chứa toán tử giả. Các toán tử giả sẽ không dịch ra mã máy mà đơn giản chúng chỉ báo cho trình biên dịch làm một việc gì đó. Chẳng hạn toán tử giả PROC đế tạo ra một thủ tục.

1.3. Trường toán hạng Đối với một lệnh, trường toán hạng xác định dữ liệu sẽ được các thao tác

tác động lên. Một lệnh có thể không có, có Ì hoặc 2 toán hạng. Ví dụ: 7VOT-"> khô̂ CỊ foón \\ạv\CỊ, kkÔK\g làm CỊ\ cả.

Ty&C- 3^c mọt +ocm hạng/ t»H< "ì vào nội tiu ria BX.

MOV oỵ., 10 kaì toán Uạng, kuỏi tạo cx =10. Trong một lệnh hai toán hạng, toán hạng đầu tiên gọi là toán hạng đích.

Nó có thể là một thanh ghi hạc một ô nhớ, là nơi chứa kết quả. Toán hạng thứ hai là toán hạng nguồn. Các lệnh thường không làm thay đổi toán hạng nguồn.

50

Page 51: Gt Ngon Ngu Lt Assembly

1.4. Trường lời giải thích Người lập chương trình thường sử dụng trường lời giải thích của một dòng

lệnh để giải thích dòng lệnh đó làm cái gì. Mở đầu trường này là một dấu chấm phẩy (;) và trình biên dịch bỏ qua mọi cái được đánh dấu vào sau dấu chấm phẩy này. Hợp ngữ là ngôn ngữ bậc thấp cho nên ta hầu như không thể hiểu được một chương trình viết bằng hợp ngữ nếu không có lời bình.

Không nên viết những điều đã qua rõ ràng như: MOV cx ,0 ;chuyển ũ vào cx.

Thay vào đó, ta nên sử dụng các lời giải thích để đặt các chỉ thị vào trong ngữ cảnh của chương trình:

MOV cx,0 ;khởi tạo vòng lạp cx = 0

2. Các biến

Trong hợp ngữ các biến có vai trò giông như trong các ngôn ngữ bậc cao. Mỗi biến có một kiểu dữ liệu và được chương trình gán cho một địa chỉ bộ nhớ. Các toán tử giả định nghĩa số liệu. Mỗi toán tử giả có thể được dùng để thiết lập một hay nhiều dữ liệu của kiểu đã được đưa ra.

Trong phần này chúng ta sử dụng DB và DW để định nghĩa tạo nên một byte các biến kiểu byte và các biến kiểu word.

2.1. Các biến kiểu byte Dẫn hướng định nghĩa một biến kiểu byte của trình biên dịch có dạng

sau đây: Tên DB g i á _ t r ị _ k h ở i _ t ạ o Trong đó toán tử giả DB được hiểu là "định nghĩa byte"

Ví dụ: TONG DB 4

Với dẫn hướng này, Hợp ngữ sẽ gán tên TONG cho một byte nhớ và khởi tạo nó giá trị 4. Một dấu chấm hỏi (?) đặt ở vị trí của giá trị khởi tạo sẽ tạo nên một byte không được khởi tạo.

Ví dụ: TONG DB ?

51

Page 52: Gt Ngon Ngu Lt Assembly

Giới hạn thập phân của các giá trị khởi tạo nằm trong khoảng từ -128 đến

127 với kiểu có dấu và từ 0 đến 255 với kiểu không dấu. Các khoảng này vừa đúng giá trị của một byte.

2.2. Các biên kiêu word Dẫn hướng định nghĩa một biến kiểu word của trình biên dịch có dạng

sau đây: Tên DW g i á _ t r ị _ k h ở i _ t ạ o Toán tử giả DW có nghĩa là "định nghĩa word". Ví dụ: BIEN1 DW ? BIEN2 DW -8 BIEN3 DW 16 Giống như với biến kiểu byte một dấu chấm hỏi ờ vị trí giá trị khởi tạo có

nghĩa là word không được khởi tạo giá trị đầu. Giới hạn thập phân của giá trị khởi tạo được xác định từ -32768 đến 32767 đối với kiểu có dấu và từ 0 đến

65535 đối với kiểu không dấu.

2.3. Các biến mảng Trong ngôn ngữ hợp ngữ, mảng chỉ là một chuỗi các byte nhớ hay Word.

Ví dụ để định nghĩa mảng 3 byte có tên MANG với các giá trị khởi tạo là 5h, lOh, 15h chúng ta có thể viết:

MANG DB 5h,10h,15h

Tên MANG được gán cho byte đầu tiên, MANG+1 cho byte thứ hai và MANG+2 cho byte thứ ba. Nếu như trình biên dịch gán địa chỉ offset 0400h cho MANG thì bộ nhớ sẽ như sau:

Phần tử Địa chỉ Nội dung MANG 04ŨOh 5h

MANG+Ì 0401h l ũ h

MANG+2 0402h 15h

Các biến mảng word có thể được định nghĩa một cách tương tự. Ví dụ: MANG DW 100,72, 48, 54

52

Page 53: Gt Ngon Ngu Lt Assembly

Sẽ tạo nên một mảng có 4 phần tử với các giá trị khởi tạo là 100, 72, 48, 54. Từ đầu tiên được gán với tên MANG, từ tiếp theo gán với MANG+2, rồi đến MANG+4 v.v. Nếu mảng bắt đầu tại 07F0h thì bộ nhớ sẽ như sau:

Phần tử Địa chỉ Nội dung MANG 07F0h lũOd

MANG+2 07F2h 72d

MANG+4 07F4h 48d

MANG+6 07F6h 54d

Khi chúng t a khởi đầu các phần t ử của mảng v ớ i cùng một g i á t r ị ta d ing toán t ử DUP t rong l ệ n h .

v í dụ : MI DB 50 DUP(l) M2 DB 100 DUP(?)

Ví dụ t r ê n đ ịnh nghĩa b i ế n mảng MI gồm 50 bỵ te t rong bộ nhớ có g i á t r ị khởi đầu bằng Ì và một b i ế n

mảng M2 gồm 100 byte t rong bộ nhớ nhưng g i á t r ị khởi đầu chưa c ó .

Các chuỗi ký tự Một chuỗi ký tự có thể được khởi tạo bằng mảng các mã ASCII. Ví dụ: TBAO DB 'HELLO' , OAh, ODh,' $' tương đương với: TBAO DB 48h,45h,4Ch,4Ch,4Fh,ŨAh,ODh,24h

3. Các hằng có tên Để tạo ra các mã lệnh Hợp ngữ dễ hiểu, người ta thường dùng các tên

tượng trưng để biểu diễn các hằng số. EQU (EQates: c o i như bằng) .

Để gán tên cho hằng, chúng ta có thể sử dụng toán tử giả EQU. Cú pháp: Tên EQU hằng_số

Ví dụ: LF EQU OAh

53

Page 54: Gt Ngon Ngu Lt Assembly

sẽ gán tên LF cho OAh. là mã ASCII của ký tự xuống dòng. Tên LF có thể được dùng để thay cho OAh tại bất cứ đâu trong chương trình. Trình biên dịch sẽ

dịch các lệnh: MOV DL,OAH

và: MOV DL,LF

ra cùng một chỉ thị máy.

l i . CÂU TRÚC CỦA MỘT CHƯƠNG TRÌNH HỢP NGỮ Phần khai báo Segment đơn giản .MODEL kiêu .STACK độ lớn (tính theo byte) .DATA Khai báo biến

.CODE

Nhãn: mov AX,@DATA mov DS,AX thân chương trình

lệnh trở về DOS

[ các chương trình con] (nêu có) END Nhãn

1. Lệnh điểu khiển Segment

1.1. Lệnh điều khiển .STASK Cú pháp: .STACK kích thước ngăn xếp

Chức năng: Xác định kích thước ngăn xếp (tính theo Byte). Với lệnh này DOS sẽ xác lập địa chỉ đầu của ngăn xếp và giá trị đó được ghi vào thanh ghi đoạn ss.

54

Page 55: Gt Ngon Ngu Lt Assembly

1.2. Lệnh điều .CODE

Cú pháp: .CODE

Chức năng: Đánh dấu điểm khởi đầu của vùng nhớ chứa mã lệnh.

1.3. Lệnh điểu khiển .DATA Cú pháp: .DATA

Phần khai báo và gán giá trị ban đầu của các biến nhớ Chức năng: Đánh dấu điểm khởi đầu của vùng nhớ chứa số liệu.

1.4. Lệnh điều khiển .MODEL Cú pháp: .MODEL kiểu bộ nhớ (Tiny, Small, Medium, Compact, Large,

Huge) Chức năng: Xác định mô hình bộ nhớ cho một Module Assembly sử dụng

tập lệnh điều khiển Segment đơn giản. • Tiny: Cả phần mã máy của chương trình (CODE) phần dữ liệu (DATA)

cùng nằm trong một Segment 64KB. Cả CODE và DATA đều là NEAR.

• Small: Phần mã máy của chương trình (CODE) có thể lớn hơn 64KB phần dữ liệu (DATA) cùng nằm trong một Segment 64KB. Cả CODE và DATA đều là NEAR.

• Medium: Phần mã máy của chương trình (CODE) nằm trong một Segment 64KB phần dữ liệu (DATA) cùng nằm trong một 64KB. CODE là FAR phần DATA là NEAR.

• Compact: Phẩn mã máy của chương trình (CODE) nằm trong một Segment 64KB phần dữ liệu (DATA) cùng nằm trong một vùng nhớ lớn hơn 64KB. CODE là NEAR và DATA là FAR.

• Large: Phẩn mã máy của chương trình (CODE) và phần dữ liệu (DATA) nằm trong một vùng nhớ lớn hơn 64KB. CODE và DATA là FAR. Một trưòng số liệu không vượt quá 64KB.

• Huge: Phần mã máy của chương trình (CODE) và phần dữ liệu (DATA) nằm trong một vùng nhớ lớn hem 64KB. CODE và DATA là FAR. Cho phép trường số liệu vượt quá 64KB.

55

Page 56: Gt Ngon Ngu Lt Assembly

Ví dụ: Hãy viết một xâu ký tự 'XIN CHAO CÁC BAN!' ra màn hình. Cách giải: Dùng chức năng hiện một xâu ký tự kết thúc bằng dấu $ ra màn hình. Chức năng thứ 9 của hàm ngắt int 2lh của DOS cho phép chúng ta hiện

một xâu ký tự kết thúc bằng $ ra màn hình nếu DS : DX chứa địa chi SEG:OFFSET của biến xâu. Do vậy chương trình sẽ như sau:

.MODEL small

.STACK lOOh

.DATA Thao db 'XIN CHAO CÁC BAN!$' ; Khai báo biến xâu ký tự .CODE Program Ì:

mov AX,@DATA ;Đưa phẩn địa chi SEGMENT của phân mov DS,AX . ;đoạn dữ liệu vào thanh ghi segment DS mov DX,OFFSET Thao ;DX chứa phần địa chi OFFSET mov AH,9 ;Gọi hàm-hiện xâu ký tự im 21 h ;Hiện xâu ký tự Thao ra màn hình mov AH,4Ch ;Kết thúc chương trình trở về DOS

im 21h

END Programl

2. Chương trình con-Thủ tục Khi viết Ì chương trình ngôn ngữ bậc cao, ta thường chia chương trình đó

thành các Modul độc lập và được gắn kết với nhau bởi lời gọi của chương trình chính. Trong hợp ngữ cũng vậy, các chương trình con ở đây chi là các thủ tục với khai báo như sau:

2.1. Khai báo thủ tục Cú pháp khai báo một thủ tục

56

Page 57: Gt Ngon Ngu Lt Assembly

Tên PROC type ;...các lệnh trong thủ tục

RÉT Tên ENDP

Tên: là tên của thủ tục do người viết định nghĩa

type: Toán hạng tuy chọn là: - NEAR: Dòng lệnh gọi thủ tục ở cùng đoạn với thủ tục - FAR : Dòng lệnh gọi thủ tục ở trong một đoạn khác

2.2. Các lệnh thủ tục CALL-RET Lệnh CALL được dùng để gọi một thủ tục. Cú pháp như sau:

CALL Tên trong đó Tên là tên của thủ tục do người lập trình đặt. Để trở về từ một thủ tục chúng ta dùng lệnh RÉT, mọi thủ tục ngoại trừ

thủ tục chính đều phải có lệnh RÉT ở cuối thủ tục.

2.3. Ví dụ về chương trình con Trình bày Ì chương trình cộng 2 số gồm 2 phần tổ chức theo kiểu chương

trình chính và chương trình con. Hai phần này truyền tham số với nhau thông qua ô nhớ dành cho biến (thanh ghi ngoài).

TITLE CT: ADD2SO

.MODEL SMALL

-STACK lOOh

.DATA

TBAO DB 'HAY VÀO 2 so NGUYÊN $'

Soi DB ?

So2 DB 7

Tong DB 7

.CODE

Program3:

57

Page 58: Gt Ngon Ngu Lt Assembly

MOV AX,@Data ; khởi tạo DS MOV DS,AX MOV AH,9 ; hàm hiện thông báo LEA DX,TBAO ; nạp địa chỉ nội dung thông báo vào DX INT 21h ; hiện thông báo MOV AH 1 ; hàm đọc ký tự Soi INT 21h ; đọc 1 ký tự MOV Sol,AL ; cất mã của Soi MOV DU', ' ; dấu phẩy xen giữa MOV AH,2 ; hàm hiện ký tự ra màn hình INT 21h ; hiện ký tự Soi ra màn hình MOV AH,1 ; hàm đọc ký tự im 21h ; đọc ký tự So2 MOV So2,AL ; Cất mã của So2 CALL CONG ; gọi thủ tục cộng 2 số MOV AH,4Ch INT 21h ; trở về DOS

CONG Proc ; chương trình con cộng hai số MOV AL,Sol ; lấy mã Soi ADD AL,So2 ; cộng với mã So2 ADD Tong,AL ; Đưa giá trị tổng vào biến Tong

RÉT ; lệnh trở về chương trình chính

CONG Endp ; kết thúc chương trình con

END Program3 ; kết thúc chương trình chính

HI. CÁC BƯỚC TẠO VÀ CHẠY CHƯƠNG TRÌNH

1. Cài đặt chương trình dịch Để một chương trình được viết bằng Assemler có thể chạy được, chúng ta

phải dịch và liên kết để tạo ra tệp có đuôi .EXE hoặc đuôi .COM. Muốn làm

58

Page 59: Gt Ngon Ngu Lt Assembly

được điều đó ít nhất chúng ta cần hai tệp tối thiếu là MASM.EXE (chương trình dịch Assembler) và LINK.EXE (chương trình thực hiện việc liên kết).

Hai tệp này chúng ta có thể nhận được bằng hai cách: Cách 1: Nếu có bộ đĩa cài đặt MASM6 (gồm một đĩa CD 3,68MB), các bước tiến

hành sê như sau -đưa đĩa vào ổ đĩa D(E) và tiến hành cài đặt: D:\>MASM6\SETUP.EXE và đánh <ENTER> thì trên màn hình

sẽ hiện ra:

Microsoít MASM 6.0 SETUP Phần giới thiệu về hãng

Press ENTER to continue, CTRL+C to EXIT

ấn ENTER để tiếp tục Sau khi cài đặt chúng ta sẽ có các tệp chính sau trong danh mục MASM:

BIN,HELP,INCLUDE,INIT,SAMPLES MASM.EXE ... chương trình dịch Macro Assembler LENK.EXE ... chương trình liên kết và chạy

Cách 2: Như đã đề cập ở trên là để dịch và liên kết một chương trình được viết bằng

ngôn ngữ Assemly, chúng ta tối thiểu phải có hai tệp thì cách dễ nhất là sao hai tệp trên ở một máy nào đã được cài đặt tệp MASM.EXE và LINK.EXE vào máy của chúng ta.

2. Các bước thực hiện chương trình Hợp ngữ Muốn thực hiện một chương trình Assembly trên máy PC và các máy

tương thích chúng ta phải tiến hành theo trình tự sau:

59

Page 60: Gt Ngon Ngu Lt Assembly

Bước 1: Vào Ne đánh lệnh EDIT, hay vào PASCAL, NOTEPAD (trong Window) soạn thảo chương trình sau đó ghi lại tệp. tệp này phái gắn đôi .ASM

Ví dụ: Baitap.asm Bước 2: Vào MASM .EXE sau đó đánh tên tệp (Baitap) để dịch tệp ASM

ra mã máy dưới dạng tệp .OBJ, nếu trong bước này chương trình báo lỗi cú pháp thì ta phải quay lại bước Ì để sửa lại chương trình gốc.

Ví dụ: Chương tình bị lỗi cú pháp giả dụ định nghĩa chuỗi ký tự kiểu DB nhưng ta đánh thiếu là D ờ dòng thứ 6 chương trình máy sẽ thông báo sau:

BAITAP.ASM (6): error A2105: Expeeted instruction, directive or label

49278+4011117 Byte symbol spece free

0 Warning Errors

Ì Severe Eưor (lỗi nghiêm trọng) Nếu chương trình không bị lỗi máy thông báo như sau:

49280+403165 Byte symbol spece free

0 \Varning Errors

0 Severe Error Bước 3: Vào LINK.EXE đánh tên tệp (Baitap) để dịch chương trình

tệp.OBJ sang têp.EXE để chạy. Bước 4: Nếu chương trình gốc viết ra là để dịch ra kiểu .COM thì ta phải

dùng chương trình EXE2BIN của DOS để dịch tiếp tệp .EXE ra tệp chương trình chạy được với đuôi .COM

Bước 5: Cho chạy chương trình vừa dịch

IV. CÁC CÂU TRÚC LẬP TRÌNH c ơ BẢN THỰC HIỆN BẰNG HỢP NGỮ

1. Cấu trúc tuần tự Là một cấu trúc thông dụng và đơn giản nhất. Trong cấu trúc này các lệnh

được sắp xếp tuần tự, lệnh nọ tiếp lệnh kia. Sau khi thực hiện xong lệnh cuối cùng thì công việc cũng được hoàn tất.

60

Page 61: Gt Ngon Ngu Lt Assembly

ngữ pháp: Lệnh Ì Lệnh 2

Ví du : A: Lệnh n

B*13 + 10 AX = B BL = 13 AX = B*13 AX = B*13 + 10 A = AX = B*13 + 10

Mov AX, B Mov BL, 13 MuL BL ADD AX,10 Mov A,AX

2. Các cấu trúc rẽ nhánh

2.1. Cấu trúc IF- Then Thuật toán:

IF điều kiện THEN thực hiện lệnh END_IF

- Điều kiện là biểu thức - Kiểm tra điều kiện, nếu đúng thực hiện lệnh, nếu sai không thực hiện

lệnh mà thoát ra Ví dụ: Nhập ký tự từ bàn phím, kiếm tra nếu không là phím ENTER thì cho hiện

ký tự ra màn hình, sai thoát về DOS

Đoạn chương trình viết dưới dạng ASSEMBLY như sau: MOV AH,1 INT21H ;Nhậpkýtự CMP AL,0DH ;Kiếm tra ký tự JE THOÁT ;Là phím enter? thoát

61

Page 62: Gt Ngon Ngu Lt Assembly

;Không, hiện ký tự MOV AH,2 MOV DL,AL INT21H

THOÁT: MOV AH,4Ch INT21h

2.2. Cấu trúc IF- Then - Else Thuật toán:

IF điều kiện Đúng THEN thực hiện lệnlìl ELSE thực hiện lệìììứ END_IF

Ví dụ: Nhập điểm thi nếu lớn hơn 5, thông báo không phải thi lại. Khác đi thông báo thi lại

.DATA

.Code CT:

Tbao2:

ThaoÌ Db Tbao2 Db

MOV ah.l Int 21h Cmp AL,'5' JL Tbao2 Mov AH,9 LEA DX.Tbaol INT21h JMP END_IF

Mov AH,9 LEA DX,TB2 INT21h

'Thi Dát $' 'Thi Lai $'

;nhập điểm

;Nếu điểm <5 ;nhảy đến thông báo 2 ;khác đi hiện thông báo Ì

;nháy thoát

;hiện thông báo 2

62

Page 63: Gt Ngon Ngu Lt Assembly

END_IF

Mov AH,4Ch ;thoát về DOS

INT21h

END CT

2.3. Câu trúc Case Thuật toán: Case là cấu trúc đa nhánh dạng tổng quát như sau: Case phát biểu giá trị 1: dòng lệnh Ì giá trị 2: dòng lệnh 2

giá trị n: dòng lệnh n EndCase Ví dụ: - Viết đoạn chương trình biết bạn sinh năm con gì - Nhập số dư năm sinh khi chia hết cho 12

- Hiện thông báo cho biết bạn sinh năm con gì

.DATA TB1 TB2

TB4 TB5

TB3

DB DB

DB

DB DB

'ban sinh nam THAN: ','$' 'ban sinh nam DÂU: ','$' 'ban sinh nam TUAT: ','$' 'ban sinh nam HOI: ','$' 'ban sinh nam TY: ','$'

CODE CT: MOV AX,@DATA MOV DS,AX MOV AH,1 INT21H

;Khởi tạo Đoạn dữ liệu DS ;gọi hàm nhập ký tự từ bàn phím ;nhập ký tự

Page 64: Gt Ngon Ngu Lt Assembly

CMPAL/O' ;so sánh với ký tự 0 JET1 ;bằng thì nhảy đến thông báo 1 CMPAL/r ;so sánh với ký tự 1 JET2 ;bằng thì nhảy đến thõng báo 2 CMPAL/2' ;so sánh với ký tự 2 JE T3 ;bằng thì nhảy đến thông báo 3 CMPAL/3' ;so sánh với ký tự 3 JET4 ;bằng thì nhảy tới thông báo 4 MOV AH,9 ;gọi hàm hiện thông báo 5 LEA DX,TB5 ;nạp địa chỉ thông báo 5 vào DX để INT 21h ;hiện thông báo 5 Tl:MOV AH.9 ;gọi hàm hiện thông báo 1 LEA DX.TBl ;nạp địa chỉ thông báo 1 vào DX đế

INT 21h ;hiện thông báo 1 JMP THOÁT ;sau rồi thoát

:: MOV AH,9 ;gọi hàm hiện thông báo 2 LEA DX,TB2 ;nạp địa chi thông báo 2 vào DX để INT 21h ;hiện thông báo 2 JMP THOÁT ;sau rồi thoái : MOV AH,9 ;gọi hàm hiện thông báo 3 LEA DX,TB3 ;nạp địa chỉ thông báo 3 vào DX để INT 21h ;hiện thông báo 3 JMP THOÁT ;sau rồi thoát : MOV AH.9 ;gọi hàm hiện thông báo 4 LEA DX,TB4 ;nạp địa chi thông báo 4 vào DX đê INT 21h ;hiện thông báo 4

THOÁT: MOV AH.4CH ;thoát về DOS

INT 21H

64

Page 65: Gt Ngon Ngu Lt Assembly

3. Các cấu trúc lặp

3.1. Vòng lặp FOR-DO Đây là cấu trúc lặp mà số lần lặp đã biết trước thuật toán như sau:

For số lần lặp Do Các lệnh END_FOR thực hiện vòng lặp For trong Assembly cần sử dụng thanh ghi c x chứa số

lần lặp và lệnh LOOP. Đầu tiên khởi tạo giá trị c x bằng số lần, lặp sau đó lặp các lệnh cho đến

khi c x = 0. Cấu trúc lệnh như sau: XOR cx ,cx MOV cx,số lần lặp

nhãn: Thân các lệnh LOOP nhãn

Ví dụ: Hiện một dòng 60 ký tự '*' ra màn hình Đoạn mã lệnh như sau:

XOR cx ,cx ;số lần lặp c x = 0 MOV cx,60 ;CX = 60 MOV AH,2 ;gọi hàm hiện ký tự ra màn hình

LÁP: INT 21H MOV DL,'*'

LOOP LÁP

;nạp ký tự * vào DL để ;hiện ;lặp cho đến khi hiện ra 60 ký tự *

3.2. Vòng lặp WHILE-DO Đây là cấu trúc lặp mà phụ thuộc vào một điều kiện WHILE điều kiện Do

Các lệnh

65

Page 66: Gt Ngon Ngu Lt Assembly

END_WHILE Điều kiện được kiểm tra ở đầu vòng lặp nếu điều kiện đúng các lệnh được

thi hành và lặp cho đến khi điều kiện sai thì thoát ra ngoài vòng lặp. Ví dụ: Viết các lệnh để đếm số ký tự trong một dòng. - Khởi tạo bộ đếm c x

- đọc một ký tự - Kiểm tra ký tự <> ký tự ENTER Do - đếm = đếm +1

- đọc một ký tự - Kết thúc vòng lặp Đoạn mã lệnh như sau: XOR cx ,cx ;khởitạoCX = 0 MOV AH,1 ;gọi hàm nhập một ký tự từ bàn phím INT21H ;nhậpmộtkýtự

CMP AL,0DH ;so sánh ký tự vừa nhập có phải là phím enter hay không? JE THOÁT ;nếu đúng thì nhảy tới THOÁT

THOÁT:

3.3. Vòng lặp REPEAT-UNTIL Các dòng lệnh được thi hành sau đó mới kiểm tra điều kiện. Nếu điều kiện

đúng vòng lặp kết thúc.

Cấu trúc lệnh như sau: REPEAT

Các dòng lệnh UNTIL điều kiện

LÁP:

INCCX ;Tăng c x lên Ì ;nhập tiếp ký tự vào từ bàn phím ;nhảy tới LÁP

INT21H JMP LÁP

66

Page 67: Gt Ngon Ngu Lt Assembly

Ví dụ: Hãy nhập các ký tự. Gặp ký tự A thì kết thúc. Đoạn mã lệnh như sau:

MOVAH,l ;gọi hàm nhập một ký tự LÁP: INT21H ;nhập một ký tự

CMP AL,'A' ;không phải ký tự A JNE LÁP ;nhập tiếp

THOÁT:

V. CHƯƠNG TRÌNH .EXE VÀ .COM

1. Khung của chương trình hợp ngữ dể dịch ra chương trình .EXE Từ các khai báo các đoạn của chương trình đã nói ở trên ta có thể xây dựng

một khung tổng quát cho các chương trình hợp ngữ với kiểu kích thước bộ nhớ nhỏ. Sau đây là một khung cho chương trình hợp ngữ để rồi sau khi được dịch và nối trên máy IBM PC sẽ tạo ra một tệp chương trình chạy được ngay với đuôi .EXE.

.MODEL Small

.STACK lOOh .DATA

; các định nghĩa cho biến và hằng để tại đây

.CODE Nhãn:

;khởi đầu cho DS,ES MOV AX,@Data MOV DS,AX MOV ES,AX ; các lệnh của chương trình chính để tại đây ; trở về DOS dùng hàm 4CH của INT 21h

MOV AH,4Ch

67

Page 68: Gt Ngon Ngu Lt Assembly

INT 21h ; các chương trình con (nếu có) để tại đây

END Nhãn Khi một chương trình .EXE được nạp vào bộ nhớ. DOS sẽ tạo ra một mảng

gồm 256 byte của cái gọi là đoạn mào đấu chương trình (program segment prefix, PSP) dùng để chứa các thông tin liên quan đến chương trình và đặt nó vào ngay phía trước phần bộ nhớ chứa mã lệnh của chương trình. DOS cũng

đưa các thông số liên quan đến chương trình vào các thanh ghi DS và ES. Do vậy DS và ES không chứa giá trị địa chỉ của các đoạn dữ liệu cho chương trình của chúng ta. Để chương trình có thể chạy đúng ta phải có các lệnh sau để khởi đầu cho thanh ghi DS (hoặc cả ES nữa nếu cần):

MOV AX,@Data MOV DS,AX MOV ES,AX ;nếu không cần t h ì bỏ

trong đó @Data là tên của các loại dữ liệu. Data định nghĩa bởi hướng dẫn chương trình dịch, chương trình dịch sẽ dịch tên @Data thành giá trị số của đoạn dữ liệu, ta phải dùng thanh ghi AX làm trung gian cho việc khối đầu DS, thanh ghi AX cũng có thể được thay bằng các thanh ghi đa năng khác.

Sau đây là ví dụ của một chương trình hợp ngữ được viết để dịch ra chương trình với đuôi .EXE

Ví dụ: Viết chương trình nhập vào Ì số hệ 10 từ bàn phím. .MODEL SMALL .STACK lOOh .DATA

TB1 DB 'NHÁP VÀO MÓT so HE 10: ','$' TB2 DB 0AH,0DH,'SO HE lo VUA DƯOC NHÁP: ','$'

CODE Programl: MOV AX,@DATA

68

Page 69: Gt Ngon Ngu Lt Assembly

MOV DS,AX MOV ES.AX

BATDAU: XOR cx , cx XOR BX,BX LEA DX,TB1 MOV AH,9

INT 21H MOV AH,1

INT 21H CMP AL, '-'

JE AM CMP AL,'+' JE DƯƠNG

JMP LÁP

AM: MOV c x , l

DUONG: INT 21H

LÁP: CMP AL,'0'

JNGE KPSO CMP AL,'9' JNLE KPSO AND AX,000Fh

PUSH AX MOV AX.10

;khởi tạo DS ;khởi tạo ES

;CX = 0 ;BX = 0 •chuyển địa chí nội dung thông báo vào DX

•để hiện lên màn hình •hiện thông báo lên màn hình

;hàm nhập vào một ký tự ;nhập ký tự từ bàn phím ;so sánh ký tự nhập có phải là dấu âm hay không?

;Đúng thì nhảy đến AM

•So sánh ký tự nhập có phải là dấu dương hay không?

;Đúng nhảy đến DUONG

;khác đi nhảy đến LÁP

;CX = Ì

;tiếp tục nhập một ký tự

;so sánh ký tự > 0? ;sai nhảy đến KPSO

;so sánh ký tự < 9? ;sai nhảy đến KPSO

;Đổi ký tự ra số ;Cất vào Stack

;AX = 10

69

Page 70: Gt Ngon Ngu Lt Assembly

POPBX ADD BX,AX MOV AH,1 INT21H CMP AL,0DH JNE LÁP MOVAX,BX OR cx ,cx JE THOÁT NEG AX

THOÁT: PUSH AX JMP HIENLAI

KPSO: MOV AH,2 MOV DL,0AH INT21H MOV DL,0DH INT21H LEA DX.TB2 MOV AH,9 INT21H JMP BATDAU

HIENLAI: LEA DX,TB2 MOV AH,9 INT 21H POP AX

;lấy giá trị từ Stack chuyển vào BX ;BX = AX + BX ;gọi hàm nhập một ký tự ;nhập ký tự ;Ký tự nhập có phải là phím ENTER?

;BX chứa số hệ lo ;CX = 0? ;Nếu đúng thì thoát ;Đổi dấu AX

; Cất giá trị AX vào ngăn xếp

; nhảy đến hiện lại

; hàm hiện ký tự ; đưa mã về đầu dòng vào DL ; về đầu dòng ; đưa mã xuống dòng vào DL ; xuống dòng ; nạp địa chỉ thông báo vào DX ; gọi hàm hiện chuỗi ký tự ; hiện thông báo 2 ; nhảy đến BATDAU

;nạp địa chỉ thông báo 2 ;gọi hàm hiện thòng báo 2 ;hiện thông báo 2 ;lấy lại hệ số 10

Page 71: Gt Ngon Ngu Lt Assembly

OR AX,AX JNL S_CHIA

PUSH AX MOV DU'- ' MOV AH,2 INT21H POP AX NEG AX

S_CHIA: XOR cx ,cx MOV BX,10D

L_CHIA: XOR DX,DX

DIV BX

PUSH DX

INC c x OR AX,AX JNE L_CHIA MOV AH,2

HIÊN: POP DX OR DL,30H

INT21H LOOP HIÊN MOV AH,4CH

INT21H END Programl

;AX<0 ;Sai, S_CHIA ;Dung, cát AX ;DL chứa dấu trừ(-) ;gọi hàm hiện dấu trừ(-)

;hiện dấu trừ (-)

;lấy lại AX ;AX = -AX

;khởi tạo cx = 0

;BX = 10

;DX = 0 ;chia giá trị trong AX cho 10

;cat so du ;tăng c x lên Ì ;AX=0? ;SAI, L_CHIA ;gọi hàm hiện ký tự

;lấy số dư ;đổi ra ký tự ;rồi hiện ra màn hình

;lặp lại ;thoát trở về DOS

Page 72: Gt Ngon Ngu Lt Assembly

2. Khung của chương trình hợp ngữ để dịch ra chường trình .COM Nhìn vào khung chương trình hợp ngữ để dịch ra tệp chương trình đuôi

.EXE ta thấy có mặt đầy đủ các đoạn. Trên máy tính IBM PC ngoài tệp chương trình với đuôi .EXE, chúng ta còn có khả năng dịch chương trình hợp ngữ có kết cấu thích hợp ra một loại tệp chương trình chạy được kiểu khác với đuôi .COM. Đây là một chương trình ngắn gọn và đơn giản hơn nhiều so với tệp chương trình đuôi .EXE, trong đó các đoạn mã, đoạn dữ liệu và đoạn ngăn xếp

được gộp lại trong một đoạn duy nhất là đoạn mã. Như vậy nếu ta có các ứng dụng mà dữ liệu và mã chương trình không yêu cầu nhiều về không gian của bộ nhớ, ta có thể ghép luôn cả dữ liệu, mã chương trình và ngăn xếp chung vào

một trong cùng một đoạn mã rồi tạo ra tệp .COM. Với việc tạo ra tệp này không những ta tiết kiệm được thời gian và bộ nhớ khi cho chạy chương trình

mà còn tiết kiệm được cả không gian nhớ khi phải lưu trữ nó trên ổ đĩa.

Để có thể dịch được ra chương trình đuôi .COM thì chương trình nguồn hợp ngữ phải được kết cấu sao cho thích hợp với mục đích này.

Sau đây là khung của một chương trình hợp ngữ để dịch được ra tệp chương trình đuôi .COM.

.Model T i n ỵ

. Code ORG l ũũh

s t a r t : JMP nhãn

; c á c đ ịnh nghĩa cho b i ế n và hằng để t ạ i đây Nhãn: ;các lệnh của chương trình chính để tại đây INT 20H /Trở về DOS

; c á c chương t r ì n h con (nếu có) để t ạ i đây END s t a r t

Ví dụ: Chương trình hiển thị một thông báo lên màn hình. .MODEL Tiny .CODE

72

Page 73: Gt Ngon Ngu Lt Assembly

ORG lOOh START:

JMP CTRINH TB1 DB 'XIN CHAO CÁC BAN ! $'

CTRINH: LEA DX/TB1 ;lấy địa chỉ thông báo MOV AH,9 ;hàm hiển thị chuỗi INT 21H ;hiện lời chào INT 20h -vi DOS END START

Câu hỏi ôn tập 1. Tên nào trong các tên sau đây là hợp lệ trong hợp ngữ cho IMB PC? a. TWO_WORD b. ?1 c. Two_word d. .@? e. $145 í. LET'S_GO g.T=. 2. Hãy nêu toán tử giả định nghĩa dữ liệu cho các biến và hằng sau đây nếu như

chúng hợp lệ: a. Một biến kiểu word được khởi tạo với giá trị 52. b. Một biến kiểu word WORD1, không được khỏi tạo. c. Một biến kiểu byte B được khởi tạo với giá trị 52h. d. Một biến kiểu byte C1 không được khỏi tạo. e. Một biến kiểu word WORD2 được khỏi tạo với giá trị 65536. f. Một mảng kiểu word được khỏi tạo với 5 giá trị đầu nguyên (từ 1 đến 5).

g. Một hằng BEL bằng 07h. h. Một hằng MSG bằng THIS IS A MESSAGE $'.

73

Page 74: Gt Ngon Ngu Lt Assembly

Bài tập 1. Hãy viết các lệnh thực hiện các công việc sau đây (không phải là chương trinh

đầy đủ): a. Đọc một ký tự và hiển thị nó lên màn hình. b. Đọc một chữ thường và hiển thị dưới dạng chữ hoa ra màn hình. c. Tinh tổng của dãy số tự nhiên từ 1-10 d. Nhập vào một chữ cái và kiểm tra đó có phải là chữ A hay không e. Nhập vào một số nhỏ hơn 10 nếu không phải là số thì yêu cầu nhập lại f. Nhập vào hai số (nhỏ hơn 10) và so sánh số nào lớn hơn thì cho hiện ra màn hình. 2. Viết một chương trinh thực hiện các công việc sau đây: a. Đọc hai chữ số thập phân có tổng nhỏ hơn 10. b. Hiển thị các số đó với tổng của chúng với dòng thông báo tương ứng Ví dụ:

2,7 .Tổng của 2 và 7 là 9. 3. Hãy viết một chương trình thực hiện các công việc sau đây: a. Đưa ra thông báo cho người sử dụng. b. Đọc các chữ cái tên của một người. c. Hiển thị chúng lần lượt ra màn hình. 4. Viết một chương trình đọc một chữ số hex trong khoảng (A-F) rồi hiển thị nó trên

dòng tiếp theo ỏ dạng nhị phân 5. Viết một chương trinh hiển thị một bảng 10x10 điền đầy dấu '*'. 6. Viết một chương trinh thõng báo cho người sử dụng vào một ký tự, in ra trên các

dòng liên tiếp nhau mã ASCII của ký tự đó dưới dạng nhị phân. Ví dụ: Đánh vào một ký tự : A Mã ASCII của A dưới dạng nhị phân là 01000001

7. Viết chương trình thông báo cho người sử dụng đánh vào một ký tự và in ra mã ASCII của ký tự dưới dạng hex ở dòng tiếp theo. Lặp lại cho đến khi người sử dụng đánh ÉNTER.

Ví dụ: Đánh vào một ký tự: z Mã ASCII của z dưới dạng hex là 5A Đánh vào một ký tự: nếu là Enter thì thoát

8. Viết chương trình thông báo cho người sử dụng đánh vào một số hex nhỏ hơn hay bằng 4 chữ số. Đưa ra số dưới dạng nhị phân ở dòng kế tiếp. Khi người sử dụng đưa vào một ký tự không hợp lệ, thông báo để họ vào lại.

74

Page 75: Gt Ngon Ngu Lt Assembly

C h ư ơ n g 3

L I Ê N K Ế T A S S E M B L Y V Ớ I N G Ô N N G Ữ P A S C A L

Có hai cách liên kết giữa ngôn ngữ Pascal và Assembly: Cách 1: Chèn các khối lệnh Assembly vào chương trình được viết bằng

ngôn ngữ Pascal - inline Assembly. Đây là phương pháp khá đơn giản và nhanh vì với từ khoa asm và được kết thúc bằng end; chúng ta có thể dễ dàng đưa một khối các lệnh của Assembly vào giữa các dòng lệnh của Pascal. Tuy nhiên phương pháp này có một số hạn chế mà chúng ta sẽ đề cập ở phần sau.

Cách 2: Viết tách biệt các module: -bằng ngôn ngữ Pascal, và -bằng Assembly.

sau đó tiến hành dịch và liên kết chúng lại với nhau. So với cách Ì, cách này sẽ phức tạp hơn cho nguôi lập trình, song sẽ tránh được những nhược điểm mà cách Ì gặp phải.

ì. ASSEMBLY TRONG PASCAL Trong phương pháp này, chúng ta đặt các lệnh Assembly vào các dòng

trong chương trình được viết bằng ngôn ngữ Pascal tại nơi nào mà chúng ta thấy cần thiết.

Dạng tổng quát của Assembly trong chương trình viết bằng Pascal như sau: asm khối các lệnh Assembly end;

Mỗi khi chương trình dịch của Pascal gặp từ khoa asm trong dòng lệnh

75

Page 76: Gt Ngon Ngu Lt Assembly

Assembly thì chương trình dịch sẽ chuyển dòng lệnh Asembler này vào và dịch với việc quy chiếu biến Pascal ra dạng tương ứng cùa Assembly để thực hiện.

Chúng ta hãy xem xét cơ chế liên kết theo cách này thông qua một ví dụ đơn giản.

Ví dụ : Hãy viết chương trình nhập từ bàn phím một số và cất vào một biến bằng

Pascal, sau đó giảm giá trị của biến đó đi Ì bằng Assembly và hiện màn hình bằng Pascal với tên tệp là vidu.pas .

PROGRAM baitap uses Crt; var

x: integer; BEGIN clrscr; write ( 'Hay vào gia tri cua x: '); read (x); asm

mov AX, x; đéc AX; mov X, AX;

end; writeln ( 'Két qua cua X la : \x); readln; END.

Tiến hành dịch như sau: tpc vidu.pas đánh <ENTER>

Pascal gặp từ khoa asm và lúc này biến X của Pascal sẽ được chuyển sang biến tương ứng của Assembly và được đặt vào thanh ghi AX. Nói một cách ngắn gọn là từ khoa asm cho phép chúng ta nhét bất kỳ một dòng lệnh Assembly vào chương trình đang được viết bằng ngôn ngữ Pascal.

76

Page 77: Gt Ngon Ngu Lt Assembly

Cách liên kết này khá đơn giản, song vì thế cũng có một số hạn chế:

- Các lệnh của Assembly được "dịch nhờ" qua chương trình dịch của Pascal.

- Các lệnh nhảy của Assembly chỉ có thể nhảy đến các nhãn Pascal, có

nghĩa là lệnh nhảy chỉ có thể thực hiện từ Assembly ra phần ngôn ngữ Pascal chứ không cho phép theo chiều ngược lại và cũng không cho phép các lệnh nhảy trong lòng phần Assembly - nói một cách ngắn gọn không cho phép đặt nhãn nhảy trong phần Assembly.

Ví dụ: ỉ

asm jz Thoát đéc CX;

end; Thoát:

Trường hợp này là cho phép vì nhãn thoát là nhãn Pascal nằm trong phần ngôn ngữ Pascal.

asm jz Thoát đéc CX;

Thoát: end;

Trường hợp này là không cho phép vì nhãn Thoát là nhãn của Asembly nằm trong các phần lệnh Assembly.

Lưu ý: Lệnh gọi chương trình con CALL không thể coi là lệnh nhảy, do vậy các

toán hạng đi sau lệnh CALL có thể là tên của hàm Pascal hoặc các nhãn Assembly, song nhất thiết không thể là nhãn Pascal.

li

Page 78: Gt Ngon Ngu Lt Assembly

l i . VIẾT TÁCH BIỆT NHIÊU MODUL (trên nhiều tệp) RIÊNG LẺ Cũng như sự liên kết giữa ngón ngữ Pascal và Assembly, cách thường dùng

trong việc liên kết giữa các chương trình viết bằng ngôn ngữ Pascal và Assembly là viết hoàn toàn tách biệt nhiều modul riêng lẻ trong ngôn ngữ Pascal và Asembly, tiến hành dịch các modul đó theo từng modul một và sau đó liên kết những modul này lại với nhau trước khi cho chạy. Và như vậy chúng ta sẽ có được một tệp thực hiện được (đuôi .exe) bằng cách trộn các tệp được viết bằng ngôn ngữ Pascal và Assembly.

Viết tách biệt các modul ra với nhau rất có lợi cho các chương trình có số lượng lệnh Assembly lớn vì trong trương hợp này có thể sử dụng toàn bộ khả năng của chương trình dịch MASM và cho phép chúng ta viết và dịch phần chương trình Assembly của chúng ta trong môi trường thuần túy Assembly chứ không phải "dịch nhờ" bởi từ khoa asm trong Pascal. Không những thế

phương pháp này giúp chúng ta tránh được những nhược điểm mà Assembly vấp phải. Tuy vậy để thực hiện được sự liên kết theo cách này, người lập trình cho modul của Assembly phải tuân theo tất cả các vấn đề liên quan đến

segment, chuyển đổi thông số, các quy chiếu đến các biến của Pascal, sự bảo tồn các biến, thanh ghi....

1. Những vấn đề cần giải quyết

Sau đây chúng ta tìm hiểu các lệnh điều khiển cần thiết cho sự liên kết

giữa Pascal và Assembly:

1.1. Vân đề NEAR, FAR và lệnh điều khiên dịch Turbo Pascal chứa nhiều segment mã lệnh nên nó có thể thâm nhập (gọi)

các thủ tục của hàm với NEAR và FAR. NEAR CALL sử dụng để thâm nhập vào các chương trình con nằm trong

cùng segment với chương trình gọi nó. FAR CALL sẽ thâm nhập vào các chương trình con ờ bất kỳ nơi nào trong

vùng nhớ. Turbo Pascal sẽ tự động chọn cách gọi thích hợp dựa vào khai báo của thủ tục theo quy ước sau:

Các chương trình con được khai báo ở phẩn interỷace của Unit luôn là FAR sao cho chúng có thể được gọi từ các Unit khác còn các chương trình

78

Page 79: Gt Ngon Ngu Lt Assembly

con được khai báo trong chương trình chính hoặc ớ phần implementation của Unit sẽ là NEAR.

Song vì một lý do nào đó thì chương trình con cũng có thể yêu cầu FAR. Để làm được điều này, chương trình dịch Turbo Pascal có trang bị lệnh điều

khiển dịch ị$FỊ (compiler directive). Các chương trình còn được dịch với khai báo |$F+| là FAR, còn {$F-| sẽ quay về quy ước trên.

1.2. Vân đề liên kết thông tin giữa Turbo Pascal với Assembly Có hai vấn đề mấu chốt để liên kết thông tin giữa Turbo Pascal

với Asembly. Đó là lệnh điều khiển liên kết ($1) và khai báo PUBLIC,

EXTERNAL, EXTRN.

- Lệnh điều khiển {$1 tên tệp.OBJỊ báo cho chương trình dịch của Turbo Pascal tìm đến tệp có thể ghép được và tiến hành liên kết tệp đó với chương trình của Pascal (tên tệp bao gồm cả đường dẫn).

Chương trình được liên kết bằng các module của Pascal và Asembl cũng

là chương trình đa tệp do đó phải thoa mãn các yêu cầu về khai báo nhãn (tên biến, tên hàm...) giữa các module với nhau mà cụ thể là:

Trong các module viết bằng Assembly phải: - Khai báo PUBLIC trước những nhãn (tên biến toàn cục, tên hàm...) mà

các tệp khác cũng sẽ dùng đến bằng cú pháp sau: PUBIC tên nhãn Ì, tên nhãn 2, khai báo nhãn (xác định kích cỡ)

Ví dụ: Với tên nhãn là biến nhớ:

PUBLIC valuel, value2 valuel DB 10 value2 BW ?

Với tên nhãn là tên hàm: PUBIC SUM SUM PROC

79

Page 80: Gt Ngon Ngu Lt Assembly

các lệnh trong thân hàm SUM ENDP

- Khai báo EXTRN trước những biến ngoài được tệp này dùng đến với cú pháp sau:

EXTRN tên nhãnl : kiểu, tên nhãn! : kiểu... Ví dụ: Với tên nhãn là biến nhớ :

EXTRN xi : BYTE, x2 : WORD Với tên nhãn là tên hàm :

EXTRN f l : PROC Trong module viết băng ngôn ngữ Pascal phải: - Khai báo external đối với các nhãn ngoài được module này dùng đến với

cú pháp sau: tên nhãnl, tên nhãn2,.... : kiểu; external; (đối vối biến)

íuntion tên_hàm: kiểu; external; (đối với hàm) procedure tên_thủ_tục; external; (đối với thủ tục)

- Việc khai báo PUBIC là không cần thiết.

Để có thể dùng chung các biến giữa các module của Pascal và Assembly khi liên kết với nhau, ngoài phần khai báo PUBIC và EXTERNAL, chúng ta cũng nên lưu ý đến sự tương thích về kiểu khai báo dữ liệu theo bảng sau :

Kiểu khai báo Kiểu khai báo dữ dữ liệu trong Pascal liệu trong Assembly

byte BYTE word WORD shortint BYTE integer WORD real FWORD single DOWRD double QWORD extended TBYTE

80

Page 81: Gt Ngon Ngu Lt Assembly

comp QWORD pointer DWORD

Để phần nào minh họa cho những vấn đề trên, chúng ta hãy xem xét ví dụ đơn giản sau:

Tính tổng của dãy số nguyên dương khi cho biết số đầu tiên và số lượng số cần tính.

2. Các biến dùng chung được khai báo toàn cục Trong phương pháp này, các biến được dùng chung trong các module của

Pascal và Assembly phải được khai báo là biến ngoài, có nghĩa là trong module

của Pascal các biến này được khai báo ngoài tất cả các hàm và trong module của Assembly chúng được khai báo trong DATA segment. Chúng ta thấy rõ điều này

qua ví dụ trước trong việc tính, trong đó hai biến soluong (được khai báo là biến

ngoài trong .DATA segment của module Assembly).

Ví dụ: Hãy viết chương trình tính trung bình cộng hai số nguyên với sự phân

công sau: Module Pascal thực hiện các nhiệm vụ sau: - Nhận hai số nguyên từ bàn phím, - Gọi chương trình con tính trung bình cộng do Assembly viết,

- Hiện giá trị trung bình cộng ra màn hình. Module Assembly: Chương trình con tính trung bình cộng hai số nguyên.

Để thể hiện cơ chế chuyển giao tham số khác nhau giữa chương trình gọi (Pascal) và chương trình con (Assembly), ở bài tập này chúng ta sẽ viết

chương trình theo ba cách: Bài giải: Ba tham số {soi, soi, và flag) đều chuyển giao thông qua việc

khai báo biến toàn cục (khai báo PUBLIC và EXTERNAL). Tên hàm Assembly sẽ mang giá trị phần nguyên (làm tròn dưới) của trung bình cộng.

Phần chương trình Pascal: PROGRAM TBC;

81

Page 82: Gt Ngon Ngu Lt Assembly

uses Crt; var

soi, so2, flag: integer; ($F+)

íunction Average: integer : external; {$L C:\USER\f2.0BJ I

($F+-) BEGIN

flag: = 0 clrscr; write ( ' Hay vào so thu nhát: ' ); readln (soi); write ( ' Hay vào so thu hai : ' ); readln (so2); write (' Trung binh cong 2 so nguyên la : ', (0.5*flag + Average): 5:1); readln; END.

Phần chương trình con Assembly: .MODELlarge .DATA

EXTRN sol:WORD, so2:WORD, flag:WORD .CODE PUBIC Average Average PROC mov AX, soi mov BX, so2 add AX, BX sar AX, Ì jnc LI mov flag, Ì L I : ; Trước khi quay về AX chứa phần nguyên

rét ; (làm tròn dưới) của trung bình cộng Average ENDP

END

82

Page 83: Gt Ngon Ngu Lt Assembly

Bài tập 1. Hãy viết chương trình nhận một số nguyên từ bàn phím, sau đó tăng lên 1 và hiện

số đã tăng ra màn hình, trong đó phần tăng giá trị thực hiện bằng Assembly. Còn phần nhập và hiện ra màn hình được viết bằng Pascal.

2. Hãy viết chương trình so sánh hai số nguyên với sự phản công như sau: Module Pascal thực hiện các nhiệm vụ sau: - Nhập hai số nguyên từ bàn phím, - Gọi chương trình con so sánh hai số do Assembly viết,

- Hiện giá trị số bé ra màn hình. Module Assembly: Viết chương trình con so sánh hai số

3. Hãy viết chương trinh tính trung bình cộng hai số nguyên với sự phân công sau: Module Pascal thực hiện các nhiệm vụ sau: - Nhập hai số nguyên từ bàn phím, - Gọi chương trình con tính trung bình cộng do Assembly viết.

- Hiện giá trị trung binh cộng ra màn hình. Module Assembly: Viết chương trình con tính trung bình cộng hai số nguyên. 4. Hãy viết chương trình tính n! với n từ 0 - 7 (giới hạn trong 1 thanh ghi 16 bít). Module Pascal thực hiện các nhiệm vụ sau: - Nhập số n từ bàn phím, - Gọi chương trình con tính n! do Assembly viết,

- Hiện kết quả giai thừa ra màn hình. Module Assembly: Viết chương trinh con tính giai thừa. 5. Hãy viết chương trình tính tổng dãy số nguyên với sự phân công như sau: Module Pascal thực hiện các nhiệm vụ sau: - Nhập vào số lượng chữ số từ bàn phím, - Hiện các số vừa nhập - Gọi chương trình con tính tổng do Assembly viết,

- Hiện giá kết quả tổng ra màn hình. Module Assembly: Viết chương trình con tính tổng số nguyên

Page 84: Gt Ngon Ngu Lt Assembly

C h ư ơ n g 4

C Á C B À I T O Á N L Ậ P T R Ì N H

ì. CÁC BÀI TOÁN PHẦN SỐ HỌC Bài tập Ì Hãy viết chương trình tính tổng của dãy số tự nhiên khi biết số đầu và số

lượng chữ số. Thuật toán cho việc tính tổng của dãy số tự nhiên như sau: Để đơn giản ta ấn định số đầu là Ì và số lượng chữ số là lo 1. Khai báo số đầu, số lượng số tự nhiên và tổng số 2. Nạp số lượng số tự nhiên cần tính tổng vào c x 3. Nạp số đầu tiên vào thanh ghi AX 4. Tổng = AX 5. Giảm số lần lặp sau mỗi lần tính tổng 6. Tăng số tự nhiên tiếp theo

7. Cộng số đó vào tổng 8. Lặp lại từ đầu cho đến khi hết số tự nhiên cần tính Bài giải:

.MODEL small -STACK 100 h .DATA so_dau DW Ì so_luong DW 10

84

Page 85: Gt Ngon Ngu Lt Assembly

TONG DW .CODE Programl: mov AX,@data mov DS,AX mov cx, so_luong mov AX, so_dau mov TONG, AX đéc c x

LÁP: inc AX add TONG.AX loop LÁP mov AH,4Ch

im 21h

;đưa địa chỉ (phần segment) ;của vùng dữ liệu vào DS ;đưa số lần lặp vào c x ;AX = giá trị đầu ;TONG bằng giá trị số đầu ;Trừ số lần lặp đi Ì ;số tự nhiên tiếp theo

; TONG =AX

;Lặp cho đến khi c x = 0

;Kết thúc chương trình quay về DOS

END Programl

Bài tập 2: Hãy viết chương trình tính giai thừa của 5 (5 !) bằng hai cách: tạo tệp

-EXE và .COM Bài giải: ở đây đầu bài yêu cầu tính giai thừa của 5 là số đã được ấn định trước, ta

đều biết 51 = 1 x 2 x 3 x 4 x 5 chính là tích của dãy số tự nhiên từ Ì - 5, do đó có chương trình sau:

a. Cách viết chương trình để tạo ra tệp dạng .EXE: .MODEL small .STACK lOOh .DATA Tích DW ? so DW ?

85

Page 86: Gt Ngon Ngu Lt Assembly

.CODE Program2:

mov AX,@data mov DS,AX ;khởi tạo DS mov Tích, Ì ;Tich=l mov so,2 ;so = 2 mov cx,4 ;SỐ lần dịch cx = 4

LÁP: mov AX.Tich ;AX = Ì mui so ;AX = 1 x 2 mov Tich.AX ;Tich = AX inc so ;so = so + Ì loop LÁP ;Lặp lại đến khi c x = 0

mov AH,4Ch ;Thoát trở về DOS

im 21h

END Program2

b. Cách viết chương trình để tạo ra tệp .COM: .MODEL Tiny . CODE ORG lOOh

Program2: jmp Start

Tích DW ? so DW ?

Start: mov Tích, Ì mov so,2 mov cx,4

86

Page 87: Gt Ngon Ngu Lt Assembly

LÁP: mov AX,Tich mui so mov Tich,AX inc so loop LÁP int 20h ; trở về DOS chương trình dạng .COM

END Program2 Bài tập 3: Hãy viết chương trình thực hiện việc nhận từ bàn phím một số nguyên

dương nhỏ hơn 65535 (giới hạn của 16 bít) với quy định kết thúc việc vào một số bằng cách ấn phím ENTER (mã ASCII là Od h).

Thuật toán nhập các số thập phán như sau: Khai báo biến nhớ

Khai báo biến nhớ Số = 0

REPEAT Đọc một chữ số ASCII Đổi ký tự ra số nhị phân Số = Số X 10 + giá trị vừa nhập cất Số vào biến

UTIL Ký tự nhập là phím ENTER Bài giải: .MODEL small .STACK 100H .DATA

SO DW 0 ; sẽ chứa số nhập .CODE ,

87

Page 88: Gt Ngon Ngu Lt Assembly

Program3 :

mov AX,@data ; Khởi tạo DS mov DS, AX xor cx , cx ; xoa c x = 0 mov BX,0Ah ; cho giá trị BX = 10

LÁP: mov AH,1 ; chờ nhận từ bàn phím 1 ký tự im 21h cmp AL,0Dh ; ký tự vừa nhận là ENTER ? J'E THOÁT ; đúng thoát sub AL,30h ; chuyển số dạng ASCII thành số mov CL,AL ; tạm cất số vừa vào thanh ghi CL mov AX,SO ; lôi giá trị vào trước ra AX mui BX ; nhân với 10 add AX,CX ; cộng giá trị vào trước với số vừa vào mov SO,AX ; cất lại vào biến so

jmp LÁP

THOÁT:

mov AH,4Ch ; trở về DOS

im 2lh

END Program3

Bài tập 4:

Hãy viết chương trình tính tổng đại số của hai số có đấu với số thứ nhất giá trị là lOh, số thứ hai là-2(82h)

Bài giải: .MODEL small .STACK lOOh

88

Page 89: Gt Ngon Ngu Lt Assembly

DATA SH1 DB lOh SH2 DB 82h ; số hạng 2 là -2 TONG DB ?

.CODE Program4:

mov AX,@data mov DS,AX mov BL,SH1 mov BH,BL and BX,807fh ; BH chứa dấu của SH1, BL chứa [SH1] mov CL,SH2 mov CH,CL and cx,807f h ; CH chứa dấu của SH2, CL chứa [SH2] cmp BH,CH ; so sánh dấu hai số

jz L2 ; cùng dấu thì nhảy đến L2

mov AL,BL ; trường hợp khác dấu sub AL,CL ; trừ hai giá trị tuyệt đối cho nhau jnc L I xchg BX,CX ; đổi hai sò' cho nhau (cả dấu và giá trị tuyệt đối)

L I : sub BL,CL

jmp L3 L2 :

add BL,CL ; cùng dấu thì cộng hai giá trị tuyệt đối L3:

and BL,BL ; xét có phải tổng là 0 jnz L4 ; không phải thì nhảy

89

Page 90: Gt Ngon Ngu Lt Assembly

TONG.O KETTHUC

BL,BH TONG,BL

AH,4Ch 21h

; tổng là 0, tránh trường hợp có dâu -

; gộp dấu vào kết quả tổng

; trờ về DOS

mov

jmp

L4:

or

mov

KETTHUC:

mov

int

END Program4

Bài tập 5:

Hãy viết chương trình con-đưa một số hệ thập phân ra màn hình Thuật toán cho việc đưa ra số thập phân

Ì • IF AX<0 /* AX chứa giá trị cần đưa ra*/ 2. THEN 3. In ra dấu âm

4. Thay nội dung của AX bằng số bù của nó. 5. END_IF

6. Lấy dạng biểu diễn thập phân các chữ số trong AX 7. Đổi các chữ số này thành các ký tự rồi đưa chúng ra màn hình.

Bài giải:

OUTDEC PROC PUSH AX ;cất các thanh ghi PUSH BX PUSH c x PUSH DX OR AX,AX ;AX<0? JGE NHAY ;NO,>0 PUSH AX ;Cất số cần đưa ra

90

Page 91: Gt Ngon Ngu Lt Assembly

MOV DL,'-' ;Lấy ký tự ' - ' MOV AH,2 ;Hàm hiện ký tự âm ra màn hình

INT 21H ;Indấu'-' POP AX ;lấy lại AX NEG AX ;đổi dấu AX NHAY: ;Lấy ra các chữ số thập phân XOR DX,DX ;CX đếm các chữ số thập phân MOV BX.10D ;BX chứa số chia

LÁP: XOR DX,DX ;chuẩn bị word cao cho số bị chia DIV BX ;AX = thương số, DX = số dư PUSH DX ;cất số dư vào ngăn xếp

INC c x ;Đếm = Đếm + ỉ OR AX,AX ;Thương số = 0 JNE LÁP ;Không!, tiếp tục MOV AH,2 ;Hàm con in ký tự

HIÊN: POP DX ;Chữ số trong DL OR DL,30H ;Đổi nó thành ký tự INT 21H ; In ra màn hình LOOP HIÊN ;Lặp lại cho đến khi xong

POP DX ;Phục hồi các thanh ghi

POP c x POP BX POP AX RÉT OUTDEC ENDP

Page 92: Gt Ngon Ngu Lt Assembly

l i . BÀI TOÁN VẾ CHUỖI

Bài tập 1: Hãy viết chương trình đọc và lưu một chuỗi ký tự Bài giải: DOC_S PROC ;Đọc và lưu một chuỗi

;Vào: DI chứa địa chì offset của chuỗi ;Ra: DI chứa địa chỉ offset của chuối ;BX chứa số ký tự nhập được

PUSH AX PUSH DI

CLD ;Xử lý từ bên trái sang phải XOR BX,BX ;SỐ ký tự nhập bằng 0 MOV AH, Ì ;Hàm đọc một ký tự INT 21H ;Đọc Ì ký tự vào AL

WHILE1:

CMP AL, ODH ;Ký tự Enter ? JE END_WHILE1 ;Đúng! Kết thúc

;Nếu ký tự là Backspace

CMP AL,08h ;Backspace? JNE ELSE1 ;Không! Lưu nó vào chuỗi

;Thì

ĐÉC DI ;Đúng!,lùi con trỏ chuỗi D E C B X ;Giảm bộ đếm số ký tự nhập được JMP READ ;và đọc ký tự khác

ELSE1:

STOSB ;Lưu ký tự vào chuỗi I N C BX ;Tăng bộ đếm số KT

READ:

92

Page 93: Gt Ngon Ngu Lt Assembly

INT 21H ;Đọc ký tự vào AL JMP VVHILEl ;và tiếp tục vòng lặp

END_WHILE1: POP DI POP AX RÉT

DOC-S ENDP Bài tập 2: Hãy viết chương trình kết hợp hai xâu ký tự lại và hiện ra màn hình (hai

xâu ký tự đầu được kết thúc bằng 0). Bài giải:

. MODEL small

. STACK 200h

. DATA Stringl DB 'Hello,',0 String2 DB 'world $',0 String3 DB 50 DUP(?) . CODE

Program2: mov AX, @data mov DS, AX cld ; theo chiều tăng của địa chỉ Lea DI, String3 ; ES:DI trỏ đến xâu ký tự gộp mov ES, DI Lea DI,String3 Lea SI, Stringl ; DS:SI trỏ đến Stringl

StringlLoop :

lodsb ; nạp Ì ký tự của Stringl vào AL

93

Page 94: Gt Ngon Ngu Lt Assembly

and AL, AL ; dựng các cờ jz DoString2 ; 0 thì nhảy (kết thúc Stringl)

stosb ; cất Ì ký tự của String Ì vào vị ui xâu jmp StringlLoop

DoString2 : mov SI, OFFSET String2; DS:SI trỏ đến String2

String2Loop :

lodsb ; nạp Ì ký tự của String2 vào AL stosb ; cất vào vị trí xâu ký tự gộp and AL, AL ; dựng các cờ jnz String2Loop ; chưa bằng 0 thì tiếp tục in mov AH, 9 ; xâu ký tự gộp ra màn hình mov DX, OFFSET String3 int 21h mov AH, 4Ch ; trờ về DOS

int 21h

END Program2

Bài tập 3: Hãy viết chương trình nhập vào một chuỗi chữ cái hoa, đổi chuỗi đó ra

chữ thường và hiện ra với chiều ngược lại, đếm và thông số lượng số chữ b trong chuỗi.

Bài giải: .MODEL SMALL .STACK 100H

.DATA TB1 DB 'Hay go vào mót chuôi chu cai hoa: ','$' TB2 DB 0Ah,0Dh,'Chuoi da doi thanh chu thuong va xép nguoc: ','$' TB3 DB 0Ah,0Dh,'So chu A: ','$'

94

Page 95: Gt Ngon Ngu Lt Assembly

CODE Program3:

MOV AX,@DATA

MOV DS,AX

MOV ES,AX

XOR cx , cx

XOR BX,BX

MOV AH,9

LEA DX,TB1

INT 21h

NHÁP: MOV AH,1

INT 21h

CMP AL,0DH

JE THOI

CMP AL,'B'

JNE CÁT

INC BX

CÁT: OR AL,20h

PUSH AX

INC c x

JMP NHÁP

THOI: MOV AH,9

LEA DX,TB2

khởi tạo đoạn dữ liệu DS

khởi tạo đoạn dữ liệu ES

;CX = 0

;BX = 0 •gọi hàm hiện thông báo nhập chuồi

;nạp địa chỉ thông báo

;hiện thông báo

;hàm nhập ký tự

;nhập ký tự ;Ký tự là phím Enter ?

;Dung nhảy THOI

;ký tự nhập là 'B'

;Sai nhảy tới CÁT

;Dung tăng số ký tự 'B' lên Ì

;Đổi thành chữ thường

;Cất vào Stack

;CX = cx + Ì

;Nhảy về NHÁP

;hàm hiện chuỗi

;nạp địa chỉ thông báo 2

Page 96: Gt Ngon Ngu Lt Assembly

INT 21H

HIÊN:

POP AX

MOV DL,AL

MOV AH,2

INT 21H

LOOP HIÊN

MOV AH,9

LEA DX,TB3

INT 21H

MOV AX,BX

XOR cx ,cx

MOV BL.10D

LÁP:

DIV BL

PUSH AX

INC c x

XOR AH,AH

OR AL.AL

JNE LÁP

MOV AH,2

HIEN_B:

POP DX

OR DH,30H

MOV DL.DH

INT 21H

;hiện thông báo 2

;Lấy ký tự ra từ Stack

;đưa vào thanh ghi AI

;hàm hiện ký tự

;hiện ký tự đã được lấy ra từ Stack

;lặp cho đến khi hiện hết chuỗi ký tự, c x = 0

;hàm hiện chuỗi .

;nạp địa chí thông báo 3

;hiện thông báo 3

;AX chua so chu 'b'

;CX = 0

;BL chứa số chia

;AH chứa số dư, AL chứa thương

;Cất số dư vào Stack

;CX = c x + Ì

;Xóa AH để chia tiếp

;AL = 0?

;Chua, LÁP

;hàm hiện ký tự

;Lấy lại số dư

;Đổi thành ký tự

;chuyển vào DL

;để hiện

Page 97: Gt Ngon Ngu Lt Assembly

LOOP HIEN_B ;Lặpđến khi cx = 0

MOV AH.4CH ;thoát trở về DOS

INT 21H

END Program3

HI. BÀI TOÁN VẾ THIẾT BỊ VÀO RA

Bài tập 1: Hãy viết chương trình in ra máy in một xâu ký tự (ASCII) được vào từ bàn phím. Kết thúc việc vào xâu bằng phím Ctrl_z.

Cách giải:

Dùng các chức năng sẵn có cùa BIOS hoặc DÓC.

Ngắt im Ỉ7h của BIOS cung cấp ba chức năng cho phép làm việc với máy in. Dùng ba chức năng này để in một xâu ký tự ASCII ra máy in.

Trước tiên, chúng ta xem qua ba chức năng đó.

In một ký tự: CN Oh cùa int 17h

Vào AH=0 ; AL chứa ký tự cẩn in ; DX số của máy in

Ra AH trạng thái của máy in

Khới động cổng máy in : CN lh của im 17h

Vào AH=1 ; DX số của máy in

Ra AH trạng thái của máy in

Lây trạng thái máy in : CN 2h của im 17h

Vào AH=2 ; DX số của máv in

Ra AH trạng thái cùa máy in

97

Page 98: Gt Ngon Ngu Lt Assembly

Ý nghĩa các bít của byte trạng thái:

7 6 5 4 3 2 1 0

Ì xhua quá thời gian L 0:quá thời gian

Ì: lỗi vào/ra " í 0:khõng lỗi vào/ra

Ì :máy in được nối L 0:máy in chưa được nôi _ Ì :hết giấy L 0:còn giấy Ị- Ì :đã nhận xong ^ 0:chưa nhận xong r Ì: máy in sẵn sàng

0:máy in đang bận

Cách giải: .MODEL Small .STACK lOOh .DATA

Buff db 255 dup(?) MI db 'Hay vào xâu ky tu can in ra may in M2 db 0ah,0dh,T M3 db 'Qua thoi gian $'

.CODE PS:

mov AX,@DẤTA mov DS,AX

Page 99: Gt Ngon Ngu Lt Assembly

;Khởi tạo cổng máy in mov DX,0 mov AH,1 im 17h

DX chứa số cổng máy in (0 - LPT1) Chức năng khởi tạo cổng máy in của ngai BOĨS int ỉ 7h

;Nhập xâu ký tự cần in đưa vào vùng đệm Buff mov AH,9 mov DX,OFFSET MI ; Hiện thông báo MI int 21h lea SI,Buff ; SI trỏ đến byte đầu của vùng đệm Buff or cx ,cx ; c x = 0

LÁP:

mov im cmp

je cmp

je mov

jmp L I :

mov mov inc inc mov mov raov mov im

AH,1 21h AL,lAh IN_XAU AL.ODh L I [SI],AL L2

AL,0Ah [SI],AL SI c x AL,0dh [SI],AL AH,9 DX,OFFSET M2

21h

; nhập một ký tự từ bàn phím

; Ký tự vừa vào có phải là Ctrl_z ;Nhảy đến phần in xâu ra máy in ;Ký tự vừa vào có phải Enter? ;Nếu phải thì nhảy đến L I

;Còn không thì đưa ký tự vào vùng đệm Buff

;Nếu ký tự vừa vào là Enter thì đua thêm vào Buff giá trị của OAh (mã LF-xuống dòng) SI trỏ đến byte tiếp của Buff Tăng số lượng ký tự đã vào lên Ì Đưa thêm vào Buff giá trị Odh

;Quay đầu dòng và xuống hàng trên màn hình

99

Page 100: Gt Ngon Ngu Lt Assembly

i ne SI ;Trỏ đến byte tiếp cùa Buff

inc c x ;Tãng số lượng ký tự đã nhận lẽn 1

jmp LÁP ;Nhảy về nhận tiếp ký tự ESLXAU:

lea SI,Buff ;SI trỏ đến byte đầu của vùng đệm Buff IN_RA:

mov AL,[SI] ;Đưa một ký tự ở vùng đệm BuỊỊ vào AL càu PRÍNT ;Gọi chương trình con in ký tự ỏ AL ra máy in inc SI ;SI trỏ đến byte tiếp theo của vùng đệm Buff loop IN_RA mov AL,0Ch ;AL mã kéo trang giấy can PRINT ;Đưa mã kéo trang giấy ra máy in mov AH,1 ;Chờ một ký tự từ bàn phím int 21h mov AH,4Ch ;Về DOS

int 21h

;Chương trình con đưa một ký tự ra máy in ;Vào: AL chứa một ký tự cần in ra máy in ;Ra: Không PRINT PROC

push AX DX push AX ;Cất byte ký tự ở AL vào ngăn xếp

BUSY:

mov DX,0 ;SỐ của máy in mov AH,2 ;Chức năng lấy trạng thái máy in cùa im 17h ;Ngắt BIOS hít lilì and AH,80h ;Tách bít thứ 7 để xem liệu máy in đã sẵn sàng

100

Page 101: Gt Ngon Ngu Lt Assembly

jz BUSY ;Máy in bận thì nhảy; máy in sẩn sàng thì tiếp tục

pop AX ;Hồi phục ký tự ở ngăn xếp vào AL

mov DX,0 ;SỐ của máy in mov AH,0 ;Chức năng đưa một số ký tự ra máy in của ngắt

int 17h ;BĨ0S int 17h

and AH,1 ;Tách bít thấp nhất của byte trạng thái (Time Out)

jz EXIT ;Chưa quá thời gian thì nhảy mov AH,9 mov DX,OFFSET M3 ; Quá thời gian thì hiện dòng thông báo im 21h

EXIT: pop DX AX rét

PRINT ENDP END PS

Bài tập 2: Hãy viết chương trình điền đầy màn hình với chữ "A" màu đỏ trên nền

xanh da trời. Cách giải:

.MODEL SMALL

.STACK 100H

.CODE MAIN PROC ;Cho DS trỏ tới trang hoạt động.

MOV AX,0B800h ;màu trang hiển thị MOV DS,AX MOV CX.2000 ;80 X 25 = 2000 Words MOV DI,0 ;KhởitạoDI

loi

Page 102: Gt Ngon Ngu Lt Assembly

;Điền đầy trang hiển thị FILL_BUF:

MOV DI, 1441 h ;A đỏ trên xanh da trời ADD Dĩa ;Từ tiếp theo

LOOP FILL_BUF ; Lặp tiếp cho đến khi xong

;Trở về DOS

MOV AH,4CH

INT 21H

MAIN ENDP

END MAIN

Bài tập 3:

Hãy viết một chương trình thực hiện các công việc sau: 1. Thiết lập chế độ hiển thị kiểu 3 (văn bản màu 80 X 25) 2. Xoa cửa sổ có góc trái trên tại cột 26 dòng 8 và góc phải dưới tại cột 52

dòng 16 thành màu đỏ. 3. Chuyển con trỏ đến cột 39, dòng 12. 4. In ra một chữ A màu cyan, nhấp nháy tại vị trí con trỏ. Bài giải:

.MODEL SMALL

.STACK 100H

.CODE MAIN PROC

;thiết lập chế độ màn hình

MOV AH,0 ;hàmchọnchếđộ MOV AL,3 ;văn bản màu 80x25 INT lOh ;chọnchếđộ

;xoá cửa sổ với màu đỏ

MOV AH,6 ;hàm cuốn lên

102

Page 103: Gt Ngon Ngu Lt Assembly

MOV CX,081Ah MOV DX,1034h MOV BH,43h MOV AL,0 INT lOh

;dịch chuyển con trỏ MOV AH,2 MOV DX,0C27h XOR BH,BH INT lOh

;hiển thị ký tự với thuộc tính

;góc trái trên (lAh,08h) ;góc phải dưới (34h,10h) ;ký tự cyan trên nền đỏ ;cuốn cả màn hình ;xoá cửa sổ

;hàm chuyển con trỏ ;tâm màn hình ;trang 0 ;dịch chuyển con trỏ

MOV AH,09 ;hàm hiển thị ký tự MOV BH,0 ;trang 0 MOV BL,0C3h ;ký tự cyan nhấp nháy trên nền đỏ

MOV c x , l ;hiển thị một ký tự

MOV AL,"A" ;chữ "A"

INT lOh ;hiển thị ký tự

MOV AH,1 INT 21h MOV AH,4Ch INT 21h ;trở về DOS

AIN ENDP

END MAIN

103

Page 104: Gt Ngon Ngu Lt Assembly

P H Ụ L Ụ C

C Á C N G Ắ T C Ủ A BIOS V À D O S

ì. CÁC NGẮT CỦA BIOS Ngát 10: Video

Hàm Oh: Chọn chê độ hiên thị. Chọn chế độ hiển thị màn hình. Vào: AH=0

AL=kiểu (xem bảng 12.2) Ra: Không.

Hàm lh Thay đổi kích thước con trỏ màn hình. Chọn dòng quét bát đầu và kết thúc của con trỏ. Vào: AH=lh

CH=dòng quét đầu CL=dòng quét cuối

Ra: Không. Hàm 2h Dịch chuyên con trỏ. Định vị con trỏ. Vào: AH=2h

DH=dòng DL=cột BH=trang

Ra: Không.

104

Page 105: Gt Ngon Ngu Lt Assembly

Hàm 3h Lấy vị trí và kích thước tức thời cùa con trỏ. Nhận vị trí tức thời và kích thước của con trỏ Vào: AH=3h

BH=trang Ra: DH=dòng

DL=cột CH=dòng quét đầu CL=dòng quét cuối

Hàm 5h Chọn trang hoạt động. Vào: AH=5h

AL=trang DH=dòng DL=cột

Ra: Không Hàm 6h Cuốn màn hình hay cửa sổ lên. Cuốn cả màn hình hay cửa sổ lên một số dòng xác định. Vào: AH=6h

AL=SỐ dòng cuốn (AL = 0 có nghĩa là cuốn cả màn hình hay cửa sổ) BH=thuộc tính của các dòng trống CH, CL=dòng, cột góc trái trên của cửa sổ DH, DL=dòng, cột góc phải dưới của cửa sổ

Ra: Không. Hàm 7h Cuốn cửa sổ và màn hình xuống.

105

Page 106: Gt Ngon Ngu Lt Assembly

Cuốn cả màn hình hay cửa sổ xuống một dòng xác định. Vào: AH=7h

AL=SỐ dòng cuốn (AL=0 có nghĩa là cuốn cả màn hình hay cửa sổ) BH=thuộc tính của các dòng trống CH, CL=dòng, cột góc trái trên của cửa sổ DH, DL=dòng, cột góc phải dưới của cửa sổ

Ra: Không. Hàm 8h Đọc ký tự và thuộc tính tại vị trí con trỏ. Nhập ký tự ASCII tại vị trí con trỏ và thuộc tính của nó Vào: AH=8h

BH=trang Ra: AH=thuộc tính

AL=ký tự Hàm 9h Hiển thị ký tự và thuộc tính tại vị trí con trỏ. Viết một ký tự ASCII và thuộc tính của nó tại vị trí con trỏ. Vào: AH=9h

BH=trang AL=ký tự cx=số lần viết ký tự BL=thuộc tính (chế độ văn bản) hay màu (chế độ đồ hoa)

Ra: Không. Hàm Ah Viết ký tự tại vị trí con trỏ. Viết một ký tự ASCII tại vị trí con trỏ. Ký tự có thuộc tính của ký tự trước

đó ở vị trí này.

106

Page 107: Gt Ngon Ngu Lt Assembly

Vào: AH=OAh BH=SỐ hiệu trang AL=mã ASCII của ký tự cx=số lần viết ký tự

Ra: Không. Hàm OBh Thiết lập bảng màu, nền và viền.

Chọn bảng màu, màu nền và màu viền.

Vào: Chọn màu viền và màu nền

AH=0Bh

BH=0

BL=màu

Chọn bảng trộn màu (chế độ 4 màu 320x200) AH=0Bh BH=1 BL=bảng màu

Ra: Không Hàm OCh Viết điểm ảnh Vào: AH=0Ch

AL=giá trị điểm ảnh BH=trang cx=cột DX=hàng

Ra: Không. Hàm ODh Đọc điểm ảnh Nhận một giá trị điện ảnh.

Page 108: Gt Ngon Ngu Lt Assembly

Vào: AH=0Dh BH=trang cx=cột DX=hàng

Ra: AL=giá trị điện ảnh Hàm OEh

Viết ký tự trong chế độ đánh telex.

Viết một ký tự ASCII tại vị trí con trỏ sau đó dịch chuyển con trỏ đến vị trí tiếp theo.

Vào: AH=0Eh

AL=mã ASCII của ký tự BH=trang BL=màu nổi (chế độ đổ hoa)

Ra: Không

Chú ý: không ấn định được thuộc tính của ký tự. Hàm Fh Lấy chế độ màn hình. Nhận chế độ hiển thị hiện tại. Vào: AH=0Fh Ra: AH= số cột màn hình

AL=chế độ hiển thị BH=trang hoạt động

Hàm lOh, hàm con lOh: Thiết lập thanh ghi màu. Thiết lập các thanh ghi màu VGA. Vào: AH=10h

AL=10h BX=thanh ghi màu

108

Page 109: Gt Ngon Ngu Lt Assembly

CH=giá trị màu xanh lá cây CL=giá trị màu xanh da trời DH=giá trị màu đỏ

Ra: Không Hàm lOh, hàm con 12h: Thiết lập khôi thanh ghi màu. Thiết lập nhóm các thanh ghi màu VGA Vào: AH=10h

AL=12h BX=thanh ghi màu thứ nhất cx=số lượng thanh ghi màu ES:DX=địa chi segment:offset của bảng màu.

Ra: không Chú ý: Bảng màu bao gồm các điểm nhập 3 byte tương ứng với các giá trị

màu đỏ, xanh lá cây và xanh da trời cho mỗi thanh ghi màu. Hàm ỈOh, hàm con 15h: Lấy thanh ghi màu. Nhận các giá trị màu đò, xanh lá cây và xanh da trời của một thanh ghi

màu VGA. Vào: AH=10h

AL=15h BX=thanh ghi màu

Ra: CH=giá trị màu xanh lá cây CL=giá trị màu xanh da trời DH=giá trị màu đỏ

Hàm 10, hàm con 17h: Lấy khôi thanh ghi màu. Nhận các giá trị màu đỏ. xanh lá cây và xanh da trời trong một nhóm các

thanh ghi màu VGA.

109

Page 110: Gt Ngon Ngu Lt Assembly

Vào: AH=10h AL=17h BX=thanh ghi màu thứ nhất cx=số lượng thanh ghi màu ES:DX=địa chỉ segment:offset của bộ đệm nhận bảng màu

Ra: ES:DX=địa chỉ segment:offset của bộ đệm Chú ý: Bảng bao gồm các điểm nhập 3 byte tương ứng với các giá trị màu

đỏ, xanh lá cây và xanh da trời cho mỗi thanh ghi màu. Ngắt l l h : lảy càu hình thiết bị. Nhật từ mã hoa danh sách thiết bị. Vào: không Ra: AX=từ mã hoa danh sách thiết bị.

(các bít 14-15= số máy in được cài đặt, 13=modem bên trong, 12=bộ phối ghép trò chơi, 9-ll=số cổng nối tiếp,

8 dự trữ, 6-7=số ổ đĩa mềm,

4-5= chế độ màn hình khỏi tạo, 2-3= kích thước RAM hệ thống với PC nguyên thúy,

2 dùng cho PS/2, 1= bộ đồng xử lý toán học, 0=đĩa mềm được cài đặt)

Ngắt 12h: Lây kích thước bộ nhớ quy ước. Trả về tổng kích thước của bộ nhớ quy ước. Vào: không Ra: AX=kích thước bộ nhớ (theo KB) Ngát 13h: Vào ra đĩa.

Hàm 2h: Đọc sector.

no

Page 111: Gt Ngon Ngu Lt Assembly

Đọc một hay nhiều sector

Vào: AH=2h

AL=SỐ sector CH=xi-lanh Cl=sector DH=đầu tư DL=Ổ đĩa (0-7Fh=đĩa mềm, 80h-ffh=đĩa cứng) ES:BX=địa chỉ segment:offset của bộ đệm

Ra: Nếu thành công: CF=xoá AH=0 AL=SỐ sector được đọc Nếu không thành công: CF=thiết lập AH=mã lỗi

Hàm 3h: Viết sector.

Viết một hay nhiều sector.

Vào: AH=3h

AL=SỐ sector BX=thanh ghi màu thứ nhất CH=xi-lanh CL=sector DH=đầu từ DL=Ổ đĩa (0-7Fh=đĩa mềm, 80h-FFh=đĩa cứng) ES:BX=địa chi segment:offset của bộ đệm)

Ra: Nếu thành công: CF=xoá AH=0

Page 112: Gt Ngon Ngu Lt Assembly

AL=SỐ sector được viết

Nếu không thành công: CF=thiết lập AH=mã lỗi

Ngát 15h: Ghi đọc bàng từ và các đặc tính cao cấp của ÁT và PS/2 Hàm87h: Chuyến khỏi bộ nhớ mở rộng.

Chuyển số liệu giữa bộ nhớ mớ rộng và bộ nhớ quy ước. Vào: AH=87h

cx=số word dịch chuyến

ES:SI=địa chỉ bảng mô tả toàn cục. Ra: Nếu thành công:

CF=xoá AH=0

AL=SỐ sector được dịch chuyến.

Nếu không thành công: CF=thiết lập AH=mã lỗi

Hàm 88h: Lấy kích thước bộ nhớ rộng. Nhận kích thước tổng cộng của bộ nhớ rộng. Vào: AH=88h

Ra: AX=kích thước bộ nhớ mờ rộng (theoKB) Ngát 16h: Bàn phím Hàm 0: Đọc phím nhân. Vào: AH= 0

Ra: AL= mã ACSII của phím AH= mã scan của phím nhấn

112

Page 113: Gt Ngon Ngu Lt Assembly

Hàm này chuyển giá trị phím nhấn đáu tiên trong bộ đệm bàn phím vào AX. Nếu bộ đệm trông, máy tính đợi người sử dụng nhân một phím. Các phím ACSII không được hiến thị trên màn hình.

Hàm trên đây cung cấp một phương pháp kiểm tra phím chức năng. Nếu

AL = 0 có nghĩa là một phím chức nâng được nhấn. chương trình có thể lấy mã scan trong AH để nhận biết đó là phím chức năng nào.

Ví dụ: Dịch chuyển đến góc bên trái trẽn nếu phím Fl được nhấn, góc dưới nêu là một phím chức năng khác. Chương trình sẽ bỏ qua nếu bạn nhấn một phím ký tự.

Lời giãi: MOV AH,0 ;hàm đọc phím nhấn INT 16h ;AL=mã ACSII hoặc O.AH=mă scan OR AL.AL ;AL=0 (hàm chức năng)? JNE EXIT ;không, phím ký tự CMP AH.3Bh :mã scan Fl JE Fl :đúng đến Fl

; phím chức năng khác MOV DX,184Fh ;góc phải dưới JMP CONTRO ;đến dịch chuyển con trỏ

Fl: XOR DX.DX ;góc trái trên

CONTRO: MOV AH.2 ;hàm chuyển con trò XOR BH,BH ;trang 0 INT lOh ;dịch chuyên con trỏ

EXIT: Hàm 1: Đọc và kiểm tra sự sán sàng của phím (đã nhấn chưa) Vào: AH=01h

Ra: AH=mã quét của phím (ZF=0) AL=mã ACSII cua phím (ZF=0)

113

Page 114: Gt Ngon Ngu Lt Assembly

Hàm 2: Đọc trạng thái bàn phím Shift hay kiếm tra trạng thái một số phím điều

khiến và một số chế độ vào phím. Vào : AH=02h. Ra : AH=trạng thái của phím Shift với các bít trạng thái sau: bít 7=1 : Phím Insert đã ấn bít 3=1 : Phím Alt đã ấn bít 6=1 : Phím Caps Lock đã ấn bít 2=1 : Phím Cui đã ấn bít 5=1 : Phím Num Lock đã ấn bít 1 = 1 : Dịch trái đã ấn bít 4=1 : Phím Scroll đã ấn bít 0=1 : Dịch phái đã ấn Hàm 3: Đặt tốc độ gõ phím tự động và thời gian trễ. vào: AH=03h

AL=05h BL=vận tốc gõ tự động tới số :

OOh - 30 lần/sec Olh - 26,7 lần/sec (ký tự/sec)

OAh - 12,0 lần/sec

lFh - 12.0 lần/sec BH=thời gian trễ với:

Olh - 500 ms 02h - 750 ms 03h- 1000 ms

Ra : không số. Hàm 5: Ghi vào bộ nhớ đệm Vào: AH=05h

CH=mã quét của phím CL=mã ASCII

114

Page 115: Gt Ngon Ngu Lt Assembly

Ra: AL=00h (đã ghi) AL=01h (bộ đệm đầy)

Hàm 10: Đọc phím mỏ rộng Vào: AH=10h Ra: AH=mã quét của phím

AL=mã ASCII Hàm l i : Trạng thái của phím mở rộng Vào: AH=llh Ra: ZF=1 không có hành động

ZF=0 có hành động AH=mã quét của phím AL=mã ASCII

Hàm 12: Trạng thái phím Shift của bàn phím mở rộng Vào: AH=12h Ra: AH=trạng thái của Shift với các bít trên đây

AL=trạng thái của bít mở rộng: bít 7=1: SysReqđượcấn bít 6=1: Caps Lock được ấn bít 5=1: Num Lock được ấn bít 4=1: Scrollđượcấn bít 3=1: AU bên phải được ấn bít 2=1: Crt bên phải được ấn bít 1=1: Alt bên trái được ấn bít 0=1: Crt bên trái được ấn

Ngát 17h: máy in Hàm Oh: Viết ký tự ra máy in.

Page 116: Gt Ngon Ngu Lt Assembly

Vào: AH=0h AL=ký tự DX=SỐ hiệu máy in.

Ra: AH=trạng thái Bít Nêu được thiết lập. 7 máy in không bận 6 máy in chấp nhận 5 hết giấy 4 máy in được chọn 3 lối vào/ra 2 không sử dụng 1 không sử dụng 0 quá thời gian

l i . CÁC NGẮT CỦA DOS Ngát 21h Hàm Oh: Kết thúc chương trình.

Kết thúc việc thi hành một chương trình. Vào: AH=0h

cs=địa chỉ đoạn của PSP Ra: không

Hàm lh : Vào từ bàn phím. Đợi đọc một ký tự từ thiết bị vào chuẩn (trừ khi đã có một ký tự sẵn sàng). sau đó đưa ký tự tới thiết bị ra chuẩn và trả về mã ASCII trong DL. Vào: AH=01h Ra: AL= ký tự từ thiết bị vào chuẩn Hàm 2h: Hiển thị. Đưa ký tự trong DL thiết bị ra chuẩn Vào: AH=02h

DL=ký tự Ra: không

116

Page 117: Gt Ngon Ngu Lt Assembly

Hàm 5h: In ra. Đưa ký tự trong DL ra thiết bị in chuẩn. Vào: AH=5h

DL=ký tự Ra: không Hàm 9h: In chuỗi Đưa chuỗi ký tự ra màn hình Vào: AH=09h

DS:DX=con trỏ đến chuỗi ký tự kết thúc bằng '$' Ra: không Hàm 2Ah: Lây ngày tháng. Trả về ngay trong tuần, tháng, năm và ngày trong tháng. Vào: AH=2Ah Ra: AL=ngày trong tuần (0=c.nhật, 6=T.bảy).

cx=nam (1980-2099) DH=tháng (1-12) DL=ngày (1-31)

Hàm 2Bh: Thiết lập ngày tháng. Vào: AH=2Bh

cx=năm (1980-2099) DH=tháng (1-12) DL=ngày (1-31)

Ra: AL=00h, nếu ngày hợp lệ, FFh, nếu ngày không hợp lệ.

Hàm 2Ch: Lây thời gian. Trả về thời gian: giờ, phút, giây và phần trăm của giây. Vào: AH=2Ch Ra: CH=giờ (0-23)

CL=phút (0-59) DH=giây (0-59) DL=phần trăm của giây (0-99)

Page 118: Gt Ngon Ngu Lt Assembly

Hàm 2Dh: Thiết lập thời gian. Vào: AH=2Dh

CH=giờ (0-23) CL=phút (0-59) DH=giây (0-59) DL=phần trăm của giây (0-99)

Ra: AL=00h nếu thời gian không hợp lệ FFh nếu thời gian không hợp lệ.

Hàm 30h: Lấy số hiệu version của DOS. Trả về số hiệu version của DOS. Vào: AH=30h Ra: BX=0000h

cx=0000h AL=SỐ chính của version (trước dấu chấm) AH=SỐ phụ của version (sau dấu chấm)

Hàm 31h: Kết thúc chương trình và ở lại thường trú. Kết thúc chương trình hiện tại và để dành ra một khối nhớ tính bằng

paragraph. Vào: AH=31h

AL=mã trở về

DX=kích thước bộ nhớ theo paragraph Ra: không Hàm 33h: Kiểm tra Ctrl-Break Thiết lập và lấy trạng thái BREAK (kiểm tra Ctrl-break) Vào: AH=33h

AL=00h để lấy trạng thái hiện nay Olh để thiết lập trạng thái hiện tại

DL=00h thiết lập trạng thái hiện tại OFF =01h thiết lập trạng thái hiện tại ÔN

Ra: DL=trạng thái hiện hành (00h=0FF, 01h=ON)

118

Page 119: Gt Ngon Ngu Lt Assembly

Hàm 35h: Lấy vector. Nhận địa chỉ của một vector ngắt. Vào: AH=35h

AL=SỐ hiệu ngắt Ra: ES:BX=con trỏ trỏ đến thường trình quản lý ngắt. Hàm 36: Lấy dung lượng còn trống trên đĩa.

Trả về dung lượng còn trống trên đĩa (số cluster chưa dùng, số clustor/đĩa, số byte/sector).

Vào: AH=36h DL=Ổ đĩa (0=mặc định, 1=A...)

Ra: BX=SỐ cluster khả dụng DX=SỐ cluster/đĩa

cx=số byte/sector AX=FFFFh nếu ổ đĩa trong DL không hợp lệ, các trường hợp khác bằng số sector trong một cluster

Hàm 39h: Tạo lập thư mục con (MKDIR). Tạo lập thư mục con xác định. Vào: AH=39h

DS:DX=con trỏ đến một chuỗi ASCIIZ Ra: AX=mã lỗi nếu cờ carry được thiết lập. Hàm 3Ah: Xóa thư mục con (RMDIR). Xoa thư mục con cho trước. Vào: AH=3Ah

DS:DX=con trỏ đến một chuỗi ASCIIZ Ra: AX=mã lỗi nếu cờ carry được lập. Hàm 3Ch: Tạo lập một nie (CREAT). Tạo ra một file mới hoặc cắt bỏ file cũ cho có độ dài bằng 0 để chuẩn

bị viết.

Vào: AH=3Ch

DS:DX=con trỏ đến một chuỗi ASCIIZ cx=thuộc tính của file

119

Page 120: Gt Ngon Ngu Lt Assembly

Ra: AX=mã lỗi nếu cờ nhớ được lập. Thẻ 16 bít nếu cờ nhớ không được lập.

Hàm 3Dh: Mở một file. Mở một file cho trước. Vào: AH=3Dh

DS:DX=con trỏ trỏ đến một tên đường dẫn ASCIIZ AL=mã truy nhập

Ra: AX=mã lỗi nếu cờ nhớ được lập Hàm 3Eh: Đóng một thè file. Đóng một thẻ file cho trước. Vào: AH=3Eh

BX=thé file trả về bởi thao tác mở hay tạo lập file Ra: AX=mã lỗi nếu cờ nhớ được lập.

không có nghĩa nếu cờ nhớ không được lập Hàm 3Fh: Đọc từ một file hay thiết bị. Chuyển một số cho trước các byte từ một file vào bộ đệm cho trước. Vào: AH=3Fh

BX=thẻ file DS:DX=địa chỉ bộ đếm

cx=số byte đọc Ra: AX=SỐ byte viết

mã lỗi nếu cờ nhớ được lập. Hàm 41h: Xoa một file trong một thư mục nhất định (UNLINK) Xoa một điểm nhập thư mục tương ứng với tên file Vào: AH=41h

DS:DX=địa chỉ của một ASCIIZ Ra: AX=mã lỗi nếu cờ nhớ được lập.

không có nghĩa nếu cờ nhố không được lập.

120

Page 121: Gt Ngon Ngu Lt Assembly

Hàm 42h: Di chuyên con trỏ đọc viết file (LSEEK).

Di chuyển con trỏ đọc/viết theo phương thức cho trước Vào: AH=42h

DS:DX=khoảng cách (offset) di chuyển theo byte AL=phương thức di chuyến (0,1,2)

BX=thẻ file Ra: AX=mã lỗi nếu cờ nhớ được lập

DX:AX=vị trí con trỏ mới nếu cờ nhớ không được lập. Hàm 47h: Lây thư mục hiện thời. Đưa vào tên đường dẫn đầy đủ (bắt đầu từ thư mục gốc) của thư mục hiện

tại trong ổ đĩa cho trước vào vùng có địa chi DS:SI. Vào: AH=47h

DS:SI=con trỏ trỏ tới vùng nhớ 64 byte của người sử dụng. DL=SỐ hiệu ổ đĩa (0=mặc định, 1=A...)

Ra: DS:SI=tên đường dẫn đầy đủ từ gốc nếu cờ nhớ không được lạp AX=mã lỗi nếu cờ nhớ được lập.

Hàm 48h: Cấp phát bộ nhớ. Cấp phát bộ nhớ theo số paragraph yêu cầu. Vào: AH=48h

BX=SỐ paragraph yêu cầu Ra: AX:0=địa chí khối nhớ cấp phát

AX=mã lỗi nếu cờ nhớ được lập BX=kích thước của khối lớn nhất của bộ nhớ khả dụng nếu sự cấp phát không thành công.

Hàm 49: Giải phóng bộ nhớ đã cấp phát Giải phóng bộ nhớ cấp phát cho trước. Vào: AH=49h

ES=segment của khối nhớ được giải phóng

121

Page 122: Gt Ngon Ngu Lt Assembly

Ra: AX=mã lỗi nếu cờ nhó được lập không có nghĩa nếu cờ nhớ không được lập

Hàm 4Ch: Kết thúc chương trình (EXIT)

Kết thúc chương trình hiện tại vào trả điều khiển cho chương trình gọi nó. Vào: AH=4Ch

AL=mã trở về

Ra: không Ngắt 25h: Đọc tuyệt đối đĩa

Vào: AL=SỐ hiệu ổ đĩa

cx=số sector đọc DX=SỐ hiệu sector logic bắt đầu DS:BX=địa chỉ chuyển đến

Ra: Nếu thành công CF=0 Nếu không thành công CF=1 và AX chứa, mã lỗi .

Ngắt 26h: Ghi tuyệt đôi đĩa

Vào: AL=SỐ hiệu ổ đĩa

cx=số sector ghi DX=SỐ hiệu sector logic bắt đầu DS:BX=địa chỉ chuyển đi

Ra: Nếu thành công CF=0 Nếu không thành công CF=1 và AX chứa mã lỗi

Ngát 27h: Kết thúc chương trình và ỏ lại thương trú. Vào: DX=offset bắt đầu của vùng nhớ được giải phóng (không

giữ lại thường trú), segment là segment của PSP. Ra: không

122

Page 123: Gt Ngon Ngu Lt Assembly

TÀI L I Ệ U T H A M K H Ả O

1. Ytha Yu & Charles Marut, Lập trình hợp ngữ và máy vi tính IBM-PC. Biên dịch Quách Tuấn Ngọc - Đỗ Tiến Dũng - Nguyễn Quang Khải. 1998.

2. Văn Thế Minh, Kỹ thuật vi xử lý. 1997.

3. Đặng Thành Phu, Các bài lập lập trình bằng ngôn ngữ Assembly. 2001 4. Tống Vãn On-Hoàng Đức Hải, Hạp ngũ và lập trình ứng dụng. 2001 5. Đặng Thành Phu, Turbo Assembly và ứng dụng. 1998 6. Ngô Diên Tập, Lập trình bằng hợp ngữ. 1998 7. Nguyễn Minh San. cẩm nang lập trình. 1996 8. Nguyễn Mạnh Giang, Lập trình bằng ngôn ngữ Assembly cho máy tính

PC-IBM. 2000

123

Page 124: Gt Ngon Ngu Lt Assembly

M Ụ C LỤC

Lời giới thiệu 3 Lời nói đẩu 5

Chương ỉ. TỔ CHỨC CỦA BỘ VI XỬLÝ 8086 ì. Các dạng dữ liệu cơ bản cùa bộ vi xử lý 7 l i . Các bộ vi xử lý 80x86 của Itel 15 HI. Các thanh ghi của bộ vi xử lý 8086/8088 18 IV. Ngắt và phân loại ngắt 20 V. Các phép định địa chí 23 VI. Tệp lệnh bộ vi xử lý 8086/8088 26

Chương 2. LẬP TRÌNH BẰNG HỢP NGỮ ì. Giới thiệu hợp ngữ 49 l i . Cấu trúc của một chương trình hợp ngữ 54 IU. Các bước tạo và chạy chương trình 58 IV. Các cấu trúc lập trình cơ bàn thực hiện bằng hợp ngữ 60 V. Chương trình .EXE và .COM 67

Chương 3. LIÊN KẾT ASSEMBLY VỚI NGỒN NGỮ PASCAL ì. Assembly trong Pascal 75 l i . Viết tách biệt nhiều Modul (trên nhiều tệp) riêng lé 78

Chương 4. CÁC BÀI TOÁN LẬP TRÌNH ì. Các bài toán phần số học 84 l i . Bài toán về chuỗi 92 IU. Bài toán về thiết bị vào ra 97

Phụ lục. CÁC NGẮT CỦA BIOS VÀ DOS 104

Tài liệu tham khảo 123

124

Page 125: Gt Ngon Ngu Lt Assembly