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

Bài giảng hợp ngữ - Chương 7 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 (111.98 KB, 10 trang )

Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
50
CHNG VII: MNG VÀ CÁC LNH THAO TÁC CHUI
7.1 Mng mt chiu (chui)
7.1.1 Khai báo mng
Mng mt chiu gm mt chui liên tip các byte hay word trong b nh.
 chng II ta ã tng s dng khai báo:
.DATA
ChuoiKT DB ‘KHOA CONG NGHE THONG TIN$’
Thc cht khai báo này s chim mt vùng 25 ô nh trong n d liu và t vào ó
các kí t tng ng:
‘K’
‘H’
‘O’
‘A’
‘ ’
‘C’

Cách khai báo nh trên tng ng vi cách khai báo sau ây:
.DATA
ChuoiKT DB ‘K’, ‘H’, ‘O’, ‘A’, ‘CONG’, ‘NGHE’, ‘THONG TIN$’
Và cng tng ng vi:
.DATA
ChuoiKT DB 4Bh, 48h, 4Fh, 41h, ‘CONG’, ‘NGHE’, ‘THONG TIN$’
Các khai báo ó c gi là khai báo lit kê, tc là s to ra trong b nh mt mng có
 lng phn t xác nh, ng thi khi to luôn giá tr cho tng phn t. Di ây s
 cp ti các phng pháp khai báo tng quát.
a) Khai báo mng Byte:
Mng Byte là mng mà mi phn t có kích thc 1 byte.
Cách 1: <Tên mng> DB <lit kê các phn t ca mng>
Ví d:


A DB 10h, 12h, 30, 40
Khai báo trên to ra mng A có 4 phn t, mi phn t chim 1 byte nh.
Cách 2: <Tên mng> DB <S phn t ca mng> DUP (Giá tr khi to)
Ví d 1:
A DB 50 DUP (0)
Khai báo trên to ra mng A có 50 phn t, giá tr ban u ca các phn t bng 0.
Ví d 2:
B DB 100 DUP (?)
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
51
Khai báo trên to ra mng B có 100 phn t, không khi to giá tr ban u cho các
phn t.
b) Khai báo mng Word:
Mng Word là mng mà mi phn t có kích thc 1 word.
Cách 1: <Tên mng> DW <lit kê các phn t ca mng>
Cách 2: <Tên mng> DW <S phn t ca mng> DUP (Giá tr khi to)
Ví d 1:
A DW 10h, 12h, 30, 40
Khai báo trên to ra mng A có 4 phn t, mi phn t dài 16 bít.
Ví d 2:
B DW 50 DUP (?)
7.1.2 Các phn t ca mng mt chiu
Tên mng chính là mt bin ng vi phn tu tiên ca mng. Các phn t tip theo
có thc xác nh bng cách ly a ch phn tng trc cng vi kích thc ca
nó.
Ví d 1:
M DB 10, 20, 30, 40
Các phn t ca mng có th kí hiu nh sau (chú ý: kích thc ca mi phn t trong
ng này là 1 byte):
Kí hiu Giá tr

Phn t 1 M 10
Phn t 2 M + 1 20
Phn t 3 M + 2 30
Phn t 4 M + 3 40
Ví d 2:
N DW 1, 6, 20, 10, 15
Các phn t ca mng có th kí hiu nh sau (chú ý: kích thc ca mi phn t trong
ng này là 2 byte):
Kí hiu Giá tr
Phn t 1 N 1
Phn t 2 N + 2 6
Phn t 3 N + 4 20
Phn t 4 N + 6 10
Phn t 5 N + 8 15
Ví d 3:
Cho mng A gm 12 phn t, các phn t có kiu là Byte. Hãy i ch phn tu
tiên và phn t cui cùng ca mng cho nhau.
Gii:
Phn tu tiên là: A
Phn t cui cùng là: A + 11
MOV AL, A
MOV BL, A + 11
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
52
MOV A, BL
MOV A+11, AL
7.1.3 Các cha ch
Vic truy nhp trc tip ti các phn t ca mng thông qua cách vit:<Tên mng> +
<Khong cách> (nh trong phn 7.1.2) gây rt nhiu bt tin trong lp trình. Mt phng
pháp khác, mm do hn, là s dng các thanh ghi  cha <Khong cách> hoc cha

a ch ca tng phn t. Bng vic thay i ni dung các thanh ghi  có th truy nhp
vào các phn t khác nhau ca mng.
Các thanh ghi có thc s dng là BX, BP, SI, DI.
a) Dùng thanh ghi cha a ch ca phn t:
Gi s thanh ghi SI ang cha a ch offset ca mt ô nh nào ó, cách vit: [SI] s
tr v ni dung ca ô nhó.
Nu s dng các thanh ghi BX, DI và SI  cha a ch offset thì a ch segment s
c cha trong DS. Còn nu s dng thanh ghi BP thì SS s cha segment.
Ví d:
Cho mng sau:
A DB 10, 12, 3, 4, 9, 5, 7, 6
Hãy tính tng các phn t ca mng (ct tng vào AL).
Gii:
Ta s s dng thanh ghi SI ln lt tr ti tng phn t ca mng  thc hin phép
tính tng.
XOR AL, AL ;Xoá AL  chun b cha tng
LEA SI, A ;SI cha a ch offset phn tu tiên ca mng
MOV CX, 8 ;S ln lp (mng có 8 phn t)
Lap:
ADD AL, [SI] ;Cng phn t ca mng vào AL
INC SI ;SI tr ti phn t tip theo
LOOP Lap
Cách vit nh trên c gi là Cha ch gián tip thanh ghi.
b) Dùng thanh ghi  cha <Khong cách>
Trong phng pháp này, mun truy nhp vào mt phn t ca mng thì cn phi bit
c <Khong cách> t phn tó ti u mng. Các phn t ca mng sc kí hiu
nh sau:
<Tên mng> [Thanh ghi]
Trong ó Thanh ghi s cha <Khong cách> ca phn t tính tu mng.
Ví d 1:

Kí hiu: A[BX]
A: là tên mng
BX: là thanh ghi cha <Khong cách>. Nu BX = 0 thì A[BX] chính là phn tu tiên
a mng.
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
53
Ví d 2:
Ta s vit li n chng trình  phn a bng mt cách khác.
Cho mng sau:
A DB 10, 12, 3, 4, 9, 5, 7, 6
Hãy tính tng các phn t ca mng (ct tng vào AL).
Gii:
XOR AL, AL ;Xoá AL  chun b cha tng
XOR BX, BX ;<Khong cách> = 0: phn tu tiên ca mng
MOV CX, 8 ;S ln lp (mng có 8 phn t)
Lap:
ADD AL, A[BX] ;Cng phn t ca mng vào AL
INC BX ;tng <Khong cách>  tr ti phn t tip theo
LOOP Lap
Ngoài cách kí hiu A[BX] còn có th s dng các kí hiu khác tng ng nh [A +
BX], [BX + A], A + [BX], [BX] + A.
Nu s dng các thanh ghi BX (Base Register) hay BP (Base Pointer) trong cách vit
trên thì gi là Ch  a ch c s, còn nu s dng SI (Source Index) hay DI
(Destination Index) thì gi là Cha ch ch s.
7.2 Các lnh thao tác vi chui
Nhã nói  phn trc, khi khai báo mng mt chiu thì nó s chim mt chui liên
tip các byte hay word trong n d liu. Mun truy nhp vào các ô nh trong n d
liu cn phi xác nh c a ch segment và offset ca chúng.
a ch segment ca d liu c cha trong thanh ghi DS. Trong các thao tác gia hai
ng d liu khác nhau, ngi ta thng s dng thêm thanh ghi n ES (Extra

Segment)  cha segment ca các ô nh.
a ch offset có thc cha trong nhiu thanh ghi khác nhau. Trong các lnh thao
tác vi chui sp trình bày, có hai cp thanh ghi hay c s dng là DS:SI và ES:DI.
Ngha là: Nu dùng DS  cha segment thì SI s cha offset, và nu ES cha segment
thì DI s cha offset.
 ES cng cha a ch ca n d liu ging nh DS thì u ca chng trình
chính phi có các lnh:
MOV AX, @DATA
MOV DS, AX
MOV ES, AX
7.2.1 Lnh chuyn chui (Moving a String)
Lnh này còn c gi là lnh sao chép chui.
a) Chuyn mt ln:
Cú pháp lnh:
ng 1: MOVSB
Lnh trên sao chép 1 byte d liu t ô nh có a ch DS:SI sang ô nh có a ch
ES:DI.
ng 2: MOVSW
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
54
Lnh trên sao chép 1 word d liu t ô nh có a ch DS:SI sang ô nh có a ch
ES:DI.
Ví d 1:
Xét hai chui c khai báo nh sau:
.DATA
Chuoi1 DB ‘Khoa CNTT$’
Chuoi2 DB 10 DUP (?)
Hãy sao chép ni dung ca Chuoi1 sang Chuoi2.
Gii:
 thc hin yêu cu trên ta s ln lt sao chép tng byte ca Chuoi1 sang Chuoi2.

‘K’  DS:SI
Chuoi1 ‘h’
10 byte ‘o’
‘a’
‘ ’
‘C’
‘N’
‘T’
‘T’
‘$’
?  ES:DI
Chuoi2 ?
10 byte
Mun sao chép byte u tiên (kí t ‘K’) thì DS:SI phi cha a chu ca Chuoi1,
ES:DI phi cha a chu ca Chuoi2. u này c thc hin bi các lnh sau:
LEA SI, Chuoi1 ;SI cha offset ca Chuoi1
LEA DI, Chuoi2 ;DI cha offset ca Chuoi2
MOVSB ;Chuyn 1 byte
Mi chui có  dài 10 byte nên phi lp li quá trình trên 10 ln thì mi sao chép
xong.
• u ý:
+ Mi khi sao chép xong 1 byte thì phi tng SI và DI lên 1  nó tr ti ô nh tip theo.
Sau mi lnh MOVSB thì SI và DI sc tng tng lên 1 nu c DF = 0 (SI và DI s
ng gim i 1 nu c DF = 1). Nh vy vn  là phi xoá c c DF trc khi thi
hành lnh MOVSB. u này c thc hin nh lnh CLD (Clear Direction Flag):
LEA SI, Chuoi1 ;SI cha offset ca Chuoi1
LEA DI, Chuoi2 ;DI cha offset ca Chuoi2
CLD ;Xoá cnh hng: DF = 0
MOVSB ;Chuyn 1 byte
+ Ngc li vi lnh CLD là lnh STD (Set Direction Flag), lnh này s thit lp c

DF=1. Ta có th s dng lnh STD  chuyn các byte d liu theo chiu ngc li.
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
55
Chng 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 cha segment ca n d liu
MOV CX, 10 ;S ln lp
LEA SI, Chuoi1 ;SI cha offset ca Chuoi1
LEA DI, Chuoi2 ;DI cha offset ca Chuoi2
CLD ;Xoá cnh hng: DF = 0
Lap:
MOVSB ;Thc hin lp 10 ln
LOOP Lap
MOV AH, 9h ;Hin th chui 2  kim tra kt qu
LEA DX, Chuoi2
INT 21h
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
Ví d 2:

Làm li ví d 1 bng cách dùng lnh MOVSW.
Gii:
Do lnh MOVSW mi ln sao chép c 2 byte nên ch phi thc hin lp 5 ln, các
nh c th nh sau:
MOV CX, 5 ;S ln lp
LEA SI, Chuoi1 ;SI cha offset ca Chuoi1
LEA DI, Chuoi2 ;DI cha offset ca Chuoi2
CLD ;Xoá cnh hng: DF = 0
Lap:
MOVSW ;Thc hin lp 5 ln
LOOP Lap
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
56
b) Chuyn nhiu ln:
Các lnh MOVSB và MOVSW mi ln ch chuyn c 1 byte hay 1 word, do ó khi
n chuyn nhiu d liu thì phi s dng vòng lp, u này làm chng trình phc tp
thêm. Thay vì s dng vòng lp, ta có th s dng các lnh chuyn nhiu ln di ây.
Cú pháp lnh:
ng 1: REP MOVSB
Lnh trên sao chép nhiu byte d liu t ô nh có a ch DS:SI sang ô nh có a ch
ES:DI, s byte cn chuyn cha trong thanh ghi CX.
ng 2: REP MOVSW
Lnh trên sao chép nhiu word d liu t ô nh có a ch DS:SI sang ô nh có a ch
ES:DI, s word cn chuyn cha trong thanh ghi CX.
Ví d:
 thc hin vic sao chép ni dung ca Chuoi1 sang Chuoi2 trong ví d trc, ta có
th vit li các lnh nh sau:
MOV CX, 10 ;S byte cn chuyn
LEA SI, Chuoi1 ;SI cha offset ca Chuoi1
LEA DI, Chuoi2 ;DI cha offset ca Chuoi2

CLD ;Xoá cnh hng: DF = 0
REP MOVSB
hoc:
MOV CX, 5 ;S word cn chuyn
LEA SI, Chuoi1 ;SI cha offset ca Chuoi1
LEA DI, Chuoi2 ;DI cha offset ca Chuoi2
CLD ;Xoá cnh hng: DF = 0
REP MOVSW
7.2.2 Lnh chuyn d liu t thanh ghi vào chui (Store a String)
Lnh này còn c gi là lnh lu chui.
Cú pháp lnh:
ng 1: STOSB
Lnh trên chuyn ni dung ca thanh ghi AL (1 byte) ti ô nh có a ch ES:DI.
ng 2: STOSW
Lnh trên chuyn ni dung ca thanh ghi AX (2 byte) ti ô nh có a ch ES:DI.
Ví d 1:
Xét chui sau ây:
.DATA
ChuoiKT DB 6 DUP (?)
Hãy nhp mt kí t t bàn phím ri t kí tó vào phn tu tiên ca chui.
Gii:
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
57
Ta s s dng chc nng s 1 ca ngt 21h  nhp kí t, thanh ghi AL s cha mã
ASCII ca kí tó. Mun chuyn kí t t AL vào phn tu tiên ca chui bng lnh
STOSB thì ES:DI phi cha a chu ca ChuoiKT, u ó c thc hin nh lnh
sau:
LEA DI, ChuoiKT ;DI cha offset ca ChuoiKT
Chng 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 cha segment ca n d liu
MOV AH, 1 ;Chc nng nhp kí t ca ngt 21h
INT 21h
LEA DI, ChuoiKT ;DI cha offset ca ChuoiKT
STOSB ;Chuyn kí t t AL vào u chui
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
Ví d 2:
Nhp mt chui kí 10 t t bàn phím.
Gii:
 nhp 10 kí t và ct nó vào mt chui trong b nh ta vn s dng phng pháp
nh ví d 1. Có mt sm khác bit nh sau:
+ Phi có mt vòng lp vi s ln lp bng 10.
+ Sau mi lnh lu chui (STOSB) thì DI phi c tng lên 1  tr ti ô nh tip theo.
u này c thc hin nh lnh xoá cnh hng (CLD).
Chng trình y :
TITLE Vi du 2
.MODEL SMALL
.STACK 100H
.DATA

ChuoiKT DB 10 DUP (?)
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
58
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV ES, AX ;DS và ES cha segment ca n d liu
MOV CX, 10 ;S ln lp bng 10
LEA DI, ChuoiKT ;DI cha offset ca ChuoiKT
CLD ;Xoá cnh hng: DF = 0
Lap:
MOV AH, 1 ;Chc nng nhp kí t ca ngt 21h
INT 21h
STOSB ;Chuyn kí t t AL vào u chui
;DI c tng tng lên 1
LOOP Lap
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
7.2.3 Lnh chuyn d liu t chui vào thanh ghi (Load a String)
Lnh này còn c gi là lnh np chui.
Cú pháp lnh:
ng 1: LODSB
Lnh trên chuyn 1 byte d liu t ô nh có a ch DS:SI vào thanh ghi AL.
ng 2: LODSW
Lnh trên chuyn 1 word d liu t ô nh có a ch DS:SI vào thanh ghi AX.
Ví d:
Xét chui sau ây:

.DATA
ChuoiKT DB ‘Viet Nam’
Hãy hin th chui ra màn hình.
Gii:
Vì chui không kt thúc bng du ‘$’ nên không th hin chui bng chc nng s 9
a ngt 21h. Ta s cho hin ln lt các kí t ca chui bng chc nng s 2 ca ngt
21h (các tham s: AH = 2, DL = Mã ASCII ca kí t cn hin th). Chui có 8 kí t nên
n 8 ln lp.
u tiên cn chuyn tng kí t t chui vào thanh ghi AL bng lnh LODSB, sau ó
chuyn t AL sang DL, ri gi chc nng s 2 ca ngt 21h.
Chng trình y :
Bài ging hp ng Chng VII: Mng và các lnh thao tác chui
59
TITLE Vi du
.MODEL SMALL
.STACK 100H
.DATA
ChuoiKT DB Viet Nam
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX ;DS cha segment ca n d liu
MOV CX, 8 ;S ln lp bng 8
LEA SI, ChuoiKT ;SI cha offset ca ChuoiKT
CLD ;Xoá cnh hng: DF = 0
Lap:
LODSB ;Chuyn kí t t chui vào AL
;SI c tng tng lên 1 (
;tr ti kí t tip theo)
MOV DL, AL ;Chuyn kí t vào DL

MOV AH, 2 ;Hin th kí t
INT 21h
LOOP Lap
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN

×