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

10 329 1
Bài giảng hợp ngữ - Chương 7 pot

Đang tải... (xem toàn văn)

Thông tin tài liệu

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

Ngày đăng: 21/07/2014, 17:20

Tài liệu cùng người dùng

Tài liệu liên quan