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 . 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. 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. 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