Bài ging k thut vi x lý - GV. Ngô Công Thng Chương 3 Lp trình Assembly cho h vi x
- 20 -
CHƯƠNG 3 LP TRÌNH ASSEMBLY CHO H VI X
Trong chương trước chúng ta đã tìm hiu v cu trúc và tp lnh ca b vi x lý 8088.
Trong chương này chúng ta s tìm hiu cách lp trình Assembly cho các h vi xđược xây
dng trên b vi x lý 8088 (và h vi x lý Intel 80x86 nói chung). S dĩ ta dùng ngôn ng lp
trình Assembly để viết phn mm cho h vi x lý là vì nó có các ưu đim sau:
- S dng trc tiếp tp lnh ca b vi x lý nên quá trình điu hành chc năng rt sát vi
cu trúc phn cng ca h thng, tn dng trit để kh năng ca phn cng mà không mt
ngôn ng lp trình bc cao nào làm được.
- Có tc độ thc hin nhanh hơn nhiu so vi các ngôn ng bc cao. Do vy nó rt thích
hp vi các chc năng yêu cu thi gian thc chng hn như thao tác vi các tín hiu biến đổi
nhanh.
Các chương trình viết bng ngôn ng Assembly phi được dch ra ngôn ng máy (dng nh
phân) vì đây là dng duy nht mà h vi x lý có th hiu được. Có nhiu chương trình biên
dch nhưng thông dng nht hin nay Macro Assembler ca hãng Microsoft và Turbo
Assembler ca hãng Borland. Chúng ta s s dng Macro Assembler 6.0 để biên dch các
chương trình Assembly. Chương trình biên dch MASM 6.0 có rt nhiu file nhưng ti thiu
cn nhng file sau:
- MASM.EXE để biên dch chương trình sang ngôn ngy
- LINK.EXE để liên kết các chương trình và to ra mt chương trình chy được có đuôi exe.
- EXE2BIN để chuyn chương trình đuôi exe sang đuôi com.
I - KHUNG CHƯƠNG TRÌNH ASSEMBLY
1. B ký t ca Assembly
Mt ngôn ng bt k t ngôn ng giao tiếp ca con người ti ngôn ng máy tính đều xây
dng trên mt b ký t. Các ký t ghép li thành các t có nghĩa gi là t vng. Các t li
được viết thành các câu tuân theo cú pháp và ng pháp ca ngôn ng để din t hành động s
vic cn thc hin. B ký t ca Assembly gm có:
- Các ch cái latin: 26 ch hoa A-Z, 26 ch thường a-z.
- Các ch s thp phân: ‘0’ - ‘9’
- Các ký hiu phép toán, các du chm câu và các ký hiu đặc bit: + - * / @ ? $ , . : [ ] ( )
< > { } & % ! \ # v.v...
- Các ký t ngăn cách: space và tab
2. T khóa
T khóa là các t ca riêng Assembly như tên các thanh ghi, tên lnh dng gi nh ca b
vi x lý, tên toán t... Các t khóa này đòi hi người lp trình phi dùng đúng như Assembly
quy định. Các t khóa có th viết bng ch hoa hoc ch thường đều được.
3. Tên t đặt
Tên là mt dãy ký t dùng để biu th tên hng, tên biến, tên nhãn, tên chương trình con,
tên đon nh... Tên do người lp trình t đặt nhưng phi tuân theo quy tc sau:
Quy tc đặt tên: Tên ch gm ch cái, ch s và mt s ký t đặc bit như ? @ _ $ Ch đầu
ca tên bt buc phi là ch cái. Trong tên không có du cách. Tên có thi t 1 đến 35 ký
t.
4. Cu trúc mt lnh Assembly
Mt chương trình Assembly bao gm các dòng lnh, mt dòng lnh có th là mt lnh tht
dưới dng gi nh ca b vi x lý hoc mt hướng dn cho chương trình dch (assembler
directive, đôi khi gi là lnh gi). Lnh tht s được dch ra mã máy còn lnh gi thì không
Bài ging k thut vi x lý - GV. Ngô Công Thng Chương 3 Lp trình Assembly cho h vi x
- 21 -
được dch, vì nó ch có tác dng ch dn cho chương trình dch thc hin công vic. Ta có th
viết các dòng lnh bng ch hoa hoc ch thường đều được vì chúng được coi là tương đương
nhau.
Mt dòng lnh ca Assembly có th có nhng trường sau (không nht thiết phi có đủ các
trường):
Tên Mã lnh Các toán hng Chú gii
Ví d:
LAP: MOV AH,[BX] ; Copy ni dung ca ô nhđịa ch DS:BX vào AH
Dòng lnh trên có đủ 4 trường. Trường tên là nhãn LAP, trường mã lnh là lnh MOV,
trường toán hng là các thanh ghi AH và BX, trường chú gii đặt sau du chm phy
MAIN PROC
MAIN ENDP
Hai dòng lnh này là hai lnh gi, trường tên có tên th tc là MAIN, trường mã lnh
có lnh gi PROC và ENDP. Đây là hai lnh gi để bt đầu và kết thúc mt th tc có tên là
MAIN.
Trường tên
Trường tên có th là tên nhãn, tên biến hoc tên th tc (chương trình con). Các tên và
nhãn này s được trình biên dch gán bng các địa ch c th ca ô nh. Mt nhãn kết thúc
bng du hai chm (:).
Trường mã lnh
Cha các lnh tht hoc lnh gi
Trường toán hng
Đối vi các lnh tht thì trường này cha các toán hng ca lnh. Tùy tng loi lnh mà
th không có, có 1 hoc 2 toán hng trong mt lnh.
Đối vi các lnh gi thì trường này cha các thông tin khác liên quan đến lnh gi.
Trường chú gii
Li gii thích phi được bt đầu bng du chm phy. Trường chú gii dành cho người lp
trình để ghi các li gii thích cho các lnh ca chương trình, giúp cho người đọc chương
trình d hiu các thao tác ca chương trình ln. Khi đọc thy du chm phy, chương trình
dch b qua không dch t sau du chm phy đến hết dòng. Người lp trình có th li
dng đặc đim này để loi b mt dòng lnh nào đó trong chương trình.
5. Các dng hng dùng trong Assembly
- Hng s nh phân: gm mt dãy các ch s 0 và 1, kết thúc bng ch B. Ví d:
10011101B
- Hng s hex: gm mt dãy các s t 0 đến 9 và các ch cái t A đến F (a đến f), kết thúc
bng ch H. Đối vi các s bt đầu bng ch thì phi thêm 0 đằng trước để báo cho chương
trình dch biết đó là s không phi là tên. Ví d: 7AC5H, 0ABH
- Hng s thp phân: gm mt dãy các s t 0 đến 9, có hoc không có ch D theo sau. Ví
d: 34 hoc 34D.
- Hng ký t: là mt ký t bt k đặt gia hai du phy trên. Ví d: ‘A’
- Hng xâu ký t: là mt dãy ký t bt k đặt gia hai du phy trên. Ví d: ‘Nhap’
6. Khai báo biến và hng
a) Khai báo biến
Biến là tên ô nh dùng để ct gi d liu. Khai báo biến là đặt tên cho ô nh và xác định ô
nh có kích thước 1 byte, 1 t hay 1 t kép. Các tên biến s được trình biên dch gán cho mt
địa ch nht định trong b nh khi dch chương trình.
Khai báo biến kiu byte
Tên biến DB Giá tr khi đầu
Bài ging k thut vi x lý - GV. Ngô Công Thng Chương 3 Lp trình Assembly cho h vi x
- 22 -
Ví d:
B1 DB 4
Ví d trên định nghĩa biến kiu byte có tên là B1 và dành 1 byte b nh cho nó, trong byte
đó có cha giá tr 4.
Nếu không mun biến cha giá tr khi đầu ta có th dùng toán t ? vào v trí giá tr khi
đầu.
Ví d:
B2 DB ?
Ví d trên ch định nghĩa biến byte có tên là B2 và dành 1 byte b nh cho nó.
Khai báo biến kiu t
Tên biến DW Giá tr khi đầu
Ví d:
W1 DW 42H
Ví d này định nghĩa biến t có tên là W1 và dành 2 byte b nh cho nó, trong đó cha giá
tr khi đầu là 42H.
Mun biến không cha giá tr khi đầu ta dùng toán t ? và v trí giá tr khi đầu.
Ví d:
W2 DW ?
Khai báo biến kiu t kép
Tên biến DD Giá tr khi đầu
Ví d:
DW1 DD 1000
Khai báo biến mng
Biến mng là biến hình thành t mt dãy liên tiếp các phn t (ô nh) có cùng kiu byte t
hoc t kép. Khai báo biến mng là đặt tên cho mt dãy liên tiếp các byte t hoc t kép trong
b nh đồng thi cung cp các giá tr ban đầu tương ng. S phn t ca mng được xác định
qua s giá tr khi đầu.
Tên biến mng DB/DW/DD Các giá tr khi đầu
Ví d:
M1 DB 4,5,6,7,8,9
Ví d trên định nghĩa biến mng có tên là M1 và dành 6 byte liên tiếp cho nó để cha các
giá tr khi đầu tương ng là 4, 5 ,6 ,7 ,8 , 9. Phn t đầu ca mng là 4 và có địa ch trùng
vi địa ch ca tên biến (M1), phn t th hai là 5 và có địa ch là M1+1...
Khi chúng ta mun khi đầu các phn t ca mng vi cùng mt giá tr chúng ta có th
dùng thêm toán t DUP. Toán t DUP dùng để lp li các d liu vi s ln quy định. Cú
pháp: Count DUP(Các d liu) -> lp li các d liu vi s ln Count.
Ví d:
M2 DB 20 DUP(0)
M3 DB 20 DUP(?)
Ví d trên định nghĩa mt biến mng có tên là M2 gm 20 byte để cha 20 giá tr khi đầu
bng 0 và mt biến mng khác có tên là M3 gm 20 byte nhưng không cha giá tr khi đầu.
Chú ý:
+ Toán t DUP có th dùng lng nhau để định nghĩa 1 mng
Ví d:
M4 DB 4,3,2,2 DUP(1,2 DUP(5),6)
Bài ging k thut vi x lý - GV. Ngô Công Thng Chương 3 Lp trình Assembly cho h vi x
- 23 -
Khai báo này tương đương vi khai báo sau:
M4 DB 4,3,2,1,5,5,6,1,5,5,6
+ Đối vi các b vi x lý ca Intel, khi ta lưu tr mt t trong b nh thì byte thp ca nó
s được để ô nhđịa ch thp, byte cao để ô nhđịa ch cao.
Ví d:
W1 DW 0FFACH
khi đó byte thp ACH s được để ti địa ch W1, còn byte cao FFH s được để ti địa ch
tiếp theo W1+1.
Khai báo biến kiu xâu ký t
Biến kiu xâu ký t là trường hp đặc bit ca biến mng kiu byte, trong đó các phn t
ca mng là các ký t. Mt xâu ký t có th định nghĩa bng các ký t hoc bng mã ASCII
ca các ký t đó.
Ví d:
Xaukt DB ‘ABCDE’
hoc
Xaukt DB 41h,42h,43h,44h,45h
hoc
Xaukt DB 41h,42h,’C’,’D’,45h
b) Khai báo hng
Các hng trong chương trình Assembly được gán tên để làm cho chương trình d đọc hơn.
Hng có th là kiu s hoc kiu ký t. Vic gán tên cho hng được thc hin bng lnh gi
EQU như sau:
Tên hng EQU Giá tr ca hng
Ví d:
CR EQU 0Dh
LF EQU 0Ah
CHAO EQU ‘Hello’
Vì lnh gi EQU không dành ch ca b nh cho tên hng nên ta có th khai báo hng
bt k đâu trong chương trình. Tuy nhiên người ta thường đặt các khai báo hng trong đon
d liu.
7. Khung ca mt chương trình Assembly
Mt chương trình mã máy trong b nh thường bao gm các vùng nh khác nhau để cha
mã lnh, cha d liu ca chương trình và mt vùng nh đưc dùng làm ngăn xếp phc v
hot động ca chương trình. Chương trình viết bng ngôn ng Assembly cũng phi có cu
trúc tương t để khi dch nó s to ra mã máy có cu trúc như trên, tc là đon mã lnh s
được dch và để trong vùng nh mã lnh, đon d liu s được dch và để trong vùng nh d
liu và đon ngăn xếp s được dch và to ra vùng nh ngăn xếp cho chương trình.
Trước khi tìm hiu khung ca mt chương trình Assembly ta xem xét các khai báo có trong
chương trình:
a) Khai báo quy mô s dng b nh
Kích thước b nhnh cho đon mã và đon d liu trong mt chương trình được xác
định bng lnh gi .MODEL. Lnh này phi được đặt trước các lnh khác trong chương trình
nhưng đặt sau lnh gi khai báo loi CPU. Cú pháp:
.MODEL Kiu_kích_thước_b_nh
Kiu kích thước b nht
TINY Mã lnh và d liu gói gn trong mt đon 64 KB
SMALL Mã lnh gói gn trong mt đon 64 KB. D liu gói gn trong
W1
W1+1 FFH
ACH
Bài ging k thut vi x lý - GV. Ngô Công Thng Chương 3 Lp trình Assembly cho h vi x
- 24 -
mt đon 64 KB
MEDIUM Mã lnh không gói gn trong mt đon 64 KB
D liu gói gn trong mt đon 64 KB
COMPACT Mã lnh gói gn trong mt đon 64 KB
D liu không gói gn trong mt đon 64 KB
LARGE Mã lnh không gói gn trong mt đon 64 KB
D liu không gói gn trong mt đon 64 KB
Không có mng nào ln hơn 64 KB
HUGE Mã lnh không gói gn trong mt đon 64 KB
D liu không gói gn trong mt đon 64 KB
Các mng có th ln hơn 64 KB
b) Khai báo đon ngăn xếp
Vic khai báo đon ngăn xếp là để dành ra mt vùng nh đủ ln dùng làm ngăn xếp phc
v cho hot động ca chương trình. Cú pháp:
.STACK Kích_thước
Kích_thước quyết định s byte dành cho ngăn xếp. Thông thường vi 100 - 256 byte là đủ
để làm ngăn xếp và ta có th khai báo kích thước cho ngăn xếp như sau:
.STACK 100
hoc
.STACK 100H
c) Khai báo đon d liu
Đon d liu cha toàn b các khai báo biến và hng ca chương trình. Các khai báo trong
đon d liu đặt sau lnh gi .DATA
Ví d:
.DATA
MSG DB ‘Hello!$’
B1 DB 100
CR EQU 0DH
LF EQU 0AH
d) Khai báo đon mã
Đon mã cha mã lnh ca chương trình, tc là các lnh ca chương trình s viết đây. Để
bt đầu đon mã ta dùng lnh gi .CODE
Bên trong đon mã, các lnh ca chương trình có th t chc thành chương trình chính và
chương trình con như sau:
.CODE
Tên_CTChính PROC
;Các lnh ca chương trình chính
.
.
CALL Tên_CTCon ;Gi chương trình con
.
.
Tên_CTChính ENDP
;Khai báo các chương trình con đây
Tên_CTCon PROC
;Các lnh ca chương trình con