CHNG 3: LP TRNH HP NG 1. Cc tp tin .EXE v .COM DOS ch c th thi hnh c cc tp tin dng .COM v .EXE. Tp tin .COM thng dng xy dng cho cc chng trnh nh cn .EXE dng cho cc chng trnh ln. 1.1. Tp tin .COM - Tp tin .COM ch c mt on nn kch thc ti a ca mt tp tin loi ny l 64 KB. - Tp tin .COM c np vo b nh v thc thi nhanh hn tp tin .EXE nhng ch p dng c cho cc chng trnh nh. - Ch c th gi cc chng trnh con dng near. Khi thc hin tp tin .COM, DOS nh v b nh v to vng nh di 256 byte v tr 0000h, vng ny gi l PSP (Program Segment Prefix), n s cha cc thng tin cn thit cho DOS. Sau , cc m lnh trong tp tin s c np vo sau PSP v tr 100h v a gi tr 0 vo stack. Nh vy, kch thc ti a thc s ca tp tin .COM l 64 KB 256 byte PSP 2 byte stack. Tt c cc thanh ghi on u ch n PSP v thanh ghi con tr lnh IP ch n 100h, thanh ghi SP c gi tr 0FFFEh. 1.2. Tp tin .EXE - Nm trong nhiu on khc nhau, kch thc thng thng ln hn 64 KB. - C th gi c cc chng trnh con dng near hay far. - Tp tin .EXE cha mt header u tp tin cha cc thng tin iu khin cho tp tin. 2. Khung ca mt chng trnh hp ng Khung ca mt chng trnh hp ng c dng nh sau: TITLE Chng trnh hp ng .MODEL Kiu kch thc b nh ; Khai bo quy m s ; dng b nh .STACK Kch thc ; Khai bo dung lng ; on stack .DATA ; Khai bo on d liu msg DB 'Hello$' .CODE ; Khai bo on m main PROC
CALL Subname ; Gi chng trnh con
main ENDP
Subname PROC ; nh ngha chng ; trnh con
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 45 RET Subname ENDP END main
Quy m s dng b nh:
Bng 3.1:
Loi M t Tiny M lnh v d liu nm trong mt on Small M lnh trong mt on, d liu trong mt on Medium M lnh khng nm trong mt on, d liu trong mt on Compact M lnh trong mt on, d liu khng nm trong mt on Large M lnh khng nm trong mt on, d liu khng nm trong mt on v khng c mng no ln hn 64KB Huge M lnh khng nm trong mt on, d liu khng nm trong mt on v cc mng c th ln hn 64KB
Thng thng, cc ng dng n gin ch i hi m chng trnh khng qu 64 KB v d liu cng khng ln hn 64 KB nn ta s dng dng Small:
.MODEL SMALL
Khai bo kch thc stack:
Khai bo stack dng dnh ra mt vng nh dng lm stack (ch yu phc v cho chng trnh con), thng thng ta chn khong 256 byte l s dng (nu khng khai bo th chng trnh dch t ng cho kch thc stack l 1 KB):
.STACK 256
Khai bo on d liu:
on d liu dng cha cc bin v hng s dng trong chng trnh.
Khai bo on m:
on m dng cha cc m lnh ca chng trnh. on m bt u bng mt chng trnh chnh v c th c cc lnh gi chng trnh con (CALL). Mt chng trnh chnh hay chng trnh con bt u bng lnh PROC v kt thc bng lnh ENDP (y l cc lnh gi ca chng trnh dch). Trong chng trnh con, ta s dng thm lnh RET tr v a ch lnh trc khi gi chng trnh con. 3. C php ca cc lnh trong chng trnh hp ng Mt dng lnh trong chng trnh hp ng gm c cc trng (field) sau (khng nht thit phi y tt c cc trng):
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 46 Tn Lnh Ton hng Ch thch A: MOV AH,10h ; a gi tr 10h vo thanh ghi AH Main PROC
Trng tn cha nhn, tn bin hay tn th tc. Cc tn nhn c th cha ti a 31 k t, khng cha k t trng (space) v khng c bt u bng s (A: hay Main:). Cc nhn c kt thc bng du ':'. Trng lnh cha cc lnh s thc hin. Cc lnh ny c th l cc lnh tht (MOV) hay cc lnh gi (PROC). Cc lnh tht s c dch ra m my. Trng ton hng cha cc ton hng cn thit cho lnh (AH,10h). Trng ch thch phi c bt u bng du ';'. Trng ny ch dng cho ngi lp trnh ghi cc li gii thch cho chng trnh. Chng trnh dch s b qua cc lnh nm pha sau du ;. 3.1. Khai bo d liu Khi khai bo d liu trong chng trnh, nu s dng s nh phn, ta phi dng thm ch B cui, nu s dng s thp lc phn th phi dng ch H cui. Ch rng i vi s thp lc phn, nu bt u bng ch A..F th phi thm vo s 0 pha trc.
V d: 1011b ; S nh phn 1111 ; S thp phn 1011h ; S thp lc phn 3.2. Khai bo bin Khai bo bin nhm chng trnh dch cung cp mt a ch xc nh trong b nh. Ta dng cc lnh gi sau nh ngha cc bin ng vi cc kiu d liu khc nhau: DB (define byte), DW (define word) v DD (define double word).
VD: A1 DB 1 ; nh ngha bin A1 di 1 byte (chng ; trnh dch s dng 1 byte trong b nh ; lu tr A1), tr ban u A1 = 1 A2 DB ? ; Bin A2 kiu byte, khng c gi tr gn ; ban u A3 DB 'A' ; Bin kiu k t A4 DW 1 ; nh ngha bin A4 di 2 byte, gi tr ban ; u A4 = 1, ta cng c th dng du ? ; xc nh bin khng cn khi to gi tr ban u A5 DD 1 ; Bin A5 di 4 byte A6 DB 1,2,3 ; nh ngha bin mng (array) gm c 3 ; phn t, mi phn t di 1 byte (ngha l ; s dng 3 byte lu tr) vi cc gi tr ban ; u ca cc phn t ln lt l 1,2,3 A7 DB 10 DUP(0) ; Khai bo bin mng gm 10 phn t, mi ; phn t c chiu di 1 byte vi gi tr gn ; ban u l 0 Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 47 A8 DB 10 DUP(?) ; Khai bo bin mng gm 10 phn t, mi ; phn t c chiu di 1 byte, khng cn ; gn gi tr ban u
Ngoi ra ta c th dng cc ton t DUP lng vo nhau khi khai bo bin mng. Gi s ta cn khai bo mng A9 c cc gi tr gn ban u 1,2,3,1,1,3,2,2,1,1,3,2,2. Ta c th thc hin nh sau:
A9 DB 1,2,3,1,1,3,2,2,1,1,3,2,2 Hay: A9 DB 1,2,3,2 DUP(1,1,3,2,2) Hay: A9 DB 1,2,3,2 DUP(2 DUP(1),3,2 DUP(2))
i vi cc bin c nhiu hn 1 byte, byte thp s cha nh c a ch thp v byte cao s cha nh c a ch cao.
VD: A10 DW 1234h
Bin A10 gi s bt u lu ti a ch 1000h th nh 1000h cha gi tr 34h cn nh 1001h cha gi tr 12h. i vi bin kiu chui (string), thc cht l mt mng cc k t, ta c th khai bo nh sau:
A11 DB 'ABCD' Hay A11 DB 65h,66h,67h,68h
Sau lnh khai bo ny th nh 1000h (gi s bin A11 lu tr ti a ch 1000h) cha 'A', 1001h cha 'B', 1002h cha 'C' v 1003h cha 'D'. 3.3. Khai bo hng Cc hng khai bo trong chng trnh hp ng bng lnh gi EQU chng trnh d hiu hn. Hng c th dng s, k t hay chui.
VD: A12 EQU 10 A13 EQU 'AAA'
Sau khi s dng khai bo ny, nu ta dng lnh: MOV AH,A12 th AH = 10h
A14 DB 'B',A13 th khai bo chui A14 vi gi tr gn ban u l 'BAAA'.
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 48 4. Cc ton t trong hp ng Ton t s hc:
Bng 3.2:
Ton t C php M t + - * / mod + - shl shr +bt -bt bt1*bt2 bt1/bt2 bt1 mod bt2 bt1 + bt2 bt1 bt2 bt shl n bt shr n S dng S m Nhn Chia Ly phn d Cng Tr Dch tri n bit Dch phi n bit
VD: MOV AH,10 OR 4 AND 2 ; AH = 10 MOV AH, 0F0h AND 7Fh ; AH = 70h
Ton t quan h: Cc ton t quan h so snh 2 biu thc, cho gi tr true (-1) nu iu kin tho v false (0) nu khng tho.
Bng 3.3:
Ton t C php M t EQ NE LT LE GT GE bt1 EQ bt2 bt1 NE bt2 bt1 LT bt2 bt1 LE bt2 bt1 GT bt2 bt1 GE bt2 Bng Khng bng Nh hn Nh hn hay bng Ln hn Ln hn hay bng
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 49 Cc ton t cung cp thng tin:
Ton t SEG: SEG bt Ton t SEG xc nh a ch on ca biu thc bt. bt c th l bin, nhn, hay cc ton hng b nh.
Ton t OFFSET: OFFSET bt Ton t OFFSET xc nh a ch offset ca biu thc bt. bt c th l bin, nhn, hay cc ton hng b nh.
VD: MOV AX,SEG A ; Np a ch on v a ch offset MOV DS,AX ; ca bin A vo cp thanh ghi MOV AX,OFFSET A ; DS:AX
Ton t ch s [ ]: (index operator) Ton t ch s thng dng vi ton hng trc tip v gin tip.
Ton t (:) (segment override operator) Segment:bt Ton t : quy nh cch tnh a ch i vi segment c ch. Segment l cc thanh ghi on CS, DS, ES, SS. Ch rng khi s dng ton t : kt hp vi ton t [ ] th segment: phi t ngoi ton t [ ].
VD: Cch vit [CS:BX] l sai, ta phi vit CS:[BX]
Ton t TYPE: TYPE bt Tr v gi tr biu th dng ca biu thc bt. - Nu bt l bin th s tr v 1 nu bin c kiu byte, 2 nu bin c kiu word, 4 nu bin c kiu double word. - Nu bt l nhn th tr v 0FFFFh nu bt l near v 0FFFEh nu bt l far. - Nu bt l hng th tr v 0.
Ton t LENGTH: LENGTH bt Tr v s cc n v cp cho bin bt
Ton t SIZE: SIZE bt Tr v tng s cc byte cung cp cho bin bt
VD: A DD 100 DUP(?) MOV AX,LENGTH A ; AX = 100 MOV AX,SIZE A ; AX = 400
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 50 Cc ton t thuc tnh:
Ton t PTR: Loai PTR bt Ton t ny cho php thay i dng ca biu thc bt. - Nu bt l bin hay ton hng b nh th Loai l byte, word hay dword. - Nu bt l nhn th Loai l near hay far.
VD: A DW 100 DUP(?) B DD ? MOV AH,BYTE PTR A ; a byte u tin trong mng A ; vo thanh ghi AH MOV AX,WORD PTR B ; a 2 byte thp trong bin B ; vo thanh ghi AX Ton t HIGH, LOW: HIGH bt LOW bt Cho gi tr ca byte cao v thp ca biu thc bt, bt phi l mt hng.
VD: A EQU 1234h MOV AH,HIGH A ; AH 12h MOV AH,LOW A ; AH 34h 5. Cc cch nh a ch trong hp ng
Ton hng trc tip: Ton hng trc tip l mt biu thc hng xc nh. Cc hng s c th dng thp phn (c du v khng du), nh phn, thp lc phn, cc hng s nh ngha bng lnh EQU,
Ton hng thanh ghi: Cc thanh ghi c th s dng trong php nh a ch thanh ghi l AH, BH, CH, DH, AL, BL, CL, DL, AX, BX, CX, DX, SP, BP, SI, DI, CS, DS, ES, SS.
Ton hng b nh:
Trc tip: Ton hng ny xc nh d liu lu trong b nh ti mt a ch xc nh khi dch, a ch ny l mt biu thc hng (c th kt hp vi ton t ch s [ ] hay ton t +, -, :). Thanh ghi on mc nh l thanh ghi DS nhng ta c th dng ton t : ch thanh ghi on khc. Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 51 VD: A DW 1000h B DB 100 DUP(0) MOV AX,A ; Chuyn ni dung ca bin A vo MOV AX,[A] ; thanh ghi AX MOV AH,B ; Truy xut phn t u tin ca MOV AH,B[0] ; mng B MOV AH,B + 1 ; Truy xut phn t th hai ca MOV AH,B[1] ; mng B MOV AH,B + 5 ; Truy xut phn t th 6 ca MOV AH,B[5] ; mng B Ch rng lnh MOV AX,[1000h] s chuyn gi tr 1000h vo thanh ghi AX. Nu mun chuyn ni dung ti nh 1000h vo thanh ghi AX th phi dng lnh MOV AX,DS:[1000h] hay MOV AX,DS:1000h
Gin tip: Ton hng b nh gin tip cho php dng cc thanh ghi BX, BP, SI, DI ch cc gi tr trong b nh. VD: MOV BX,2 MOV SI,3 MOV AH,B[BX] ; Chuyn phn t th 3 ca mng B ; vo thanh ghi AH MOV AH,B[BX+1] ; Chuyn phn t th 4 ca mng B MOV AH,B[BX]+1 ; vo thanh ghi AH (BX + 1 = 3) MOV AH,B[BX+SI] ; Chuyn phn t th 6 ca mng B MOV AH,B[BX][SI] ; vo thanh ghi AH MOV AH,[B+BX+SI] ; BX + SI = 5 MOV AH,[B][BX][SI] MOV AH,B[BX+SI+5] ; Chuyn phn t th 11 ca mng B MOV AH,B[BX][SI]+5 ; vo thanh ghi AH MOV AH,[B+BX+SI+5] ; BX + SI + 5 = 10 6. To v thc thi chng trnh hp ng Ta c th to v thc thi mt chng trnh hp ng trn mt my PC theo cc bc sau: - Dng mt chng trnh son tho vn bn khng nh dng (nh NC) to mt tp tin cha chng trnh hp ng (gn phn m rng ca tp tin ny l .ASM, gi s l TEMP.ASM). - - Dng chng trnh TASM.EXE (Turbo Assembler) dch ra m my dng .OBJ: TASM TEMP - Sau khi dch xong, ta s c file TEMP.OBJ cha cc m my ca chng trnh. chuyn thnh file thc thi, ta dng chng trnh TLINK.EXE chuyn thnh tp tin .EXE: TLINK TEMP - - Nu tp tin thc thi dng .COM th ta dng thm chng trnh EXE2BIN.EXE: EXE2BIN TEMP TEMP.COM Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 52 7. Tp lnh hp ng 7.1. Nhm lnh chuyn d liu 7.1.1. Nhm lnh chuyn d liu a dng Lnh MOV dst,src: chuyn ni dung ton hng src vo ton hng dst. Ton hng ngun src c th l thanh ghi (reg), b nh (mem) hay gi tr tc thi (immed); ton hng ch dst c th l reg hay mem. Lnh MOV c th c cc trng hp sau: Reg8 reg8 MOV AL,AH Reg16 reg16 MOV AX,BX Mem8 reg8 MOV [BX],AL Reg8 mem8 MOV AL,[BX] Mem16 reg16 MOV [BX],AX Reg16 mem16 MOV AX,[BX] Reg8 immed8 MOV AL,04h Mem8 immed8 MOV mem[BX],01h Reg16 immed16 MOV AL,0F104h Mem16 immed16 MOV mem[BX],0101h SegReg reg16 MOV DS,AX SegReg mem16 MOV DS,mem Reg16 segreg MOV AX,DS Mem16 segreg MOV [BX],DS - Lnh MOV khng nh hng n cc c. - Khng th chuyn trc tip d liu gia hai nh m phi thng qua mt thanh ghi MOV AX,mem1 MOV mem2,AX - Khng th chuyn gi tr trc tip vo thanh ghi on MOV AX,1010h MOV DS,AX - Khng th chuyn trc tip gia 2 thanh ghi on - Khng th dng thanh ghi CS lm ton hng ch
Lnh XCHG dst,src: (Exchange) hon chuyn ni dung 2 ton hng. Ton hng ch c th l reg hay mem. - Lnh XCHG khng nh hng n cc c - Khng th dng cho cc thanh ghi on
Lnh PUSH src: ct ni dung mt thanh ghi vo stack. Ton hng l reg16
Lnh POP dst: ly d liu 16 bit t stack a vo ton hng dst. Ta c th dng nhiu lnh PUSH ct d liu vo stack nhng khi dng lnh POP ly d liu ra th phi dng theo th t ngc li. PUSH AX PUSH BX Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 53 PUSH CX
POP CX POP BX POP AX
Lnh XLAT [src]: chuyn ni dung ca nh 8 bit vo thanh ghi AL. a ch nh xc nh bng cp thanh ghi DS:BX (nu khng ch ra src) hay src, a ch offset cha trong thanh ghi AL. Lnh XLAT tng ng vi cc lnh: MOV AH,0 MOV SI,AX MOV AL,[BX+SI] 7.1.2. Nhm lnh chuyn a ch
Lnh LEA reg16,mem16: (Load Effective Address) chuyn a ch offset ca ton hng b nh vo thanh ghi reg16. Lnh ny s tng ng vi MOV reg16, OFFSET mem16
Lnh LDS reg16,mem32: (Load pointer using DS) chuyn ni dung b nh ton hng mem32 vo cp thanh ghi DS:reg16. Lnh LDS AX,mem tng ng vi: MOV AX,mem MOV BX,mem+2 MOV DS,BX
Lnh LES reg16,mem32: (Load pointer using ES) ging nh lnh LDS nhng dng cho thanh ghi ES 7.1.3. Nhm lnh chuyn c hiu
Lnh LAHF: (Load AH from flag) chuyn cc c SF, ZF, AF, PF v CF vo cc bit 7,6,4,2 v 0 ca thanh ghi AH (3 bit cn li khng i)
Lnh SAHF: (Store AH into flag) chuyn cc bit 7,6,4,2 v 0 ca thanh ghi AH vo cc c SF, ZF, AF, PF v CF.
Lnh PUSHF: chuyn thanh ghi c vo stack
Lnh POPF: ly d liu t stack chuyn vo thanh ghi c 7.1.4. Nhm lnh chuyn d liu qua cng Mi I/O port giao tip vi CPU s c mt a ch 16 bit cho n. CPU gi hay nhn d liu t cng bng cch ch n a ch cng . Tu theo chc nng m cng c th: ch c d liu (input port), ch ghi d liu (output port) hay c th c v ghi d liu (input/output port).
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 54 Lnh IN: c d liu t cng v a vo thanh ghi AL IN AL,port8 IN AL,DX Nu a ch port ch c 8 bit th c th a gi tr trc tip vo, nu l 16 bit th phi thng qua thanh ghi AX.
Lnh OUT: ghi d liu trong thanh ghi AL ra cng OUT port8,AL OUT DX,AL
VD: MOV AL,3 OUT 61h,AL ; Gi gi tr 03h ra cng 61h MOV AL,1 MOV DX,03F8h ; Xut ra cng my in OUT DX,AL MOV DX,03F8h IN AL,DX ; c d liu t cng my in 7.2. Nhm lnh chuyn iu khin 7.2.1. Lnh nhy khng iu kin JMP JMP label JMP reg/mem Lnh JMP dng chuyn iu khin chng trnh t v tr ny sang v tr khc (thay i ni dung cp thanh ghi CS:IP). 7.2.2. Lnh nhy c iu kin Lnh nhy c iu kin ch s dng cho cc nhn nm trong khong t 127 n 128 byte so vi v tr ca lnh.
Lnh JA label: (Jump if Above) Nu CF = 0 v ZF = 0 th JMP label
Lnh JAE label: (Jump if Above or Equal) Nu CF = 0 th JMP label
Lnh JB label: (Jump if Below) Nu CF = 1 th JMP label
Lnh JBE label: (Jump if Below or Equal) Nu CF = 1 hoc ZF = 1 th JMP label
Lnh JNA label: (Jump if Not Above) Ging lnh JBE
Lnh JNAE label: (Jump if Not Above or Equal) Ging lnh JB
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 55 Lnh JNB label: (Jump if Not Below) Ging lnh JAE
Lnh JNBE label: (Jump if Not Below or Equal) Ging lnh JA
Lnh JG label: (Jump if Greater) Nu SF = OF v ZF = 0 th JMP label
Lnh JGE label: (Jump if Greater or Equal) Nu SF = OF th JMP label
Lnh JL label: (Jump if Less) Nu SF <> OF th JMP label
Lnh JLE label: (Jump if Less or Equal) Nu CF <> OF hoc ZF = 1 th JMP label
Lnh JNG label: (Jump if Not Greater) Ging lnh JLE
Lnh JNGE label: (Jump if Not Greater or Equal) Ging lnh JL
Lnh JNL label: (Jump if Not Less) Ging lnh JGE Lnh JNLE label: (Jump if Not Less or Equal) Ging lnh JG
Lnh JC label: (Jump if Carry) Ging lnh JB
Lnh JNC label: (Jump if Not Carry) Ging lnh JNB
Lnh JZ label: (Jump if Zero) Nu ZF = 1 th JMP label
Lnh JE label: (Jump if Equal) Ging lnh JZ
Lnh JNZ label: (Jump if Not Zero) Nu ZF = 0 th JMP label
Lnh JNE label: (Jump if Equal) Ging lnh JNZ
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 56 Lnh JS label: (Jump on Sign) Nu SF = 1 th JMP label
Lnh JNS label: (Jump if No Sign) Nu SF = 0 th JMP label
Lnh JO label: (Jump on Overflow) Nu OF = 1 th JMP label
Lnh JNO label: (Jump if No Overflow) Nu OF = 0 th JMP label
Lnh JP label: (Jump on Parity) Nu PF = 1 th JMP label
Lnh JNP label: (Jump if No Parity) Nu PF = 0 th JMP label
Lnh JCXZ label: (Jump if CX Zero) Nu CX = 1 th JMP label 7.2.3. Lnh so snh CMP left(reg/mem), right(reg/mem/immed) Lnh CMP dng so snh ni dung 2 ton hng, kt qu cha vo thanh ghi c v khng lm thay i ni dung cc ton hng.
VD: on chng trnh so snh 2 s A v B: A >B th nhy n label1, A = B th nhy n label2, A < B th nhy n label3. MOV AX,A CMP AX,B JG label1 JL label2 JMP label3 7.2.4. Cc lnh vng lp
Lnh LOOP: LOOP label M t: CX = CX 1 Nu CX <> 0 th JMP label
Lnh LOOPE: LOOPE label M t: CX = CX 1 Nu (ZF = 1) v (CX <> 0) th JMP label
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 57 Lnh LOOPZ: Ging lnh LOOPE
Lnh LOOPNE: LOOPNE label M t: CX = CX 1 Nu (ZF = 0) v (CX <> 0) th JMP label
Lnh LOOPNZ: Ging lnh LOOPNE 7.2.5. Lnh lin quan n chng trnh con
Lnh CALL: Lnh CALL dng gi mt chng trnh con, c th l near hay far. CALL label ; Gi chng trnh con ti v tr xc nh ; bi nhn label CALL reg/mem ; Gi chng trnh con ti v tr xc nh ; trong reg/mem
Lnh RET: (return) RET [n] RETN [n] RETF [n] Lnh RET dng kt thc chng trnh con, iu khin s c a v a ch trc khi gi chng trnh con. RETN kt thc chng trnh con dng near v RETF dng kt thc chng trnh con dng far. Trong trng hp lnh RET c hng s n theo sau th s cng vi thanh ghi SP gi tr n (n phi l s chn). Lnh ny dng loi b mt s tham s chng trnh con s dng ra khi stack. 7.3. Nhm lnh x l s hc 7.3.1. X l php cng Lnh ADD dst,src: dst dst + src Ton hng src c th l reg, mem hay immed cn ton hng dst l reg hay mem. - Khng th cng trc tip 2 thanh ghi on - Lnh ADD nh hng n cc c sau: + C CF: = 1 khi kt qu php cng c nh hay c mn + C AF: = 1 khi kt qu php cng c nh hay c mn i vi 4 bit thp + C PF: = 1 khi kt qu php cng c tng 8 bit thp l mt s chn. + C ZF: = 1 khi kt qu php cng l 0. + C SF: = 1 nu kt qu php cng l mt s m + C OF: = 1 nu kt qu php cng b sai du, ngha l vt ra ngoi phm vi ln nht hay nh nht m s c du c th cha trong ton hng dst. Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 58 Lnh ADC dst, src: (Add with Carry) dst dst + src + CF Lnh ADC thng dng cng cc s ln hn 16 bit.
Lnh INC dst: (Increment) dst dst + 1 Dst c th l reg hay mem.
Lnh AAA: (ASCII Adjust for Addition) Hiu chnh kt qu php cng 2 s BCD dng khng nn (mi ch s BCD lu bng 1 byte).
VD: MOV AX,9 MOV BX,3 ADD AL,BL ; Kt qu l AX = 0Ch AAA ; AX = 0102h (AH = 1, AL = 2) Lnh AAA ch nh hng n cc c AF v CF, khng nh hng n cc c cn li.
Lnh DAA: (Decimal Adjust for Addition) Hiu chnh kt qu php cng 2 s BCD dng nn (mi ch s BCD lu bng 4 bit, ngha l 1 byte biu din c cc s nguyn t 0 n 99).
Lnh DAA ch nh hng n cc c AF, CF, PF, SF, ZF v khng nh hng n thanh ghi AH. 7.3.2. X l php tr
Lnh SUB dst,src: dst dst - src Ton hng src c th l reg, mem hay immed cn ton hng dst ch c th l reg hay mem. - Khng th tr trc tip thanh ghi on - nh hng n cc c AF, CF, OF, PF, SF v ZF.
Lnh SBB dst,src: dst dst src CF Lnh ADC thng dng tr cc s ln hn 16 bit.
Lnh DEC dst: (decrement) dst dst 1 dst l reg hay mem. Lnh DEC nh hng n cc c AF, OF, PF, SF, ZF.
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 59 Lnh NEG dst: dst - dst dst l reg hay mem. Lnh NEG nh hng n cc c: CF = 1 nu ni dung kt qu l s khc 0. SF = 1 nu ni dung kt qu l s m khc 0. PF = 1 nu tng 8 bit thp l mt s chn. ZF = 1 nu ni dung kt qu l 0. OF = 1 nu ni dung ton hng dst l 80h (dng byte) hay 8000h (dng word).
VD: Nu mun thc hin php ton 100 AH, ta khng th cng lnh: SUB 100,AH m phi dng lnh: SUB AH,100 NEG AH
Lnh AAS: (Ascii Adjust for Substract) Hiu chnh kt qu php tr 2 s BCD dng khng nn (mi ch s BCD lu bng 1 byte). Lnh AAS ch nh hng c AF v CF.
Lnh DAS: (Decimal Adjust for Substract) Hiu chnh kt qu php tr 2 s BCD dng nn (mi ch s BCD lu bng 4 bit). Lnh AAS ch nh hng c AF v CF. 7.3.3. X l php nhn
Lnh MUL src: Nu src l reg hay mem 8 bit: AX AL*src Nu src l reg hay mem 16 bit: DX:AX AX*src Lnh MUL ch nh hng n c CF v OF.
Lnh IMUL src: Ging nh lnh MUL nhng kt qu l s c du.
Lnh AAM: (Ascii Adjust for Multiple) Hiu chnh kt qu php nhn 2 s BCD dng khng nn, lnh AAM thc hin chia AL cho 10, lu phn thng vo AL v phn d vo AH. Lnh AAM nh hng n cc c PF, SF v ZF. 7.3.4. X l php chia
Lnh DIV src: Nu src l reg/mem 8 bit: AL AX DIV src v AH AX MOD src Nu src l reg/mem 16 bit: AX DX:AX DIV src v DX DX:AX MOD src Lnh DIV khng nh hng n cc c nhng xy ra trn trong cc trng hp sau: - Chia cho 0 Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 60 - Thng ln hn 256 i vi dng 8 bit. - Thng ln hn 65536 i vi dng 16 bit.
Lnh IDIV src: Ging nh lnh DIV nhng kt qu l s c du. Cc trng hp trn: - Chia cho 0 - Thng nm ngoi khong (-128,127) i vi dng 8 bit. - Thng nm ngoi khong (-32767,32768) i vi dng 16 bit.
Lnh AAD: (Ascii Adjust for Division) Hiu chnh kt qu php chia 2 s BCD dng khng nn. Lu rng lnh AAD phi c thc hin trc lnh chia. Sau khi thc hin chia th phi hiu chnh li dng BCD bng cch dng lnh AAM.
Lnh CBW: (Convert Byte to Word) Nu AL < 80h th AH = 0, ngc li AH = 0FFh Lnh CBW dng chuyn s nh phn c du 8 bit thnh s nh phn c du 16 bit.
Lnh CWD: (Convert Word to Double word) Nu AX < 8000h th DX = 0, ngc li DX = 0FFFFh Lnh CWD dng chuyn s nh phn c du 16 bit thnh s nh phn c du 32 bit cha trong DX:AX. 7.3.5. Dch chuyn v quay Lnh SHL: (Shift Logical Left) SHL dst,1 SHL dst,CL Dch tri 1 bit hay CL bit. CF dst7 dst6 dst0 0
Lnh SAR: Ging nh lnh SHR nhng gi tr bit dst7 khng thay i, ngha l dst7 dst7 dst6 dst0 CF
Lnh ROL: (Rotate Left) ROL dst,1 ROL dst,CL Quay tri 1 bit hay CL bit. CF dst7 dst6 dst0 dst7 Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 61 Lnh ROR: (Rotate Right) ROR dst,1 ROR dst,CL Quay phi 1 bit hay CL bit. dst0 dst7 dst6 dst0 CF
Lnh RCL: (Rotate though Carry Left) RCL dst,1 RCL dst,CL Quay tri 1 bit hay CL bit. CF dst7 dst6 dst0 CF
Lnh RCR: (Rotate though Carry Right) RCR dst,1 RCR dst,CL Quay phi 1 bit hay CL bit. CF dst7 dst6 dst0 CF 7.3.6. Cc lnh logic
Lnh AND: AND dst,src dst dst AND src CF 0, OF 0 Src l reg, mem hay immed cn dst l reg, mem.
Lnh OR: OR dst,src dst dst OR src CF 0, OF 0
Lnh XOR: XOR dst,src dst dst XOR src CF 0, OF 0
Lnh NOT: NOT dst dst NOT dst Lnh NOT khng nh hng n cc c.
Lnh TEST: TEST dst,src Lnh TEST thc hin php ton AND 2 ton hng nhng ch nh hng n cc c v khng nh hng n ton t.
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 62 7.4. Nhm lnh x l chui Bao gm cc lnh sau: - Lnh MOVS: chuyn d liu t vng nh ny sang vng nh khc.
+ MOVSB: chuyn 1 byte t v tr ch n bi SI n v tr ch bi DI. Nu DF = 0 th SI SI + 1, DI DI + 1 cn nu DF = 1 th SI SI - 1, DI DI - 1. + MOVSW: chuyn 1 word t v tr ch n bi SI n v tr ch bi DI. Nu DF = 0 th SI SI + 2, DI DI + 2 cn nu DF 1 th SI SI - 2, DI DI - 2.
- Lnh CMPS: so snh ni dung 2 vng nh + CMPSB: so snh 1 byte ti v tr ch n bi SI v ti v tr ch bi DI. Nu DF = 0 th SI SI + 1, DI DI + 1 cn nu DF 1 th SI SI - 1, DI DI - 1. + CMPSW: so snh 1 word ti v tr ch n bi SI v ti v tr ch bi DI. Nu DF = 0 th SI SI + 2, DI DI + 2 cn nu DF = 1 th SI SI - 2, DI DI - 2.
- Lnh SCAS: tm mt phn t trong vng nh, a ch vng nh xc nh bng cp thanh ghi ES:DI, gi tr cn tm t trong thanh ghi AL, nu tm thy th ZF = 1. Gi tr ca DI v SI thay i ging nh trn.
- Lnh LODS: a mt byte hay word c a ch xc nh bi cp thanh ghi DS:SI vo thanh ghi AL hay AX. Gi tr ca DI v SI thay i ging nh trn.
- Lnh STOS: chuyn ni dung ca AL hay AX vo vng nh xc nh bi cp thanh ghi ES:DI. Gi tr ca DI v SI thay i ging nh trn. 8. Cc cu trc c bn trong lp trnh hp ng 8.1. Cu trc tun t Cu trc tun t l cu trc n gin nht. Trong cu trc tun t, cc lnh c sp xp tun t, lnh ny tip theo lnh kia.
Lnh 1 Lnh 2
Lnh n
VD: Cng 2 gi tr ca thanh ghi BX v CX, ri nhn i kt qu, kt qu cui cng cha trong AX MOV AX,BX ADD AX,CX ; Cng BX vi CX SHL AX,1 ; Nhn i Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 63 8.2. Cu trc IF THEN, IF THEN ELSE IF iu kin THEN Cng vic IF iu kin THEN Cng vic1 ELSE Cng vic2 VD: Gn BX = |AX| CMP AX,0 ; AX > 0? JNL DUONG ; AX dng NEG AX ; Nu AX < 0 th o du DUONG: MOV BX,AX NEXT:
VD: Gn CL gi tr bit du ca AX CMP AX,0 ; AX > 0? JNS AM ; AX m MOV CL,1 ; CL = 1 (AX dng) JMP NEXT AM: MOV CL,0 ; CL = 0 (AX m) NEXT: 8.3. Cu trc CASE
CASE Biu thc Gi tr 1: Cng vic 1 Gi tr 2: Cng vic 2
Gi tr n: Cng vic n END
VD: Nu AX > 0 th BH = 0, nu AX < 0 th BH = 1. Ngc li BH = 2 CMP AX,0 JL AM JE KHONG JG DUONG DUONG: MOV BH,0 JMP NEXT AM: MOV BH,1 JMP NEXT KHONG: MOV BH,2 NEXT: 8.4. Cu trc FOR
FOR S ln lp DO Cng vic
VD: Cho vng nh M di 200 bytes trong on d liu, chng trnh m s ch A trong vng nh M nh sau: MOV CX,200 ; m 200 bytes MOV BX,OFFSET M ; Ly a ch vng nh XOR AX,AX ; AX = 0 Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 64 NEXT: CMP BYTE PTR [BX],'A'; So snh vi ch A JNZ ChuA ; Nu khng phi l ch A th tip INC AX ; tc, ngc li th tng AX ChuA: INC BX LOOP NEXT
8.5. Cu trc lp WHILE
WHILE iu kin DO Cng vic
VD: Chng trnh c vng nh bt u ti a ch 1000h vo thanh ghi AH, n khi gp k t '$' th thot: MOV BX,1000h CONT: CMP AH,'$' JZ NEXT MOV AH,DS:[BX] JMP CONT NEXT: 8.6. Cu trc lp REPEAT
REPEAT Cng vic UNTIL iu kin
VD: Chng trnh c vng nh bt u ti a ch 1000h vo thanh ghi AH, n khi gp k t '$' th thot: MOV BX,1000h CONT: MOV AH,DS:[BX] CMP AH,'$' JZ NEXT JMP CONT NEXT: 9. Cc ngt ca 8086 Bng 3.4:
Vector ngt Cng dng 00h 01h 02h 03h 04h 05h 06h - 07h 08h 09h 0Ah 0Bh - 0Ch CPU: tc ng khi chia cho 0 CPU: chng trnh thc thi tng bc CPU: ngt khng che c CPU: to im dng chochng trnh CPU: tc ng khi kt qu s hc trn Tc ng khi nhn Print Screen Dnh ring Tc ng bi nhp ng h (18.2 ln/s) Tc ng khi c phm nhn Dnh ring Tc ng phn cng lin lc ni tip Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 65 0Dh 0Eh 0Fh 10h 11h 12h 13h 14h 15h 16h 17h 18h 19h 1Ah 1Bh 1Ch 1Dh 1Eh 1Fh 20h 21h 22h 23h 24h 25h 26h 27h 28h 3Fh 40h 41h 42h 45h 46h 47h 49h 4Ah 4Bh 67h 68h 6Fh 70h 71h 7Fh 80h 85h 86h F0h F1h FFh a cng a mm My in BIOS: mn hnh BIOS: xc nh cu hnh my tnh BIOS: thng bo kch thc RAM BIOS: gi cc phc v a cng/mm BIOS: giao tip ni tip BIOS: truy xut cassette hay m rng ngt BIOS: xut / nhp bn phm BIOS: my in Xm nhp ROM basic BIOS: khi ng my tnh BIOS: ngy / gi h thng Ly iu khin t ngt bn phm Ly iu khin t ngt ng h (sau int 08h) a ch bng tham s mn hnh a ch bng tham s a a ch b m k t DOS: kt thc chng trnh DOS: cc chc nng DOS a ch cn chuyn khi kt thc chng trnh a ch cn chuyn khi gp Ctrl Break a ch cn chuyn khi gp li DOS: c a cng / mm DOS: ghi a cng / mm DOS: chm dt chng trnh v thng tr Dnh ring cho DOS BIOS: cc chc nng a mm Bng thng s a cng th nht Dnh ring Bng thng s a cng th hai nh ngha do ngi s dng Gi bo hiu (ch trong AT) nh ngha do ngi s dng Khng s dng ng h thi gian thc (ch trong AT) Dnh ring Dnh ring S dng bi chng trnh thng dch BASIC Khng s dng
9.1. Ngt 21h Hm 01h: nhp mt k t t bn phm v hin k t nhp ra mn hnh. Nu khng c k t nhp, hm 01h s i cho n khi nhp. - Gi: AH = 01h - Tr v: AL cha m ASCII ca k t nhp Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 66 MOV AH,01h INT 21h ; AL cha m ASCII ca k t nhp
Hm 02h: xut mt k t trong thanh ghi DL ra mn hnh ti v tr con tr hin hnh - Gi AH = 02h, DL = m ASCII ca k t - Tr v: khng c
MOV AH,02h MOV DL,'A' INT 21h
Hm 08h: ging hm 01h nhng khng hin th k t ra mn hnh
Hm 09h: xut mt chui k t ra mn hnh ti v tr con tr hin hnh, a ch chui c cha trong DS:DX v phi c kt thc bng k t $ - Gi AH = 09h, DS:DX = a ch chui - Tr v: khng c
.DATA Msg DB 'Hello$'
MOV AH,09h LEA DX,Msg INT 21h
Hm 0Ah: nhp mt chui k t t bn phm (ti a 255 k t), dng phm ENTER kt thc chui - Gi AH = 0Ah, DS:DX = a ch lu chui - Tr v: khng c Chui phi c dng sau: - Byte 0: S byte ti a cn c (k c k t Enter) - Byte 1: s byte c - Byte 2: lu cc k t c
.DATA Msg DB 101 ; c ti a 100 k t DB ? DB 101 DUP(?)
MOV AH,0Ah LEA DX,Msg INT 21h
Hm 4Ch: kt thc chng trnh MOV AH,4Ch INT 21h Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 67 9.2. Ngt 10h Xo mn hnh: - Gi AX = 02h - Tr v: khng c MOV AX,02h INT 10h
Chuyn to con tr: - Gi AH = 02h, DH = dng, DL = ct MOV AH,02h MOV DX,0F15h INT 10h 10. Truyn tham s gia cc chng trnh Trong lp trnh, mt vn ta cn quan tm l truyn tham s gia chng trnh chnh v chng trnh con. thc hin truyn tham s, ta c th dng cc cch sau y: - Truyn tham s qua thanh ghi - Truyn tham s qua nh (bin) - Truyn tham s qua nh do thanh ghi ch n - Truyn tham s qua stack 10.1. Truyn tham s qua thanh ghi Ta thc hin truyn tham s qua thanh ghi bng cch: mt chng trnh con s a gi tr vo thanh ghi v chong trnh con khc s x l gi tr trn thanh ghi .
VD: Cng gi tr ti 2 nh 1000h v 1001h, kt qu cha trong 1002h (bye cao) v 1003h (byte thp). .MODEL SMALL .STACK 100h .CODE main PROC MOV AX,@DATA MOV DS,AX MOV BYTE PTR DS:[1000h],10h ; a gi tr vo MOV BYTE PTR DS:[1001h],0FFh ; cc nh CALL Read CALL Sum Mov AH,4Ch INT 21h main ENDP Read PROC ; c d liu vo thanh ghi AX MOV AH,DS:[1000h] MOV AL,DS:[1001h] RET Read ENDP ; X l d liu ti thanh ghi AX
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 68 Sum PROC ADD AH,AL JZ next MOV DS:[1003h],1 next: MOV DS:[1002h],AH RET Sum ENDP END main 10.2. Truyn tham s qua nh (bin) Qu trnh truyn tham s cng ging nh trn nhng thay v thc hin thng qua thanh ghi, ta s thc hin thng qua cc nh.
VD: Cng gi tr ti 2 nh m1 v m2, kt qu cha trong m3 (bye cao) v m4 (byte thp). .MODEL SMALL .STACK 100h .DATA m1 db ? m2 db ? m3 db ? m4 db ? .CODE main PROC MOV AX,@data MOV DS,AX MOV m1,10h ; a gi tr vo MOV m2,0FFh ; cc nh CALL Sum MOV AH,4Ch INT 21h main ENDP Sum PROC MOV m4,0 MOV AH,m1 ADD AH,m2 JNC next MOV m4,1 next: MOV m3,AH RET Sum ENDP END main 10.3. Truyn tham s qua nh do thanh ghi ch n Trong cch truyn tham s ny, ta dng cc thanh ghi SI, DI, BX ch a ch offset ca cc tham s cn thanh ghi on mc nh l DS.
Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 69 VD: Cng gi tr ti 2 nh m1 v m2, kt qu cha trong m3 (bye cao) v m4 (byte thp). .MODEL SMALL .STACK 100h .DATA m1 db ? m2 db ? m3 db ? m4 db ? .CODE main PROC MOV AX,@data MOV DS,AX LEA SI,m1 LEA DI,m2 LEA BX,m3 MOV [SI],10h ; a gi tr vo MOV [DI],0FFh ; cc nh CALL Sum MOV AH,4Ch INT 21h main ENDP Sum PROC MOV AL,[SI] ADD AL,[DI] JZ next MOV [BX+1],1 next: MOV [BX],AL RET Sum ENDP END main 10.4. Truyn tham s qua stack Trong phng php truyn tham s ny, ta dng stack lm ni cha cc tham s cn truyn thng qua cc tc v PUSH v POP.
VD: Cng gi tr ti 2 nh m1 v m2, kt qu cha trong m3 (byte cao) v m4 (byte thp). .MODEL SMALL .STACK 100h .DATA m1 dw ? m2 dw ? m3 dw ? m4 dw ? .CODE main PROC MOV AX,@data Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 70 MOV DS,AX LEA SI,m1 LEA DI,m2 MOV [SI],1234h ; a gi tr vo MOV [DI],0FEDCh ; cc nh PUSH m1 ; a vo stack PUSH m2 CALL Sum POP m3 ; Ly kt qu a vo stack POP m4 MOV AH,4Ch INT 21h main ENDP Sum PROC POP DX ; Lu li a ch tr v ca lnh CALL POP AX ; Ly d liu t stack POP BX ADD AX,BX JNC next PUSH 1 next: PUSH AX PUSH DX ; Tr li a ch tr v ca lnh CALL RET Sum ENDP END main 11. Cc v d minh ho 11.1. In chui k t ra mn hnh .MODEL SMALL .STACK 100h .DATA msg DB 'Hello$' .CODE main PROC MOV AX,@DATA ; Khi ng thanh ghi DS MOV DS,AX MOV AX,02h ; Xo mn hnh INT 10h MOV AH,02h ; Chuyn to con tr MOV DX,0C15h ; n dng 12 (0Ch) v ct 21 (15h) INT 10h LEA DX,msg ; a ch thng ip MOV AH,09h ; In thng ip ra mn hnh INT 21h MOV AH,4Ch ; Kt thc chng trnh INT 21h main ENDP Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 71 END main 11.2. In chui k t ra mn hnh ti to nhp vo .MODEL SMALL .STACK 100h .DATA msg DB 'Hello$' msg1 DB 'Nhap vao toa do:$' Crlf DB 0Dh,0Ah,'$' Td DB 3 DB ? DB 3 DUP(?) .CODE main PROC MOV AX,@DATA MOV DS,AX ; Khi ng thanh ghi DS MOV AX,02h INT 10h ; Xa mn hnh LEA DX,msg1 MOV AH,09h ; In thng ip INT 21h CALL Nhap ; Nhp dng MOV CL,AL LEA DX,Crlf ; Xung dng MOV AH,09h INT 21h CALL Nhap ; Nhp ct MOV CH,AL MOV AH,02h ; Chuyn ta con tr MOV DX,CX INT 10h LEA DX,msg MOV AH,09h ; In ra mn hnh INT 21h MOV AH,4Ch ; Kt thc chng trnh INT 21h main ENDP Nhap PROC MOV AH,0Ah ; Nhp vo LEA DX,Td INT 21h LEA BX,Td ; Ly ch s hng chc MOV AL,DS:[BX+2] SUB AL,'0' ; Chuyn t dng k t sang dng s MOV BL,10 MUL BL ; Nhn s hng chc vi 10 PUSH AX LEA BX,Td ; Ly ch s hng dn v Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 72 MOV AL,DS:[BX+3] SUB AL,'0' POP BX ADD AL,BL RET Nhap ENDP END main 11.3. Cng 2 s nh phn di 5 byte .MODEL SMALL .STACK 100h .DATA m1 DB 00h,08h,10h,13h,24h,00h m2 DB 0FFh,0FCh,0FAh,0F0h,0F1h,00h; m3 DB 6 DUP(0) .CODE main PROC MOV AX,@DATA MOV DS,AX ; Khi ng thanh ghi DS LEA SI,m1 LEA DI,m2 LEA BX,m3 MOV CX,6 XOR AL,AL next: MOV AL,[SI] ADC AL,[DI] MOV [BX],AL INC BX INC SI INC DI LOOP next MOV AH,4Ch INT 21h main ENDP END main 11.4. Nhp mt chui k t v chuyn ch thng thnh ch hoa .MODEL SMALL .STACK 100h .DATA m1 DB 81 DB ? DB 81 DUP(?) m2 DB 'Chuoi da doi:$' .CODE main PROC MOV AX,@DATA Ti liu vi x l Lp trnh hp ng Phm Hng Kim Khnh Trang 73 MOV DS,AX ; Khi ng thanh ghi DS MOV ES,AX LEA DX,m1 MOV AH,0Ah ; Nhp chui INT 21h LEA SI,m1 ; Ly a ch chui ADD SI,2 MOV DI,SI ; Chui ngun v ch trng nhau Next: LODSB ; Ly k t CMP AL,0Dh ; Nu l k t Enter th kt thc JE quit CMP AL,'a' ; Nu k t nhp khng phi l k t JB cont ; thng t 'a' n 'z' th b qua CMP AL,'z' JA cont SUB AL,20h ; Chuyn k t thng thnh k t hoa STOSB ; Lu k t va chuyn DEC DI ; Nu l k t thng th dng lnh STOSB ; nn DI tng ln 1, ta phi gim DI cont: INC DI ; Tng ln k t k JMP next quit: MOV AL,'$' STOSB MOV AX,02h ; Xa mn hnh INT 10h LEA DX,m2 MOV AH,09h INT 21h LEA DX,m1+2 MOV AH,09h INT 21h MOV AH,4Ch INT 21h main ENDP END main