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

Bài giảng hợp ngữ - Chương 2 pot

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

Bài ging hp ng Chng II: Các lnh c bn ca hp ng
15
CHNG II: CÁC LNH C BN CA HP NG
2.1 Cu trúc chng trình
2.1.1 Ví d
 có cái nhìn tng quát v mt chng trình hp ng, ta xét ví d sau ây:
TITLE VI DU 1
.MODEL SMALL
.STACK 100H
.DATA
A DB 4
B DB 6
C DB ?
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV AL, A
ADD AL, B
MOV C, AL
MOV AX, 4C00H
INT 21H
MAIN ENDP
END MAIN
Bc u ta cha cn quan tâm ti ý ngha ca các lnh mà ch cn quan tâm ti b
c ca chung chng trình, các t khoá c bn, cách vit các câu lnh
2.1.2 Gii thích
Nhìn chung, cu trúc ca mt chng trình hp ng có 3 phn: Phn tên, phn khai
báo và phn mã lnh.
a) Phn tên
Tên chng trình c vit sau t khoá TITLE u chng trình. Tên có th cha


u cách và các kí tc bit khác. Thông thng phn tên s cho ta bit mc ích,
nhim v hoc ni dung tóm tt ca chng trình.
Ví d: TITLE VI DU 1
b) Phn khai báo
Trong hp ng có nhiu ni dung cn phi khái báo nh kiu b nh, ngn xp, bin,
ng
• Khai báo kiu b nh
Kiu b nhc vit sau t .MODEL. Kiu b nh s quy nh kích thc ca n
mã và d liu trong chng trình.
Trong chng trình  phn 2.1.1, kiu b nh là SMALL, ngha là kiu b nh nh,
mã lnh s nm trong 1 n nh, d liu nm trong 1 n nh. Ngoài kiu SMALL còn
có nhiu kiu b nh khác:
MEDIUM Mã lnh chim nhiu hn 1 n
 liu trong 1 n
COMPACT Mã lnh trong 1 n
Bài ging hp ng Chng II: Các lnh c bn ca hp ng
16
 liu chim nhiu hn 1 n
LARGE Mã lnh chim nhiu hn 1 n
 liu chim nhiu hn 1 n
Không có mng nào ln hn 64 KB
HUGE Mã lnh chim nhiu hn 1 n
 liu chim nhiu hn 1 n
Các mng có th ln hn 64 KB
• Khai báo kích thc ngn xp
Kích thc ngn xp c vit sau t .STACK
Ví d: .STACK 100H
Khí ó kích thc vùng b nh dùng làm ngn xp là 100H Bytes (các vn  v
ngn xp s trình bày k trong chng 6)
• Khai báo d liu

Khai báo d liu c vit sau t .DATA. Các bin ca chng trình sc khai báo
 phn này.
Ví d 1: A DB 4
Trong ó: A là tên bin, DB là kiu d liu (bin kiu DB s có kích thc 1 byte), 4 là
giá tr ban u ca bin.
Ví d 2: B DW ?
Trong ví d này, bin B s có kiu là DW (1 Word) và không có giá tr khi to.
Khai báo hng:
Ví d: H EQU 2Bh
ng H s nhn giá tr bng 2Bh.
Quy tc t tên (Bin, hng, nhãn, th tc):
+ Tên có chiu dài ti a 31 kí t.
+ Có th cha ch cái, ch s và các kí tc bit (? . @ _ $ %).
+ Không c bt u bng s.
+ Nu dùng du chm thì nó phi ng u tiên.
+ Tên không c cha du cách.
Nói chung, trong hp ng không phân bit ch hoa và ch thng.
c) Phn mã lnh
Phn này bao gm các th tc c vit sau t .CODE. Trong s các th tc này phi
chn mt th tc làm chng trình chính, tên ca th tc ó c vit sau t END  cui
chng trình. Tên chng trình chính thng t là MAIN, cng có th chn mt tên
khác.
• u trúc mt th tc:
<Tên th tc> PROC
Lnh 1
Lnh 2
Lnh 3

<Tên th tc> ENDP
Bài ging hp ng Chng II: Các lnh c bn ca hp ng

17
• u trúc chung ca phn mã lnh:
.CODE
<Tên chng trình chính> PROC
Lnh 1
Lnh 2
Lnh 3

<Tên chng trình chính> ENDP
Các th tc khác
END <Tên chng trình chính>
2.2 Mt s lnh thng dùng
2.2.1 Cu trúc câu lnh hp ng
Mt câu lnh hp ng có th chia làm 2 phn: Tên lnh và các toán hng. Tên lnh vit
trc, các toán hng vit sau. Nu có nhiu toán hng thì chúng c phân cách vi nhau
ng du phy (,).
<Tên lnh> <Toán hng 1> [, <Toán hng 2> ] [;Li chú thích]
Ngoài ra có th vit thêm các li chú thích  làm rõ ý ngha câu lnh. Li chú thích
c bt u bng du chm phy (;).
Ví du:
MOV DS, AX ;Chuyn ni dung ca thanh ghi AX vào thanh ghi DS
MOV là tên lnh.
DS và AX là các toán hng.
• u ý: Các lnh c trình bày trong tài liu này hu ht thuc tp lnh ca b vi x
lý 8086, tr mt s trng hp s có chú thích riêng.
2.2.2 Mt s lnh thng dùng
a) Lnh MOV (Move)
Lnh này c s dng  chuyn d liu gia các thanh ghi hay ô nh.
Cú pháp lnh:
MOV <ích>, <Ngun>

ích>: là mt thanh ghi hay mt ô nh
<Ngun>: là mt thanh ghi, mt ô nh, hoc mt hng s
 liu sc chuyn t Ngun vào ích (ni dung ca Ngun không thay i sau khi
chuyn).
Ví d 1:
MOV AX, 4C00h
nh trên chuyn giá tr 4C00h vào thanh ghi AX.
Ví d 2:
MOV AL, A
nh trên chuyn giá tr ca bin A vào thanh ghi AL.
Chú ý:
• Không c chuyn trc tip ni dung ca hai thanh ghi n cho nhau.
Bài ging hp ng Chng II: Các lnh c bn ca hp ng
18
Ví d: MOV CS, DS
nh trên b sai do c CS và DS u là thanh ghi n. Mun thc hin c u này
thì phi s dng mt bin hay mt thanh ghi khác làm trung gian:
Ví d: MOV AX, DS ; dùng AX làm trung gian
MOV CS, AX
• Không c chuyn trc tip ni dung ca hai bin cho nhau.
Ví d: MOV A, B Lnh này không thc hin c
• Không c chuyn trc tip mt hng s vào mt thanh ghi n.
Ví d: MOV DS, 2000h
Nói chung, mun khc phc các trng hp nêu trên trên thì ta u phi s dng
trung gian.
b) Lnh XCHG (Exchange)
Lnh này dùng  hoán i d liu d liu gia hai toán hng.
Cú pháp lnh:
MOV <Toán hng 1>, <Toán hng 2>
Các toán hng có th là thanh ghi công dng chung, hoc mt thanh ghi công dng chung

và mt ô nh.
Ví d 1:
XCHG AX, BX ;hoán i ni dung ca AX và BX
c) Lnh ADD và SUB (Subtract)
Cú pháp lnh:
ADD <ích>, <Ngun>
SUB <ích>, <Ngun>
ích>: là mt thanh ghi hay mt ô nh
<Ngun>: là mt thanh ghi, mt ô nh, hoc mt hng s
ích>,<Ngun> không ng thi là hai ô nh.
nh ADD s thc hin phép cng ích vi Ngun, kt qu cha trong ích.
nh SUB s ly ích tri Ngun, kt qu cha trong ích.
Ví d:
ADD AX, 10 ;Tng ni dung ca thanh ghi AX lên 10
ADD BX, AX ;Cng ni dung 2 thanh ghi AX và BX, tng ct vào BX
SUB AX, B ;Tr ni dung thanh ghi AX cho bin B.
d) Lnh INC (Increment) và DEC (Decrement)
Cú pháp lnh:
INC <ích>
DEC <ích>
ích>: là mt thanh ghi hay mt ô nh
nh INC s tng ích lên 1 (cng ích vi 1).
nh DEC s gim ích i 1 (trích cho 1).
Ví d:
INC AH ;Cng ni dung ca thanh ghi AH vi 1
DEC B ;Tr giá tr ca bin B cho 1
Bài ging hp ng Chng II: Các lnh c bn ca hp ng
19
e) Lnh NEG (Negartive)
Cú pháp lnh:

NEG <ích>
ích>: là mt thanh ghi hay mt ô nh.
nh này có tác dng i du toán hng ích.
Ví d:
NEG AL
2.3 Nhp xut d liu
2.3.1 Chng trình ngt
Chng trình ngt là nhng chng trình con ã c vit sn nhm thc hin nhng
chc nng c bn khi thao tác vi máy tính. Các chng trình con này c phân phi
kèm theo các phn mm u khin h thng nh BIOS, Hu hành. Mi chng trình
có mt s hiu riêng (0, 1, 2, ). Khi lp trình ta có th s dng các chng trình con có
n này bng cách dùng lnh INT (interrupt).
Cú pháp lnh: INT <S hiu ngt>
Ví d 1:
INT 21h
nh trên s gi thc hin chng trình ngt s 21h (ây là s hiu ngt hay s dng nht
a DOS).
Ví d 2:
INT 13h
nh trên s gi thc hin chng trình ngt s 13h (ây là s hiu ngt ca BIOS, dùng
 thao tác vi a t).
Chi tit v các ngt và chng trình x lý ngt s trình bày trong chng 8.
2.3.2 Chc nng nhp - xut ca ngt 21h
Ngt 21h ca DOS cung cp rt nhiu chc nng khác nhau, mi chc nng cng có
t s hiu riêng (0, 1, 2, ). Trong phn này ta ch quan tâm ti chc nng nhp - xut
 liu.
Cách s dng ngt 21h: Trc khi gi ngt cn xác nh c s hiu chc nng, s
hiu ó c t vào thanh ghi AH. Ngoài ra cng cn quan tâm ti các tham s khác
(chng trình ngt s s dng thanh ghi nào? Giá tr ca chúng bng bao nhiêu? )
a) Chc nng hin mt kí t ra màn hình

ây là chc nng s 2 ca ngt 21h. Các tham s cn thit  gi ngt nh sau:
Vào: AH = 2
DL = Mã ASCII ca kí t cn hin th
Ra: AL cha mã ASCII ca kí t hin th
Ví d 2: Hin kí t ‘M’ ra màn hình
MOV AH, 2
MOV DL, ‘M’
INT 21h
Sau ây là chng trình y :
Bài ging hp ng Chng II: Các lnh c bn ca hp ng
20
TITLE HIEN KI TU
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AH, 2 ;Chc nng s 2
MOV DL, ’M’ ;Kí t cn hin th
INT 21h ;Gi ngt
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
Ta có th s dng mã ASCII ca kí t hoc vit trc tip kí t gia 2 du nháy n
nh trong chng trình trên (nói chung, các kí t và chui kí t trong hp ng phi có
u nháy n  2 u).
Ngoài chc nng s 2, trong chng trình trên còn s dng chc nng s 4Ch ca ngt
21h. Chc nng này có tác dng kt thúc chng trình và tr li quyn u khin cho h
u hành DOS.
b) Chc nng hin mt chui kí t ra màn hình

ây là chc nng s 9 ca ngt 21h. Các tham s cn thit  gi ngt nh sau:
Vào: AH = 9
DX = a ch offset ca vùng nh cha chui kí t
Ví d:
Hin ra màn hình dòng ch: KHOA CONG NGHE THONG TIN
Gii:
TITLE HIEN CHUOI KT
.MODEL SMALL
.STACK 100H
.DATA
ChuoiKT DB ’KHOA CONG NGHE THONG TIN$’
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV AH, 9 ;Chc nng s 9
LEA DX, ChuoiKT ;Ly a ch chui kí tt vào DX
INT 21h ;Gi ngt
MOV AH, 4Ch ;Kt thúc
INT 21h
Bài ging hp ng Chng II: Các lnh c bn ca hp ng
21
MAIN ENDP
END MAIN
Trong chng trình trên có mt sm cn lu ý:
• Chui kí t cn hin th phi c kt thúc bng du $.
• u trong chng trình có s dng khai báo d liu .DATA thì u ca chng
trình chính phi có các lnh:
MOV AX, @DATA
MOV DS, AX

c ích là t a ch segment ca n d liu vào thanh ghi DS.
• Chng trình trên có s dng lnh LEA (Load Effective Address). Cú pháp lnh
nh sau:
LEA <ích>, <Ngun>
ích>: là mt thanh ghi công dng chung.
<Ngun>: là mt ô nh.
nh này s ly a ch offset ca Ngun t vào ích.
c) Chc nng nhp mt kí t t bàn phím
ây là chc nng s 1 ca ngt 21h. Các tham s cn thit  gi ngt nh sau:
Vào: AH = 1
Ra: AL cha mã ASCII ca kí t
Các lnh c th nh sau:
MOV AH, 1
INT 21h
Khi gp các lnh trên, chng trình s dng li ch ta gõ mt kí t t bàn phím, mã
ASCII ca kí tó sc ct trong thanh ghi AL.
Ví d:
Nhp mt kí t thng t bàn phím, i nó thành kí t in hoa ri hin ra màn hình.
Gii:
TITLE DOI KI TU
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AH, 1 ;Chc nng s 1: Nhp mt kí t
INT 21h
SUB AL, 20h ;i kí t sang in hoa
MOV AH, 2 ;Chc nng s 2: Hin kí t
MOV DL, AL
INT 21h

MOV AH, 4Ch ;Kt thúc
Bài ging hp ng Chng II: Các lnh c bn ca hp ng
22
INT 21h
MAIN ENDP
END MAIN
Gii thích: Mã ASCII ca kí t thng ln hn kí t in hoa tng ng là 20h. Mun
chuyn t kí t thng thành in hoa thì ch vic ly mã ASCII ca nó tri 20h.
2.4 Cách chy mt chng trình hp ng
 có th chy mt chng trình hp ng thì trc ht phi biên dch nó thành file thi
hành (EXE, COM). Có nhiu công c biên dch khác nhau do nhiu hãng phn mm sn
xuát. Ta s s dng b công c MASM (Microsoft Macro Assembler) ca hãng
MicroSoft vì nó khá nh gn và d dùng.  bt u thì ta ch cn ti hai file:
MASM.EXE và LINK.EXE. Các bc thc hin nh sau:
• c 1:
Son tho ni dung chng trình bng mt công c son tho text bt kì, ct vào file
i phn m rng là ASM.
Ví d: tên file là Baitap.asm
• c 2:
ch file ASM thành file OBJ bng công c MASM.EXE. Gõ lnh nh sau:
MASM Baitap; (Enter)
(file MASM.EXE và file Baitap.asm nên  cùng mt th mc)
u dch thành công (chng trình không có li) thì ta s thu c file Baitap.obj.
u chng trình b li thì phi sa, sau ó tin hành dch li.
• c 3:
 dng công c LINK.EXE  liên kt các file OBJ thu c  bc 2 thành file thi
hành c (EXE). Vì trong ví d này ch có 1 file OBJ nên cách gõ lnh nh sau:
LINK Baitap; (Enter)
(file LINK.EXE cng  cùng th mc nói trên)
Bài ging hp ng Chng II: Các lnh c bn ca hp ng

23
Ta s thu c file Baitap.exe.  chy file này ch vic gõ lnh:
Baitap (Enter)

×