Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
50
CHNG VII: MNG VÀ CÁC LNH THAO TÁC CHUI
7.1 Mng mt chiu (chui)
7.1.1 Khai báo mng
Mng mt chiu gm mt chui liên tip các byte hay word trong b nh.
chng II ta ã tng s dng khai báo:
.DATA
ChuoiKT DB ‘KHOA CONG NGHE THONG TIN$’
Thc cht khai báo này s chim mt vùng 25 ô nh trong n d liu và t vào ó
các kí t tng ng:
‘K’
‘H’
‘O’
‘A’
‘ ’
‘C’
…
Cách khai báo nh trên tng ng vi cách khai báo sau ây:
.DATA
ChuoiKT DB ‘K’, ‘H’, ‘O’, ‘A’, ‘CONG’, ‘NGHE’, ‘THONG TIN$’
Và cng tng ng vi:
.DATA
ChuoiKT DB 4Bh, 48h, 4Fh, 41h, ‘CONG’, ‘NGHE’, ‘THONG TIN$’
Các khai báo ó c gi là khai báo lit kê, tc là s to ra trong b nh mt mng có
lng phn t xác nh, ng thi khi to luôn giá tr cho tng phn t. Di ây s
cp ti các phng pháp khai báo tng quát.
a) Khai báo mng Byte:
Mng Byte là mng mà mi phn t có kích thc 1 byte.
Cách 1: <Tên mng> DB <lit kê các phn t ca mng>
Ví d:
A DB 10h, 12h, 30, 40
Khai báo trên to ra mng A có 4 phn t, mi phn t chim 1 byte nh.
Cách 2: <Tên mng> DB <S phn t ca mng> DUP (Giá tr khi to)
Ví d 1:
A DB 50 DUP (0)
Khai báo trên to ra mng A có 50 phn t, giá tr ban u ca các phn t bng 0.
Ví d 2:
B DB 100 DUP (?)
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
51
Khai báo trên to ra mng B có 100 phn t, không khi to giá tr ban u cho các
phn t.
b) Khai báo mng Word:
Mng Word là mng mà mi phn t có kích thc 1 word.
Cách 1: <Tên mng> DW <lit kê các phn t ca mng>
Cách 2: <Tên mng> DW <S phn t ca mng> DUP (Giá tr khi to)
Ví d 1:
A DW 10h, 12h, 30, 40
Khai báo trên to ra mng A có 4 phn t, mi phn t dài 16 bít.
Ví d 2:
B DW 50 DUP (?)
7.1.2 Các phn t ca mng mt chiu
Tên mng chính là mt bin ng vi phn tu tiên ca mng. Các phn t tip theo
có thc xác nh bng cách ly a ch phn tng trc cng vi kích thc ca
nó.
Ví d 1:
M DB 10, 20, 30, 40
Các phn t ca mng có th kí hiu nh sau (chú ý: kích thc ca mi phn t trong
ng này là 1 byte):
Kí hiu Giá tr
Phn t 1 M 10
Phn t 2 M + 1 20
Phn t 3 M + 2 30
Phn t 4 M + 3 40
Ví d 2:
N DW 1, 6, 20, 10, 15
Các phn t ca mng có th kí hiu nh sau (chú ý: kích thc ca mi phn t trong
ng này là 2 byte):
Kí hiu Giá tr
Phn t 1 N 1
Phn t 2 N + 2 6
Phn t 3 N + 4 20
Phn t 4 N + 6 10
Phn t 5 N + 8 15
Ví d 3:
Cho mng A gm 12 phn t, các phn t có kiu là Byte. Hãy i ch phn tu
tiên và phn t cui cùng ca mng cho nhau.
Gii:
Phn tu tiên là: A
Phn t cui cùng là: A + 11
MOV AL, A
MOV BL, A + 11
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
52
MOV A, BL
MOV A+11, AL
7.1.3 Các cha ch
Vic truy nhp trc tip ti các phn t ca mng thông qua cách vit:<Tên mng> +
<Khong cách> (nh trong phn 7.1.2) gây rt nhiu bt tin trong lp trình. Mt phng
pháp khác, mm do hn, là s dng các thanh ghi cha <Khong cách> hoc cha
a ch ca tng phn t. Bng vic thay i ni dung các thanh ghi có th truy nhp
vào các phn t khác nhau ca mng.
Các thanh ghi có thc s dng là BX, BP, SI, DI.
a) Dùng thanh ghi cha a ch ca phn t:
Gi s thanh ghi SI ang cha a ch offset ca mt ô nh nào ó, cách vit: [SI] s
tr v ni dung ca ô nhó.
Nu s dng các thanh ghi BX, DI và SI cha a ch offset thì a ch segment s
c cha trong DS. Còn nu s dng thanh ghi BP thì SS s cha segment.
Ví d:
Cho mng sau:
A DB 10, 12, 3, 4, 9, 5, 7, 6
Hãy tính tng các phn t ca mng (ct tng vào AL).
Gii:
Ta s s dng thanh ghi SI ln lt tr ti tng phn t ca mng thc hin phép
tính tng.
XOR AL, AL ;Xoá AL chun b cha tng
LEA SI, A ;SI cha a ch offset phn tu tiên ca mng
MOV CX, 8 ;S ln lp (mng có 8 phn t)
Lap:
ADD AL, [SI] ;Cng phn t ca mng vào AL
INC SI ;SI tr ti phn t tip theo
LOOP Lap
Cách vit nh trên c gi là Cha ch gián tip thanh ghi.
b) Dùng thanh ghi cha <Khong cách>
Trong phng pháp này, mun truy nhp vào mt phn t ca mng thì cn phi bit
c <Khong cách> t phn tó ti u mng. Các phn t ca mng sc kí hiu
nh sau:
<Tên mng> [Thanh ghi]
Trong ó Thanh ghi s cha <Khong cách> ca phn t tính tu mng.
Ví d 1:
Kí hiu: A[BX]
A: là tên mng
BX: là thanh ghi cha <Khong cách>. Nu BX = 0 thì A[BX] chính là phn tu tiên
a mng.
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
53
Ví d 2:
Ta s vit li n chng trình phn a bng mt cách khác.
Cho mng sau:
A DB 10, 12, 3, 4, 9, 5, 7, 6
Hãy tính tng các phn t ca mng (ct tng vào AL).
Gii:
XOR AL, AL ;Xoá AL chun b cha tng
XOR BX, BX ;<Khong cách> = 0: phn tu tiên ca mng
MOV CX, 8 ;S ln lp (mng có 8 phn t)
Lap:
ADD AL, A[BX] ;Cng phn t ca mng vào AL
INC BX ;tng <Khong cách> tr ti phn t tip theo
LOOP Lap
Ngoài cách kí hiu A[BX] còn có th s dng các kí hiu khác tng ng nh [A +
BX], [BX + A], A + [BX], [BX] + A.
Nu s dng các thanh ghi BX (Base Register) hay BP (Base Pointer) trong cách vit
trên thì gi là Ch a ch c s, còn nu s dng SI (Source Index) hay DI
(Destination Index) thì gi là Cha ch ch s.
7.2 Các lnh thao tác vi chui
Nhã nói phn trc, khi khai báo mng mt chiu thì nó s chim mt chui liên
tip các byte hay word trong n d liu. Mun truy nhp vào các ô nh trong n d
liu cn phi xác nh c a ch segment và offset ca chúng.
a ch segment ca d liu c cha trong thanh ghi DS. Trong các thao tác gia hai
ng d liu khác nhau, ngi ta thng s dng thêm thanh ghi n ES (Extra
Segment) cha segment ca các ô nh.
a ch offset có thc cha trong nhiu thanh ghi khác nhau. Trong các lnh thao
tác vi chui sp trình bày, có hai cp thanh ghi hay c s dng là DS:SI và ES:DI.
Ngha là: Nu dùng DS cha segment thì SI s cha offset, và nu ES cha segment
thì DI s cha offset.
ES cng cha a ch ca n d liu ging nh DS thì u ca chng trình
chính phi có các lnh:
MOV AX, @DATA
MOV DS, AX
MOV ES, AX
7.2.1 Lnh chuyn chui (Moving a String)
Lnh này còn c gi là lnh sao chép chui.
a) Chuyn mt ln:
Cú pháp lnh:
ng 1: MOVSB
Lnh trên sao chép 1 byte d liu t ô nh có a ch DS:SI sang ô nh có a ch
ES:DI.
ng 2: MOVSW
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
54
Lnh trên sao chép 1 word d liu t ô nh có a ch DS:SI sang ô nh có a ch
ES:DI.
Ví d 1:
Xét hai chui c khai báo nh sau:
.DATA
Chuoi1 DB ‘Khoa CNTT$’
Chuoi2 DB 10 DUP (?)
Hãy sao chép ni dung ca Chuoi1 sang Chuoi2.
Gii:
thc hin yêu cu trên ta s ln lt sao chép tng byte ca Chuoi1 sang Chuoi2.
‘K’ DS:SI
Chuoi1 ‘h’
10 byte ‘o’
‘a’
‘ ’
‘C’
‘N’
‘T’
‘T’
‘$’
? ES:DI
Chuoi2 ?
10 byte
Mun sao chép byte u tiên (kí t ‘K’) thì DS:SI phi cha a chu ca Chuoi1,
ES:DI phi cha a chu ca Chuoi2. u này c thc hin bi các lnh sau:
LEA SI, Chuoi1 ;SI cha offset ca Chuoi1
LEA DI, Chuoi2 ;DI cha offset ca Chuoi2
MOVSB ;Chuyn 1 byte
Mi chui có dài 10 byte nên phi lp li quá trình trên 10 ln thì mi sao chép
xong.
• u ý:
+ Mi khi sao chép xong 1 byte thì phi tng SI và DI lên 1 nó tr ti ô nh tip theo.
Sau mi lnh MOVSB thì SI và DI sc tng tng lên 1 nu c DF = 0 (SI và DI s
ng gim i 1 nu c DF = 1). Nh vy vn là phi xoá c c DF trc khi thi
hành lnh MOVSB. u này c thc hin nh lnh CLD (Clear Direction Flag):
LEA SI, Chuoi1 ;SI cha offset ca Chuoi1
LEA DI, Chuoi2 ;DI cha offset ca Chuoi2
CLD ;Xoá cnh hng: DF = 0
MOVSB ;Chuyn 1 byte
+ Ngc li vi lnh CLD là lnh STD (Set Direction Flag), lnh này s thit lp c
DF=1. Ta có th s dng lnh STD chuyn các byte d liu theo chiu ngc li.
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
55
Chng trình y nh sau:
TITLE Vi du Chuoi
.MODEL SMALL
.STACK 100H
.DATA
Chuoi1 DB Khoa CNTT$
Chuoi2 DB 10 DUP (?)
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV ES, AX ;DS và ES cha segment ca n d liu
MOV CX, 10 ;S ln lp
LEA SI, Chuoi1 ;SI cha offset ca Chuoi1
LEA DI, Chuoi2 ;DI cha offset ca Chuoi2
CLD ;Xoá cnh hng: DF = 0
Lap:
MOVSB ;Thc hin lp 10 ln
LOOP Lap
MOV AH, 9h ;Hin th chui 2 kim tra kt qu
LEA DX, Chuoi2
INT 21h
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
Ví d 2:
Làm li ví d 1 bng cách dùng lnh MOVSW.
Gii:
Do lnh MOVSW mi ln sao chép c 2 byte nên ch phi thc hin lp 5 ln, các
nh c th nh sau:
MOV CX, 5 ;S ln lp
LEA SI, Chuoi1 ;SI cha offset ca Chuoi1
LEA DI, Chuoi2 ;DI cha offset ca Chuoi2
CLD ;Xoá cnh hng: DF = 0
Lap:
MOVSW ;Thc hin lp 5 ln
LOOP Lap
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
56
b) Chuyn nhiu ln:
Các lnh MOVSB và MOVSW mi ln ch chuyn c 1 byte hay 1 word, do ó khi
n chuyn nhiu d liu thì phi s dng vòng lp, u này làm chng trình phc tp
thêm. Thay vì s dng vòng lp, ta có th s dng các lnh chuyn nhiu ln di ây.
Cú pháp lnh:
ng 1: REP MOVSB
Lnh trên sao chép nhiu byte d liu t ô nh có a ch DS:SI sang ô nh có a ch
ES:DI, s byte cn chuyn cha trong thanh ghi CX.
ng 2: REP MOVSW
Lnh trên sao chép nhiu word d liu t ô nh có a ch DS:SI sang ô nh có a ch
ES:DI, s word cn chuyn cha trong thanh ghi CX.
Ví d:
thc hin vic sao chép ni dung ca Chuoi1 sang Chuoi2 trong ví d trc, ta có
th vit li các lnh nh sau:
MOV CX, 10 ;S byte cn chuyn
LEA SI, Chuoi1 ;SI cha offset ca Chuoi1
LEA DI, Chuoi2 ;DI cha offset ca Chuoi2
CLD ;Xoá cnh hng: DF = 0
REP MOVSB
hoc:
MOV CX, 5 ;S word cn chuyn
LEA SI, Chuoi1 ;SI cha offset ca Chuoi1
LEA DI, Chuoi2 ;DI cha offset ca Chuoi2
CLD ;Xoá cnh hng: DF = 0
REP MOVSW
7.2.2 Lnh chuyn d liu t thanh ghi vào chui (Store a String)
Lnh này còn c gi là lnh lu chui.
Cú pháp lnh:
ng 1: STOSB
Lnh trên chuyn ni dung ca thanh ghi AL (1 byte) ti ô nh có a ch ES:DI.
ng 2: STOSW
Lnh trên chuyn ni dung ca thanh ghi AX (2 byte) ti ô nh có a ch ES:DI.
Ví d 1:
Xét chui sau ây:
.DATA
ChuoiKT DB 6 DUP (?)
Hãy nhp mt kí t t bàn phím ri t kí tó vào phn tu tiên ca chui.
Gii:
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
57
Ta s s dng chc nng s 1 ca ngt 21h nhp kí t, thanh ghi AL s cha mã
ASCII ca kí tó. Mun chuyn kí t t AL vào phn tu tiên ca chui bng lnh
STOSB thì ES:DI phi cha a chu ca ChuoiKT, u ó c thc hin nh lnh
sau:
LEA DI, ChuoiKT ;DI cha offset ca ChuoiKT
Chng trình y :
TITLE Vi du Chuoi
.MODEL SMALL
.STACK 100H
.DATA
ChuoiKT DB 6 DUP (?)
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV ES, AX ;DS và ES cha segment ca n d liu
MOV AH, 1 ;Chc nng nhp kí t ca ngt 21h
INT 21h
LEA DI, ChuoiKT ;DI cha offset ca ChuoiKT
STOSB ;Chuyn kí t t AL vào u chui
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
Ví d 2:
Nhp mt chui kí 10 t t bàn phím.
Gii:
nhp 10 kí t và ct nó vào mt chui trong b nh ta vn s dng phng pháp
nh ví d 1. Có mt sm khác bit nh sau:
+ Phi có mt vòng lp vi s ln lp bng 10.
+ Sau mi lnh lu chui (STOSB) thì DI phi c tng lên 1 tr ti ô nh tip theo.
u này c thc hin nh lnh xoá cnh hng (CLD).
Chng trình y :
TITLE Vi du 2
.MODEL SMALL
.STACK 100H
.DATA
ChuoiKT DB 10 DUP (?)
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
58
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV ES, AX ;DS và ES cha segment ca n d liu
MOV CX, 10 ;S ln lp bng 10
LEA DI, ChuoiKT ;DI cha offset ca ChuoiKT
CLD ;Xoá cnh hng: DF = 0
Lap:
MOV AH, 1 ;Chc nng nhp kí t ca ngt 21h
INT 21h
STOSB ;Chuyn kí t t AL vào u chui
;DI c tng tng lên 1
LOOP Lap
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
7.2.3 Lnh chuyn d liu t chui vào thanh ghi (Load a String)
Lnh này còn c gi là lnh np chui.
Cú pháp lnh:
ng 1: LODSB
Lnh trên chuyn 1 byte d liu t ô nh có a ch DS:SI vào thanh ghi AL.
ng 2: LODSW
Lnh trên chuyn 1 word d liu t ô nh có a ch DS:SI vào thanh ghi AX.
Ví d:
Xét chui sau ây:
.DATA
ChuoiKT DB ‘Viet Nam’
Hãy hin th chui ra màn hình.
Gii:
Vì chui không kt thúc bng du ‘$’ nên không th hin chui bng chc nng s 9
a ngt 21h. Ta s cho hin ln lt các kí t ca chui bng chc nng s 2 ca ngt
21h (các tham s: AH = 2, DL = Mã ASCII ca kí t cn hin th). Chui có 8 kí t nên
n 8 ln lp.
u tiên cn chuyn tng kí t t chui vào thanh ghi AL bng lnh LODSB, sau ó
chuyn t AL sang DL, ri gi chc nng s 2 ca ngt 21h.
Chng trình y :
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
59
TITLE Vi du
.MODEL SMALL
.STACK 100H
.DATA
ChuoiKT DB Viet Nam
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX ;DS cha segment ca n d liu
MOV CX, 8 ;S ln lp bng 8
LEA SI, ChuoiKT ;SI cha offset ca ChuoiKT
CLD ;Xoá cnh hng: DF = 0
Lap:
LODSB ;Chuyn kí t t chui vào AL
;SI c tng tng lên 1 (
;tr ti kí t tip theo)
MOV DL, AL ;Chuyn kí t vào DL
MOV AH, 2 ;Hin th kí t
INT 21h
LOOP Lap
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN