SlideShare a Scribd company logo
1 of 108
Download to read offline
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                                            1


                                 ChƶƓng 1 : CƔ BAƛN VEƀ HƔƏP NGƖƕ

       Trong chƶƓng naĆøy seƵ giĆ“Ć¹i thieƤu nhƶƵng nguyeĆ¢n taĆ©c chung ƱeĆ„ taĆÆo ra , dĆ²ch vaĆø
chaĆÆy moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ treĆ¢n maĆ¹y tĆ­nh .
       CaĆ”u truĆ¹c ngƶƵ phaĆ¹p cuĆ»a leƤnh hĆ“ĆÆp ngƶƵ trong giaĆ¹o trƬnh naĆøy ƱƶƓĆÆc trƬnh baĆøy theo
Macro Assembler ( MASM) dƶĆÆa treĆ¢n CPU 8086 .

        1.1 CuĆ¹ phaĆ¹p leƤnh hĆ“ĆÆp ngƶƵ

         MoƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ bao goĆ m moƤt loaĆÆt caĆ¹c meƤnh ƱeĆ  ( statement) ƱƶƓĆÆc
vieĆ”t lieĆ¢n tieĆ”p nhau , moĆ£i meƤnh ƱeĆ  ƱƶƓĆÆc vieĆ”t treĆ¢n 1 doĆøng .
         MoƤt meƤnh ƱeĆ  coĆ¹ theĆ„ laĆø :
ā€¢ moƤt leƤnh ( instruction) : ƱƶƓĆÆc trƬnh bieĆ¢n dĆ²ch ( Assembler =ASM) chuyeĆ„n thaĆønh
    maƵ maĆ¹y.
ā€¢ moƤt chƦ daĆ£n cuĆ»a Assembler ( Assembler directive) : ASM khoĆ¢ng chuyeĆ„n thaĆønh
    maƵ maĆ¹y
         CaĆ¹c meƤnh ƱeĆ  cuĆ»a ASM goĆ m 4 trƶƓĆøng :
        Name              Operation                  Operand(s)                Comment
        caĆ¹c trƶƓĆøng caĆ¹ch nhau Ć­t nhaĆ”t laĆø moƤt kyĆ¹ tƶĆÆ troĆ”ng hoaĆ«c moƤt kyĆ¹ tƶĆÆ TAB
        vĆ­ duĆÆ leƤnh ƱeĆ  sau :
        START :          MOV CX,5 ; khƓƦ taĆÆo thanh ghi CX
        Sau ƱaĆ¢y laĆø moƤt chƦ daĆ£n cuĆ»a ASM :
        MAIN             PROC                    ; taĆÆo moƤt thuĆ» tuĆÆc coĆ¹ teĆ¢n laĆø MAIN

         1.1.1 TrƶƓĆøng TeĆ¢n ( Name Field)
         TrƶƓĆøng teĆ¢n ƱƶƓĆÆc duĆøng cho nhaƵn leƤnh , teĆ¢n thuĆ» tuĆÆc vaĆø teĆ¢n bieĆ”n . ASM seƵ
chuyeĆ„n teĆ¢n thaĆønh Ć±Ć²a chƦ boƤ nhĆ“Ć¹ .
         TeĆ¢n coĆ¹ theĆ„ daĆøi tƶĆø 1 ƱeĆ”n 31 kyĆ¹ tƶĆÆ . Trong teĆ¢n chĆ¶Ć¹a caĆ¹c kyĆ¹ tƶĆÆ tƶĆø a-z , caĆ¹c soĆ” vaĆø
caĆ¹c kyĆ¹ tƶĆÆ Ć±aĆ«c bieƤt sau : ? ,@ , _ , $ vaĆø daĆ”u . KhoĆ¢ng ƱƶƓĆÆc pheĆ¹p coĆ¹ kyĆ¹ tƶĆÆ troĆ”ng trong
phaĆ n teĆ¢n . NeĆ”u trong teĆ¢n coĆ¹ kyĆ¹ tƶĆÆ . thƬ noĆ¹ phaĆ»i laĆø kyĆ¹ tƶĆÆ Ć±aĆ u tieĆ¢n . TeĆ¢n khoĆ¢ng ƱƶƓĆÆc
baĆ©t ƱaĆ u baĆØng moƤt soĆ” . ASM khoĆ¢ng phaĆ¢n bieƤt giƶƵa kyĆ¹ tƶĆÆ vieĆ”t thƶƓĆøng vaĆø vieĆ”t hoa .
         Sau ƱaĆ¢y laĆø caĆ¹c vĆ­ duĆÆ veĆ  teĆ¢n hĆ“ĆÆp leƤ vaĆø khoĆ¢ng hĆ“ĆÆp leƤ trong ASM .

                 TeĆ¢n hoƤp leƤ                       TeĆ¢n khoĆ¢ng hĆ“ĆÆp leƤ
                 COUNTER1                            TWO WORDS
                 @CHARACTER                          2ABC
                 SUM_OF_DIGITS                       A45.28
                 DONE?                               YOU&ME
                 .TEST                               ADD-REPEAT
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                                  2



          1.1.2 TrƶƓĆøng toaĆ¹n tƶƻ ( operation field)
          ƑoĆ”i vĆ“Ć¹i 1 leƤnh trƶƓĆøng toaĆ¹n tƶƻ chƶaĆ¹ kyĆ¹ hieƤu ( sumbol) cuĆ»a maƵ pheĆ¹p toaĆ¹n (
operation code = OPCODE) .ASM seƵ chuyeĆ„n kyĆ¹ hieƤu maƵ pheĆ¹p toaĆ¹n thaĆønh maƵ maĆ¹y .
ThoĆ¢ng thƶƓĆøng kyĆ¹ hieƤu maƵ pheĆ¹p toaĆ¹n moĆ¢ taĆ» chĆ¶Ć¹c naĆŖng cuĆ»a pheĆ¹p toaĆ¹n , vĆ­ duĆÆ ADD ,
SUB , INC , DEC , INT ...
          ƑoĆ”i vĆ“Ć¹i chƦ daĆ£n cuĆ»a ASM , trƶƓĆøng toaĆ¹n tƶƻ chƶaĆ¹ moƤt opcode giaĆ» (pseudo
operation code = pseudo-op) . ASM khoĆ¢ng chuyeĆ„n pseudo-op thaĆønh maƵ maĆ¹y maĆø
hĆ¶Ć“Ć¹ng daĆ£n ASM thƶĆÆc hieƤn moƤt vieƤc gƬ ƱoĆ¹ vĆ­ duĆÆ taĆÆo ra moƤt thuĆ» tuĆÆc , Ć±Ć²nh nghĆ³a caĆ¹c
bieƔn ...

        1.1.3 TrƶƓĆøng caĆ¹c toaĆ¹n haĆÆng ( operand(s) field)
        Trong moƤt leƤnh trƶƓĆøng toaĆ¹n haĆÆng chƦ ra caĆ¹c soĆ” lieƤu tham gia trong leƤnh ƱoĆ¹.
MoƤt leƤnh coĆ¹ theĆ„ khoĆ¢ng coĆ¹ toaĆ¹n haĆÆng , coĆ¹ 1 hoaĆ«c 2 toaĆ¹n haĆÆng . VĆ­ duĆÆ :
        NOP                       ; khoĆ¢ng coĆ¹ toaĆ¹n haĆÆng
        INC AX                    ; 1 toaĆ¹n haĆÆng
        ADD WORD1,2               ; 2 toaĆ¹n haĆÆng coƤng 2 vĆ“Ć¹i noƤi dung cuĆ»a tƶĆø nhĆ“Ć¹ WORD1
        Trong caĆ¹c leƤnh 2 toaĆ¹n haĆÆng toaĆ¹n haĆÆng ƱaĆ u laĆø toaĆ¹n haĆÆng Ʊƭch ( destination
operand) . ToaĆ¹n haĆÆng Ʊƭch thƶƓĆøng laĆøthanh ghi hoaĆ«c vĆ² trĆ­ nhĆ“Ć¹ duĆøng ƱeĆ„ lƶu trƶƵ keĆ”t
quaĆ» . ToaĆ¹n haĆÆng thĆ¶Ć¹ hai laĆø toaĆ¹n haĆÆng nguoĆ n . ToaĆ¹n haĆÆng nguoĆ n thƶƓĆøng khoĆ¢ng bĆ² thay
ƱoĆ„i sau khi thƶĆÆc hieƤn leƤnh .
        ƑoĆ”i vĆ“Ć¹i moƤt chƦ daĆ£n cuĆ»a ASM , trƶƓĆøng toaĆ¹n haĆÆng chĆ¶Ć¹a moƤt hoaĆ«c nhieĆ u thoĆ¢ng
tin maĆø ASM duĆøng ƱeĆ„ thƶĆÆc thi chƦ daĆ£n .

         1.1.4 TrƶƓĆøng chuĆ¹ thĆ­ch ( comment field)
         TrƶƓĆøng chuĆ¹ thĆ­ch laĆø moƤt tuyĆø choĆÆn cuĆ»a meƤnh ƱeĆ  trong ngoĆ¢n ngƶƵ ASM . LaƤp
trƬnh vieĆ¢n duĆøng trƶƓĆøng chuĆ¹ thĆ­ch ƱeĆ„ thuyeĆ”t minh veĆ  caĆ¢u leƤnh . ƑieĆ u naĆøy laĆø caĆ n thieĆ”t
vƬ ngoĆ¢n ngƶƵ ASM laĆø ngoĆ¢n ngƶƵ caĆ”p thaĆ”p ( low level) vƬ vaƤy seƵ raĆ”t khoĆ¹ hieĆ„u chƶƓng
trƬnh neĆ”u noĆ¹ khoĆ¢ng ƱƶƓĆÆc chuĆ¹ thĆ­ch moƤt caĆ¹ch ƱaĆ y ƱuĆ» vaĆø roĆ» raĆøng . Tuy nhieĆ¢n khoĆ¢ng neĆ¢n
coĆ¹ chuĆ¹ thĆ­ch ƱoĆ”i vĆ“Ć¹i moĆÆi doĆøng cuĆ»a chƶƓng trƬnh , keĆ„ caĆ» nnhƶƵng leƤnh maĆø yĆ¹ nghĆ³a cuĆ»a
noĆ¹ ƱaƵ raĆ”t roĆ» raĆøng nhƶ :
         NOP               ; khoĆ¢ng laĆøm chi caĆ»
         NgƶƓĆøi ta duĆøng daĆ”u chaĆ”m phaĆ„y (;) ƱeĆ„ baĆ©t ƱaĆ u trƶƓĆøng chuĆ¹ thĆ­ch .
         ASM cuƵng cho pheĆ¹p duĆøng toaĆøn boƤ moƤt doĆøng cho chuĆ¹ thĆ­ch ƱeĆ„ taĆÆo moƤt khoaĆ»ng
troĆ”ng ngaĆŖn caĆ¹ch caĆ¹c phaĆ n khaĆ¹c nhau cuaĆ» chƶƓng trƬnh ,vĆ­ duĆÆ :
         ;
         ; khĆ“Ć»i taĆÆo caĆ¹c thanh ghi
         ;
         MOV AX,0
         MOV BX,0
         1.2       CaĆ¹c kieĆ„u soĆ” lieƤu trong chƶƓng trƬnh hĆ“ĆÆp ngƶƵ
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                                   3



          CPU chƦ laĆøm vieƤc vĆ“Ć¹i caĆ¹c soĆ” nhĆ² phaĆ¢n . VƬ vaƤy ASM phaĆ»i chuyeĆ„n taĆ”t caĆ» caĆ¹c
loaĆÆi soĆ” lieƤu thaĆønh soĆ” nhĆ² phaĆ¢n . Trong moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ cho pheĆ¹p bieĆ„u dieĆ£n
soĆ” lieƤu dĆ¶Ć“Ć¹i daĆÆng nhĆ² phaĆ¢n , thaƤp phaĆ¢n hoaĆ«c thaƤp luĆÆc phaĆ¢n vaĆø thaƤm chĆ­ laĆø caĆ» kyĆ¹ tƶĆÆ
nƶƻa .
          1.2.1 CaĆ¹c soĆ”
          MoƤt soĆ” nhĆ² phaĆ¢n laĆø moƤt daƵy caĆ¹c bit 0 vaĆø 1 va 2phaĆ»i keĆ”t thuĆ¹c baĆØng h hoaĆ«c H
          MoƤt soĆ” thaƤp phaĆ¢n laĆø moƤt daƵy caĆ¹c chƶƵ soĆ¹ thaƤp phaĆ¢n vaĆø keĆ”t thuĆ¹c bĆ“Ć»i d hoaĆ«c D
( coĆ¹ theĆ„ khoĆ¢ng caĆ n)
          MoƤt soĆ” hex phaĆ»i baĆ©t ƱaĆ u bĆ“Ć»i 1 chƶƵ soĆ” thaƤp phaĆ¢n vaĆø phaĆ»i keĆ”t thuĆ¹c bĆ“Ć»i h hoaĆ«c
H.
          Sau ƱaĆ¢y laĆø caĆ¹c bieĆ„u dieĆ£n soĆ” hĆ“ĆÆp leƤ vaĆø khoĆ¢ng hĆ“ĆÆp leƤ trong ASM :
                  SoĆ”                       LoaĆÆi
                  10111                     thaƤp phaĆ¢n
                  10111b                    nhĆ² phaĆ¢n
                  64223                     thaƤp phaĆ¢n
                  -2183D                    thaƤp phaĆ¢n
                  1B4DH                     hex
                  1B4D                      soĆ” hex khoĆ¢ng hĆ“ĆÆp leƤ
                  FFFFH                              soĆ” hex khoĆ¢ng hĆ“ĆÆp leƤ
                  0FFFFH                    soĆ” hex

        1.2.2 CaĆ¹c kyĆ¹ tƶĆÆ
        KyĆ¹ tƶĆÆ vaĆø moƤt chuoĆ£i caĆ¹c kyĆ¹ tƶĆÆ phaĆ»i ƱƶƓĆÆc ƱoĆ¹ng giƶƵa hai daĆ”u ngoaĆ«c ƱƓn hoaĆ«c
hai daĆ”u ngoaĆ«c keĆ¹p . VĆ­ duĆÆ ā€˜Aā€™ vaĆø ā€œHELLOā€ . CaĆ¹c kyĆ¹ tƶĆÆ Ć±eĆ u ƱƶƓĆÆc chuyeĆ„n thaĆønh maƵ
ASCII bĆ“Ć»i ASM . Do ƱoĆ¹ trong moƤt chƶƓng trƬnh ASM seƵ xem khai baĆ¹o ā€˜Aā€™ vaĆø 41h (
maƵ ASCII cuĆ»a A) laĆø gioĆ”ng nhau .



         1.3      CaĆ¹c bieĆ”n ( variables)
         Trong ASM bieĆ”n ƱoĆ¹ng vai troĆø nhƶ trong ngoĆ¢n ngƶƵ caĆ”p cao . MoĆ£i bieĆ”n coĆ¹ moƤt
loaĆÆi dƶƵ lieƤu vaĆø noĆ¹ ƱƶƓĆÆc gaĆ¹n moƤt Ć±Ć²a chƦ boƤ nhĆ“Ć¹ sau khi dĆ²ch chƶƓng trƬnh . BaĆ»ng sau
ƱaĆ¢y lieƤt keĆ¢ caĆ¹c toaĆ¹n tƶƻ giaĆ» duĆøng ƱeĆ„ Ć±Ć²nh nghĆ³a caĆ¹c loaĆÆi soĆ” lieƤu .
                  PSEUDO-OP                STANDS FOR
                  DB                       define byte
                  DW                       define word ( doublebyte)
                  DD                       define doubeword ( 2 tƶĆø lieĆ¢n tieĆ”p)
                  DQ                       define quadword ( 4 tƶĆø lieĆ¢n tieĆ”p )
                  DT                       define tenbytes ( 10 bytes lieĆ¢n tieĆ”p)
                  1.3.1. BieƔn byte
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                                   4


                 ChƦ daĆ£n cuĆ»a ASM ƱeĆ„ Ć±Ć²nh nghĆ³a bieĆ”n byte coĆ¹ daĆÆng nhƶ sau :
                 NAME                      DB              initial_value
                          VĆ­ duĆÆ :
                 ALPHA             DB      4
                 ChƦ daĆ£n naĆøy seƵ gaĆ¹n teĆ¢n ALPHA cho moƤt byte nhĆ“Ć¹ trong boƤ nhĆ“Ć¹ maĆø giaĆ¹
trĆ² ban ƱaĆ u cuĆ»a noĆ¹ laĆø 4 . NeĆ”u giaĆ¹ trĆ² cuĆ»a byte laĆø khoĆ¢ng xaĆ¹c Ć±Ć²nh thƬ ƱaĆ«t daĆ”u chaĆ”m hoĆ»i
( ?) vaĆøo giaĆ¹ trĆ² ban ƱaĆ u . VĆ­ duĆÆ :
                 BYT               DB      ?
                 ƑoĆ”i vĆ“Ć¹i bieĆ”n byte vuĆøng giaĆ¹ trĆ² khaĆ» dĆ³ maĆø noĆ¹ lƶu trƶƵ ƱƶƓĆÆc laĆø -128 ƱeĆ”n
127 ƱoĆ”i vĆ“Ć¹i soĆ” coĆ¹ daĆ”u vaĆø 0 ƱeĆ”n 255 ƱoĆ”i vĆ“Ć¹i soĆ” khoĆ¢ng daĆ”u .

                1.3.2 BieĆ”n tƶĆø

                 ChƦ daĆ£n cuĆ»a ASM ƱeĆ„ Ć±Ć²nh nghĆ³a moƤt bieĆ”n tƶĆø nhƶ sau :
                 NAME                      DW             initial_value
                 VĆ­ duĆÆ :
                 WRD             DW               -2
                 CuƵng coĆ¹ theĆ„ duĆøng daĆ”u ? ƱeĆ„ thay theĆ” cho bieĆ”n tƶĆø coĆ¹ giaĆ¹ trĆ² khoĆ¢ng xaĆ¹c
Ć±Ć²nh . VuĆøng giaĆ¹ trĆ² cuĆ»a bieĆ”n tƶĆø laĆø -32768 ƱeĆ”n 32767 ƱoĆ”i vĆ“Ć¹i soĆ” coĆ¹ daĆ”u vaĆø 0 ƱeĆ”n 56535
ƱoĆ”i vĆ“Ć¹i soĆ” khoĆ¢ng daĆ”u .

                1.3.3 Maƻng ( arrays)

                 Trong ASM moƤt maĆ»ng laĆø moƤt loaĆÆt caĆ¹c byte nhĆ“Ć¹ hoaĆ«c tƶĆø nhĆ“Ć¹ lieĆ¢n tieĆ”p
nhau . VĆ­ duĆÆ Ć±eĆ„ Ć±Ć²nh nghĆ³a moƤt maĆ»ng 3 byte goĆÆi laĆø B_ARRAY maĆø giaĆ¹ trĆ² ban ƱaĆ u
cuĆ»a noĆ¹ laĆø 10h,20h vaĆø 30h chuĆ¹ng ta coĆ¹ theĆ„ vieĆ”t :
                 B_ARRAY DB            10h,20h,30h
                  B_ARRAY laĆø teĆ¢n ƱƶƓĆÆc gaĆ¹n cho byte ƱaĆ u tieĆ¢n
                  B_ARRAY+1 laĆø teĆ¢n cuĆ»a byte thĆ¶Ć¹ hai
                  B_ARRAY+2 laĆø teĆ¢n cuĆ»a byte thĆ¶Ć¹ ba
         NeĆ”u ASM gaĆ¹n Ć±Ć²a chƦ offset laĆø 0200h cho maĆ»ng B_ARRAY thƬ noƤi dung boƤ
nhĆ“Ć¹ seƵ nhƶ sau :

        SYMBOL                   ADDRESS                  CONTENTS
        B_ARRAY                  200h                     10h
        B_ARRAY+1                201h                     20h
        B_ARRAY+2                202h                     30h

        ChƦ daĆ£n sau ƱaĆ¢y seƵ Ć±Ć²nh nghĆ³a moƤt maĆ»ng 4 phaĆ n tƶƻ coĆ¹ teĆ¢n laĆø W_ARRAY:

        W_ARRAY DW               1000,40,29887,329
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                                   5


        GiaĆ» sƶƻ maĆ»ng baĆ©t ƱaĆ u taĆÆi 0300h thƬ boƤ nhĆ“Ć¹ seƵ nhƶ sau:
        SYMBOL                   ADDRESS                  CONTENTS
        W_ARRAY                  300h                     1000d
        W_ARRAY+2                302h                     40d
        W_ARRAY+4                304h                     29887d
        W_ARRAY+6                306h                     329d

         Byte thaĆ”p vaĆø byte cao cuĆ»a moƤt tƶĆø
         ƑoĆ¢i khi chuĆ¹ng ta caĆ n truy xuaĆ”t tĆ“Ć¹i byte thaĆ”p vaĆø byte cao cuĆ»a moƤt bieĆ”n tƶĆø . GiaĆ»
sƶƻ chuĆ¹ng ta Ć±Ć²nh nghĆ³a :
         WORD1           DW 1234h
         Byte thaĆ”p cuĆ»a WORD1 chĆ¶Ć¹a 34h , coĆøn byte cao cuĆ»a WORD1 chĆ¶Ć¹a 12h
         KyĆ¹ hieƤu Ć±Ć²a chƦ cuĆ»a byte thaĆ”p laĆø WORD1 coĆøn kyĆ¹ hieƤu Ć±Ć²a chƦ cuĆ»a byte cao laĆø
WORD1+1 .

       ChuoĆ£i caĆ¹c kyĆ¹ tƶĆÆ ( character strings)
       MoƤt maĆ»ng caĆ¹c maƵ ASCII coĆ¹ theĆ„ ƱƶƓĆÆc Ć±Ć²nh nghĆ³a baĆØng moƤt chuoĆ£i caĆ¹c kyĆ¹ tƶĆÆ
       VĆ­ duĆÆ :
       LETTERS          DW 41h,42h,43h
       tƶƓng ƱƶƓng vĆ“Ć¹i
       LETTERS          DW ā€˜ABC ā€™
       BeĆ¢n trong moƤt chuoĆ£i , ASM seƵ phaĆ¢n bieƤt chƶƵ hoa vaĆø chƶƵ thƶƓĆøng . VƬ vaƤy chuoĆ£i
ā€˜abcā€™ seƵ ƱƶƓĆÆc chuyeĆ„n thaĆønh 3 bytes : 61h ,62h vaĆø 63h.
       Trong ASM cuƵng coĆ¹ theĆ„ toĆ„ hĆ“ĆÆp caĆ¹c kyĆ¹ tƶĆÆ vaĆø caĆ¹c soĆ” trong moƤt Ć±Ć²nh nghĆ³a . VĆ­
duĆÆ :
       MSG DB           ā€˜HELLOā€™, 0AH, 0DH, ā€˜$ā€™
       tƶƓng ƱƶƓng vĆ“Ć¹i
       MSG DB           48H,45H,4CH,4Ch,4FH,0AH,0DH,24H

        1.4 CaĆ¹c haĆØng ( constants)

        Trong moƤt chƶƓng trƬnh caĆ¹c haĆØng coĆ¹ theĆ„ ƱƶƓĆÆc ƱaĆ«t teĆ¢n nhĆ“Ćø chƦ daĆ£n EQU
(equates) . CuĆ¹ phaĆ¹p cuĆ»a EQU laĆø :
        NAME                    EQU constant
        vĆ­ duĆÆ :
        LF       EQU 0AH
        sau khi coĆ¹ khai baĆ¹o treĆ¢n thƬ LF ƱƶƓĆÆc duĆøng thay cho 0Ah trong chƶƓng trƬnh . VƬ
vaƤy ASM seƵ chuyeĆ£n caĆ¹c leƤnh :
        MOV DL,0Ah
vaĆø     MOV DL,LF
thaĆønh cuĆøng moƤt maƵ maĆ¹y .
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                                   6


        CuƵng coĆ¹ theĆ„ duĆøng EQU ƱeĆ„ Ć±Ć²nh nghĆ³a moƤt chuoĆ£i , vĆ­ duĆÆ:
        PROMPT          EQU ā€˜TYPE YOUR NAME ā€™
        Sau khi coĆ¹ khai baĆ¹o naĆøy , thay cho
                MSG DB           ā€˜TYPE YOUR NAME ā€™
        chuĆ¹ng ta coĆ¹ theĆ„ vieĆ”t
                MSG DB           PROMPT

        1.5     CaĆ¹c leƤnh cĆ“ baĆ»n

        CPU 8086 coĆ¹ haĆøng traĆŖm leƤnh , trong chƶƓng naĆøy ,chuĆ¹ng ta seƵ xem xeĆ¹t 7 leƤnh
ƱƓn giaĆ»n cuĆ»a 8086 maĆø chuĆ¹ng thƶƓĆøng ƱƶƓĆÆc duĆøng vĆ“Ć¹i caĆ¹c thao taĆ¹c di chuyeĆ„n soĆ” lieƤu vaĆø
thƶĆÆc hieƤn caĆ¹c pheĆ¹p toaĆ¹n soĆ” hoĆÆc .
        Trong phaĆ n sau ƱaĆ¢y , WORD1 vaĆø WORD2 laĆø caĆ¹c bieĆ”n tƶĆø , BYTE1 vaĆø
BYTE2 laĆø caĆ¹c bieĆ”n byte .

        1.5.1 LeƤnh MOV vaĆø XCHG
        LeƤnh MOV duĆøng ƱeĆ„ chuyeĆ„n soĆ” lieƤu giƶƵa caĆ¹c thanh ghi , giƶƵa 1 thanh ghi vaĆø
moƤt vĆ² trĆ­ nhĆ“Ć¹ hoaĆ«c ƱeĆ„ di chuyeĆ„n trƶĆÆc tieĆ”p moƤt soĆ” ƱeĆ”n moƤt thanh ghi hoaĆ«c moƤt vĆ² trĆ­
nhĆ“Ć¹ . CuĆ¹ phaĆ¹p cuĆ»a leƤnh MOV laĆø :
        MOV Destination , Source
        Sau ƱaĆ¢y laĆø vaĆøi vĆ­ duĆÆ :
        MOV AX,WORD1 ; laĆ”y noƤi dung cuĆ»a tƶĆø nhĆ“Ć¹ WORD1 Ʊƶa vaĆøo thanh ghi AX
        MOV AX,BX                 ; AX laĆ”y noƤi dung cuĆ»a BX , BX khoĆ¢ng thay ƱoĆ„i
        MOV AH,ā€™Aā€™                ; AX laĆ”y giaĆ¹ trĆ² 41h
        BaĆ»ng sau cho thaĆ”y caĆ¹c trƶƓĆøng hĆ“ĆÆp cho pheĆ¹p hoaĆ«c caĆ”m cuĆ»a leƤnh MOV

                                        Destination operand
source operand        General Reg      Segment Reg      Memory Location           Constant
General Reg               Y                   Y               Y                       NO
Segment Reg               Y                  NO               Y                       NO
MemoryLocation            Y                   Y              NO                       NO
Constant                  Y                  NO               Y                       NO



        LeƤnh XCHG ( Exchange) duĆøng ƱeĆ„ trao ƱoĆ„i noƤi dung cuĆ»a 2 thanh ghi hoaĆ«c cuĆ»a
moƤt thanh ghi vaĆø moƤt vĆ² trĆ­ nhĆ“Ć¹ . VĆ­ duĆÆ : XCHG AH,BL
        XCHG                    AX,WORD1 ; trao ƱoĆ„i noƤi dung cuĆ»a thanh ghi AX vaĆø tƶĆø
nhĆ“Ć¹ WORD1.
        CuƵng nhƶ leƤnh MOV coĆ¹ moƤt soĆ” haĆÆn cheĆ” ƱoĆ”i vĆ“Ć¹i leƤnh XCHG nhƶ baĆ»ng sau :
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                                     7


                                Destination operand
Source operand           General           Memory Locatin
                         Register
General Memory           Y                 Y
Memory Location          Y                 No

        1.5.2 LeƤnh ADD, SUB, INC , DEC
        LeƤnh ADD vaĆø SUB ƱƶƓĆÆc duĆøng ƱeĆ„ coƤng vaĆø trƶĆø noƤi dung cuĆ»a 2 thanh ghi , cuĆ»a
moƤt thanh ghi vaĆø moƤt vĆ² trĆ­ nhĆ“Ć¹ , hoaĆ«c coƤng ( trƶĆø) moƤt soĆ” vĆ“Ć¹i (khoĆ»i) moƤt thanh ghi
hoaĆ«c moƤt vĆ² trĆ­ nhĆ“Ć¹ . CuĆ¹ phaĆ¹p laĆø :
        ADD Destination , Source
        SUB Destination , Source
        VĆ­ duĆÆ :
        ADD WORD1, AX
        ADD BL , 5
        SUB AX,DX                 ; AX=AX-DX
        VƬ lyĆ¹ do kyƵ thuaƤt , leƤnh ADD vaĆø SUB cuƵng bĆ² moƤt soĆ” haĆÆn cheĆ” nhƶ baĆ»ng sau:

                                 Destination operand
      Source operand             General Reg      Memory Loacation
      Gen Memory                       Y                 Y
      Memory Location                  Y                NO
      Constant                         Y                 Y

        VieƤc coƤng hoaĆ«c trƶĆø trƶĆÆc tieĆ”p giƶƵa 2 vĆ² trĆ­ nhĆ“Ć¹ laĆø khoĆ¢ng ƱƶƓĆÆc pheĆ¹p . ƑeĆ„ giaĆ»i
quyeĆ”t vaĆ”n ƱeĆ  naĆøy ngƶƓĆøi ta phaĆ»i di chuyeĆ„n byte ( tƶĆø ) nhĆ“Ć¹ ƱeĆ”n moƤt thanh ghi sau ƱoĆ¹
mĆ“Ć¹i coƤng hoaĆ«c trƶĆø thanh ghi naĆøy vĆ“Ć¹i moƤt byte ( tƶĆø ) nhĆ“Ć¹ khaĆ¹c . VĆ­ duĆÆ:
        MOV AL, BYTE2
        ADD BYTE1, AL

         LeƤnh INC ( incremrent) ƱeĆ„ coƤng theĆ¢m 1 vaĆøo noƤi dung cuĆ»a moƤt thanh ghi hoaĆ«c
moƤt vĆ² trĆ­ nhĆ“Ć¹ . LeƤnh DEC ( decrement) ƱeĆ„ giaĆ»m bĆ“Ć¹t 1 khoĆ»i moƤt thanh ghi hoaĆ«c 1 vĆ²
trĆ­ nhĆ“Ć¹ . CuĆ¹ phaĆ¹p cuĆ»a chuĆ¹ng laĆø :
                  INC Destination
                  DEC Destination
         VĆ­ duĆÆ :
         INC WORD1
         INC AX
         DEC BL
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                                 8


          1.5.3 LeƤnh NEG ( negative)
          LeƤnh NEG ƱeĆ„ ƱoĆ„i daĆ”u ( laĆ”y buĆø 2 ) cuĆ»a moƤt thanh ghi hoaĆ«c moƤt vĆ² trĆ­ nhĆ“Ć¹ . CuĆ¹
phaĆ¹p :
          NEG destination
          VĆ­ duĆÆ : NEG AX ;
          GiaĆ» sƶƻ AX=0002h sau khi thƶĆÆc hieƤn leƤnh NEG AX thƬ AX=FFFEh

LƖU Yƙ : 2 toaĆ¹n haĆÆng trong caĆ¹c leƤnh treĆ¢n ƱaĆ¢y phaĆ»i cuĆøng loaĆÆi ( cuĆøng laĆø byte hoaĆ«c tƶĆø )

          1.6     ChuyeĆ„n ngoĆ¢n ngƶƵ caĆ”p cao thaĆønh ngoĆ¢n ngƶƵ ASM

          GiaĆ» sƶƻ A vaĆø B laĆø 2 bieĆ”n tƶĆø .
          ChuĆ¹ng ta seƵ chuyeĆ„n caĆ¹c meƤnh ƱeĆ  sau trong ngoĆ¢n ngƶƵ caĆ”p cao ra ngoĆ¢n ngƶƵ
ASM .
          1.6.1 MeƤnh ƱeƠ B=A
                  MOV AX,A                ; Ʊƶa A vaĆøo AX
                  MOV B,AX                ; Ʊƶa AX vaĆøo B
          1.6.2 MeƤnh ƱeƠ A=5-A
                  MOV AX,5                ; Ʊƶa 5 vaĆøo AX
                  SUB AX,A                ; AX=5-A
                  MOV A,AX                ; A=5-A
          caĆ¹ch khaĆ¹c :
                  NEG A                   ;A=-A
                  ADD A,5                 ;A=5-A
          1.6.3 MeƤnh ƱeƠ A=B-2*A
                  MOV AX,B                ;Ax=B
                  SUB AX,A                ;AX=B-A
                  SUB AX,A                ;AX=B-2*A
                  MOV A,AX                ;A=B-2*A

        1.7     CaĆ”u truĆ¹c cuĆ»a moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ
        MoƤt chƶƓng trƬnh ngoĆ¢n ngƶƵ maĆ¹y bao goĆ m maƵ ( code) , soĆ” lieƤu ( data) vaĆø ngaĆŖn
xeĆ”p (stack ) . MoĆ£i moƤt phaĆ n chieĆ”m moƤt ƱoaĆÆn boƤ nhĆ“Ć¹ . MoĆ£i moƤt ƱoaĆÆn chƶƓng trƬnh laĆø
ƱƶƓĆÆc chuyeĆ„n thaĆønh moƤt ƱoaĆÆn boƤ nhĆ“Ć¹ bĆ“Ć»i ASM .

    1.7.1 CaĆ¹c kieĆ„u boƤ nhĆ“Ć¹ ( memory models)
    ƑoƤ lĆ“Ć¹n cuĆ»a maƵ vaĆø soĆ” lieƤu trong moƤt chƶƓng trƬnh ƱƶƓĆÆc quy Ć±Ć²nh bĆ“Ć»i chƦ daĆ£n
MODEL nhaĆØm xaĆ¹c Ć±Ć²nh kieĆ„u boƤ nhĆ“Ć¹ duĆøng vĆ“Ć¹i chƶƓng trƬnh . CuĆ¹ phaĆ¹p cuĆ»a chƦ daĆ£n
MODEL nhƶ sau :
    .MODEL          memory_model
    BaĆ»ng sau cho thaĆ”y caĆ¹c kieĆ„u boƤ nhĆ“Ć¹ :
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                                   9



           MODEL                  DESCRITION
           SMALL                  code vaĆø data naĆØm trong 1 ƱoaĆÆn
           MEDIUM                 code nhieĆ u hĆ“n 1 ƱoaĆÆn , data trong 1 ƱoaĆÆn
           COMPACT                data nhieĆ u hĆ“n 1 ƱoĆÆan , code trong 1 ƱoaĆÆn
           LARGE                  code vaĆø dayta lĆ“Ć¹n hĆ“n 1 ƱoaĆÆn , array khoĆ¢ng quĆ¹a 64KB
           HUGE                   code ,data lĆ“Ć¹n hĆ“Ć¹n 1 ƱoaĆÆn , array lĆ“Ć¹n hĆ“n 64KB

         1.7.2 ƑoaĆÆn soĆ” lieƤu
         ƑoaĆÆn soĆ” lieƤu cuĆ»a chƶƓng trƬnh chƶaĆ¹ caĆ¹c khai baĆ¹o bieĆ”n , khai baĆ¹o haĆØng ... ƑeĆ„
baĆ©t ƱaĆ u ƱoaĆÆn soĆ” lieƤu chuĆ¹ng ta duĆøng chƦ daĆ£n DATA vĆ“Ć¹i cuĆ¹ phaĆ¹p nhƶ sau :
                  .DATA
                  ;khai baĆ¹o teĆ¢n caĆ¹c bieĆ”n , haĆØng vaĆø maƵng
         vĆ­ duĆÆ :
                  .DATA
                  WORD1           DW 2
                  WORD2           DW 5
                  MSG             DB       ā€˜THIS IS A MESSAGE ā€™
                  MASK                     EQU 10010010B

        1.7.3 ƑoaĆÆn ngaĆŖn xeĆ”p
        MuĆÆc Ʊƭch cuĆ»a vieƤc khai baĆ¹o ƱoaĆÆn ngaĆŖn xeĆ”p laĆø daĆønh moƤt vuĆøng nhĆ“Ć¹ ( vuĆøng
satck) ƱeĆ„ lƶu trƶƵ cho stack . CuĆ¹ phaĆ¹p cuĆ»a leƤnh nhƶ sau :
               .STACK          size
        neĆ”u khoĆ¢ng khai baĆ¹o size thƬ 1KB ƱƶƓĆÆc daĆønh cho vuĆøng stack .
               .STACK          100h ; daĆønh 256 bytes cho vuĆøng stack

       1.7.4 ƑoĆÆan maƵ
       ƑoaĆÆn maƵ chƶaĆ¹ caĆ¹c leƤnh cuĆ»a chƶƓng trƬnh . BaĆ©t ƱaĆ u ƱoaĆÆn maƵ baĆØng chƦ daĆ£n
CODE nhƶ sau :
              .CODE
              BeĆ¢n trong ƱoaĆÆn maƵ caĆ¹c leƤnh thƶƓĆøng ƱƶƓĆÆc toĆ„ chĆ¶Ć¹c thaĆønh thuĆ» tuĆÆc
(procedure) maĆø caĆ”u truĆ¹c cuĆ»a moƤt thuĆ» tuĆÆc nhƶ sau :

        name           PROC
        ; body of the procedure
        name           ENDP

         Sau ƱaĆ¢y laĆø caĆ¢uĆ¹ truĆ¹c cuĆ»a moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ maĆø phaĆ n CODE laĆø thuĆ» tuĆÆc
coĆ¹ teĆ¢n laĆø MAIN
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                           10



       .MODEL            SMALL
       .STACK            100h
       .DATA
       ; Ć±Ć²nh nghĆ³a soĆ” lieƤu taĆÆi ƱaĆ¢y
       .CODE
       MAIN              PROC
       ;thaĆ¢n cuĆ»a thuĆ» tuĆÆc MAIN
       MAIN              ENDP
       ; caĆ¹c thuĆ» tuĆÆc khaĆ¹c neĆ”u coĆ¹
       END               MAIN


               1.8 CaĆ¹c leƤnh vaĆøo ra

        CPU thoĆ¢ng tin vĆ“Ć¹i caĆ¹c ngoaĆÆi vi thoĆ¢ng qua caĆ¹c coĆ„ng IO . LeƤnh IN vaĆø OUT cuĆ»a
CPU cho pheĆ¹p truy xuaĆ”t ƱeĆ”n caĆ¹c coĆ„ng naĆøy . Tuy nhieĆ¢n haĆ u heĆ”t caĆ¹c Ć¶Ć¹ng duĆÆng khoĆ¢ng
duĆøng leƤnh IN vaĆø OUT vƬ 2 lyĆ¹ do:
ā€¢ caĆ¹c Ć±Ć²a chƦ coĆ„ng thay ƱoĆ„i tuyĆø theo loaĆÆi maĆ¹y tĆ­nh
ā€¢ coĆ¹ theĆ„ laƤp trƬnh cho caĆ¹c IO deĆ£ daĆøng hĆ“n nhĆ“Ćø caĆ¹c chƶƓng trƬnh con ( routine) ƱƶƓĆÆc
    cung caĆ”p bĆ“Ć»i caĆ¹c haƵng cheĆ” taĆÆo maĆ¹y tĆ­nh
        CoĆ¹ 2 loaĆÆi chƶƓng trƬnh phuĆÆc vuĆÆ IO laĆø : caĆ¹c routine cuĆ»a BIOS ( Basic Input
Output System) vaĆø caĆ¹c routine cuĆ»a DOS .
        LeƤnh INT ( interrupt)
        ƑeĆ„ goĆÆi caĆ¹c chƶƓng trƬnh con cuĆ»a BIOS vaĆø DOS coĆ¹ theĆ„ duĆøng leƤnh INT vĆ“Ć¹i cuĆ¹
phaĆ¹p nhƶ sau :
                 INT interrupt_number
        Ć“Ć» ƱaĆ¢y interrupt_number laĆø moƤt soĆ” maĆø noĆ¹ chƦ Ć±Ć²nh moƤt routine . VĆ­ duĆÆ INT 16h
goĆÆi routine thƶĆÆc hieƤn vieƤc nhaƤp soĆ” lieƤu tƶĆø Keyboard .




       1.8.1 LeƤnh INT 21h

       INT 21h ƱƶƓĆÆc duĆøng ƱeĆ„ goĆÆi moƤt soĆ” lĆ“Ć¹n caĆ¹c caĆ¹c haĆøm ( function) cuĆ»a DOS . TuyĆø
theo giaĆ¹ trĆ² maĆø chuĆ¹ng ta ƱaĆ«t vaĆøo thanh ghi AH , INT 21h seƵ goĆÆi chaĆÆy moƤt routine
tƶƓng Ć¶Ć¹ng .
       Trong phaĆ n naĆøy chuĆ¹ng ta seƵ quan taĆ¢m ƱeĆ”n 2 haĆøm sau ƱaĆ¢y :
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                               11


        FUNCTION NUMBER                         ROUTINE
            1                                   Single key input
            2                                   Single character output

        FUNTION 1 : Single key input
             Input : AH=1
             Output:AL= ASCII code if character key is pressed
                     AL=0 if non character key is pressed

        ƑeĆ„ goĆÆi routine naĆøy thƶĆÆc hieƤn caĆ¹c leƤnh sau :
                MOV AH,1 ; input key function
                INT 21h         ; ASCII code in AL and display character on the screen


         FUNTION 2 : Display a character or execute a control function
                  Input : AH=2
                           DL=ASCII code of the the display character or control
character
                  Output:AL= ASCII code of the the display character or control
character
         CaĆ¹c leƤnh sau seƵ in leĆ¢n maĆøn hƬnh daĆ”u ?
                  MOV AH,2
                  MOV DL,ā€™?ā€™ ; character is ā€˜?ā€™
                  INT 21H ; display character
         HaĆøm 2 cuƵng coĆ¹ theĆ„ duĆøng ƱeĆ„ thƶĆÆc hieƤn chĆ¶Ć¹c naĆŖng ƱieĆ u khieĆ„n .NeĆ”u DL chƶaĆ¹ kyĆ¹
tƶĆÆ Ć±ieĆ u khieĆ„n thƬ khi goĆÆi INT 21h , kyĆ¹ tƶĆÆ Ć±ieĆ u khieĆ„n seƵ ƱƶƓĆÆc thƶĆÆc hieƤn .
         CaĆ¹c kyĆ¹ tƶĆÆ Ć±ieĆ u khieĆ„n thƶƓĆøng duĆøng laĆø :

        ASCII code (Hex)        SYMBOL                  FUNCTION
              7                 BEL                     beep
              8                 BS                      backspace
              9                 HT                      tab
              A                 LF                      line feed
              D                 CR                      carriage return



        1.9       ChƶƓng trƬnh ƱaĆ u tieĆ¢n
        ChuĆ¹ng ta seƵ vieĆ”t moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ nhaĆØm ƱoĆÆc moƤt kyĆ¹ tƶĆÆ tƶĆø baĆøn phĆ­m
vaĆø in noĆ¹ treĆ¢n ƱaĆ u doĆøng mĆ“Ć¹i .
        TITLE             PGM1: ECHO PROGRAM
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                              12


        .MODEL            SMALL
        .STACK            100H
        .CODE
        MAIN              PROC
        ; display daƔu nhaƩc
                 MOV AH,2
                 MOV DL,ā€™?ā€™
                 INT 21H
        ; nhaƤp 1 kyĆ¹ tƶĆÆ
                 MOV AH,1 ; haĆøm ƱoĆÆc kyĆ¹ tƶĆÆ
                 INT 21H        ; kyĆ¹ tƶĆÆ Ć±Ć¶Ć“ĆÆc Ʊƶa vaĆøo AL
                 MOV BL,AL                ; caĆ”t kyĆ¹ tƶĆÆ trong BL
        ; nhaĆ»y ƱeĆ”n doĆøng mĆ“Ć¹i
                 MOV AH,2 ; haĆøm xuaĆ”t 1 kyĆ¹ tƶĆÆ
                 MOV DL,0DH               ; kyĆ¹ tƶĆÆ carriage return
                 INT 21H                  , thƶĆÆc hieƤn carriage return
                 MOV DL,0AH               ; kyĆ¹ tƶĆÆ line feed
                 INT 21H                  ; thƶĆÆc hieƤn line feed
        ; xuaĆ”t kyĆ¹ tƶĆÆ
                 MOV DL,BL                          ; Ʊƶa kyĆ¹ tƶĆÆ vaĆøo DL
                 INT 21H                  ; xuaĆ”t kyĆ¹ tƶĆÆ
        ; trƓƻ veƠ DOS
                 MOV AH,4CH               ; haĆøm thoaĆ¹t veĆ  DOS
                 INT 21H                  ; exit to DOS
        MAIN ENDP
                 END MAIN




        1.10 TaĆÆo ra vaĆø chaĆÆy moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ

        CoĆ¹ 4 bĆ¶Ć“Ć¹c ƱeĆ„ taĆÆo ra vaĆø chaĆÆy moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ laĆø :
ā€¢ DuĆøng moƤt trƬnh soaĆÆn thaĆ»o vaĆŖn baĆ»n ƱeĆ„ taĆÆo ra taƤp tin chƶƓng trƬnh nguoĆ n ( source
    program file ) .
ā€¢ DuĆøng moƤt trƬnh bieĆ¢n dĆ²ch (Assembler ) ƱeĆ„ taĆÆo ra taƤp tin ƱoĆ”i tƶƓĆÆng (object file)
ngoĆ¢n ngƶƵ maĆ¹y
ā€¢ DuĆøng trƬnh LINK ƱeĆ„ lieĆ¢n keĆ”t moƤt hoaĆ«c nhieĆ u taƤp tin ƱoĆ”i tƶƓĆÆng roĆ i taĆÆo ra file thƶĆÆc
thi ƱƶƓĆÆc .
ā€¢ Cho thƶĆÆc hieƤn taƤp tin EXE hoaĆ«c COM .

        BĆ¶Ć“Ć¹c 1 : TaĆÆo ra chƶƓng trƬnh nguoĆ n
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                                13


       DuĆøng moƤt trƬnh soaĆÆn thaĆ»o vaĆŖn baĆ»n (NC chaĆŗng haĆÆn) ƱeĆ„ taĆÆo ra chƶƓng trƬnh
nguoĆ n .VĆ­ duĆÆ laĆ”t teĆ¢n laĆø PGM1.ASM. PhaĆ n mĆ“Ć» roƤng ASM laĆø phaĆ n mĆ“Ć» roƤng quy Ć¶Ć“Ć¹c ƱeĆ„
Assembler nhaƤn ra chƶƓng trƬnh nguoƠn .

        BĆ¶Ć“Ć¹c 2 :BieĆ¢n dĆ²ch chƶƓng trƬnh
        ChuĆ¹ng ta seƵ duĆøng MASM ( Microsoft Macro Assembler ) ƱeĆ„ chuyeĆ„n taƤp tin
nguoĆ n PGM1.ASM thaĆønh taƤp tin ƱoĆ”i tƶƓĆÆng ngoĆ¢n ngƶƵ maĆ¹y goĆ² laĆø PGM1.OBJ baĆØng
leƤnh sau :
        MASM PGM1;
        Sau khi in thoĆ¢ng tin veĆ  baĆ»n quyeĆ n MASM seƵ kieĆ„m tra file nguoĆ n ƱeĆ„ tƬm loĆ£i cuĆ¹
phaĆ¹p . NeĆ”u coĆ¹ loĆ£i thƬ MASM seƵ inra soĆ” doĆøng bĆ² loĆ£i vaĆø moƤt moƤ taĆ» ngaĆ©n veĆ  loĆ£i ƱoĆ¹ .
NeĆ”u khoĆ¢ng coĆ¹ loĆ£i thƬ MASM seƵ chuyeĆ„n PGM1.ASM thaĆønh taƤo tin ƱoĆ”i tƶƓĆÆng ngoĆ¢n ngƶƵ
maĆ¹y goĆÆi laĆø PGM1.OBJ .
        DaĆ”u chaĆ”m phaĆ„y sau leƤnh MASM PGM1 coĆ¹ nghĆ³a laĆø chuĆ¹ng ta khoĆ¢ng muoĆ”n taĆÆo
ra moƤt taƤp tin ƱoĆ”i tƶƓĆÆ ng coĆ¹ teĆ¢n khaĆ¹c vĆ“Ć¹i PGM1 . NeĆ”u khoĆ¢ng coĆ¹ daĆ”u chaĆ”m phaĆ„y sau
leƤnh thƬ MASM seƵ yeĆ¢u caĆ u chuĆ¹ng ta goƵ vaĆøo teĆ¢n cuĆ»a moƤt soĆ” taƤp tin maĆø noĆ¹ coĆ¹ theĆ„ taĆÆo
ra nhƶ hƬnh dĆ¶Ć“Ć¹i ƱaĆ¢y :

        Object file name [ PGM1.OBJ]:
        Source listing [NUL.LIST]       : PGM1
        Cross-reference [NUL.CRF]                : PGM1
        TeĆ¢n maĆ«c nhieĆ¢n laĆø NUL coĆ¹ nghĆ³a laĆø khoĆ¢ng taĆÆo ra file tƶƓng Ć¶Ć¹ng trƶĆø khi laƤp
trƬnh vieĆ¢n goƵ vaĆøo teĆ¢n taƤp tin .

         TaƤp tin danh saĆ¹ch nguoĆ n ( source listing file) : laĆø moƤt taƤp tin Text coĆ¹ ƱaĆ¹nh soĆ”
doĆøng , trong ƱoĆ¹ maƵ hĆ“ĆÆp ngƶƵ vaĆø maƵ nguoĆ n naĆØm caĆÆnh nhau . TaƤp tin naĆøy thƶƓĆøng duĆøng
ƱeĆ„ gƓƵ roĆ”i chƶƓng trƬnh nguoĆ n vƬ MASM thoĆ¢ng baĆ¹o loĆ£i theo soĆ” doĆøng .

        TaƤp tin tham chieĆ”u cheĆ¹o ( Cross -Reference File ) : laĆø 1 taƤp tin chĆ¶Ć¹a danh
saĆ¹ch caĆ¹c teĆ¢n maĆø chuĆ¹ng xuaĆ”t hieƤn trong chƶƓng trƬnh keĆøm theo soĆ” doĆøng maĆø teĆ¢n aĆ”y
xuaĆ”t hieƤn . TaƤp tin naĆøy ƱƶoĆÆc duĆøng ƱeĆ„ tƬm caĆ¹c bieĆ”n vaĆø nhaƵn trong moƤt chƶƓng trƬnh
lĆ“Ć¹n .

        BĆ¶Ć“Ć¹c 3 : LieĆ¢n keĆ”t chƶƓng trƬnh
        TaƤp tin ƱoĆ”i tƶƓĆÆng taĆÆo ra Ć“Ć» bĆ¶Ć“Ć¹c 2 laĆø moƤt taƤp tin ngoĆ¢n ngƶƵ maĆ¹y nhƶng noĆ¹
khoĆ¢ng chaĆÆy ƱƶƓĆÆc vƬ chƶa coĆ¹ daĆÆng thĆ­ch hĆ“ĆÆp cuĆ»a 1 file chaĆÆy . HĆ“n nƶƵa noĆ¹ chƶa bieĆ”t
chƶƓng trƬnh ƱƶƓĆÆc naĆÆp vaĆøo vĆ² trĆ­ naĆøo treĆ¢n boƤ nhĆ“Ć¹ ƱeĆ„ chaĆÆy . MoƤt soĆ” Ć±Ć²a chƦ dĆ¶Ć“Ć¹i daĆÆng
maƵ maĆ¹y coĆ¹ theĆ„ bĆ² thieĆ”u .
        TrƬnh LINK seƵ lieĆ¢n keĆ”t moƤt hoaĆ«c nhieĆ u file ƱoĆ¹i tƶƓĆÆng thaĆønh moƤt file chaĆÆy duy
nhaĆ”t ( *.EXE ) .TaƤp tin naĆøy coĆ¹ theĆ„ ƱƶƓĆÆc naĆÆp vaĆøo boƤ nhĆ“Ć¹ vaĆø thi haĆønh .
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                                     14


        ƑeĆ„ lieĆ¢n keĆ”t chƶƓng trƬnh ta goƵ :
        LINK PGM1;
        NeĆ”u khoĆ¢ng coĆ¹ daĆ”u chaĆ”m phaĆ„y ASM seƵ yeĆ¢u caĆ¢uĆø chuĆ¹ng ta goƵ vaĆøo teĆ¢n taƤp tin
thƶĆÆc thi .

     BĆ¶Ć“Ć¹c 4 : ChaĆÆy chƶƓng trƬnh
     TƶĆø daĆ”u nhaĆ©c leƤnh coĆ¹ theĆ„ chaĆÆy chƶƓng trƬnh baĆØng caĆ¹ch goƵ teĆ¢n noĆ¹ roĆ i nhaĆ”n
ENTER .

        1.11 XuaĆ”t moƤt chuoĆ£i kyĆ¹ tƶĆÆ

         Trong chƶƓng trƬnh PGM1 treĆ¢n ƱaĆ¢y chuĆ¹ng ta ƱaƵ duĆøng INT 21H haĆøm 2 vaĆø 4 ƱeĆ„
ƱoĆÆc vaĆø xuaĆ”t moƤt kyĆ¹ tƶĆÆ . HaĆøm 9 ngaĆ©t 21H coĆ¹ theĆ„ duĆøng ƱeĆ„ xuaĆ”t moƤt chuoĆ£i kyĆ¹ tƶĆÆ .

        INT 21H , Function 9 : Display a string
        Input : DX=offset address of string
        The string must end with a ā€˜$ā€™ character

         KyĆ¹ tƶĆÆ $ Ć“Ć» cuoĆ”i chuoĆ£i seƵ khoĆ¢ng ƱƶƓĆÆc in leĆ¢n maĆøn hƬnh . NeĆ”u chuoĆ£i coĆ¹ chĆ¶Ć¹a kyĆ¹
tƶĆÆ Ć±ieĆ u khieĆ„n thƬ chĆ¶Ć¹c naĆŖng ƱieĆ u khieĆ„n tƶƓng Ć¶Ć¹ng seƵ ƱƶƓĆÆc thƶĆÆc hieƤn .
         ChuĆ¹ng ta seƵ vieĆ”t 1 chƶƓng trƬnh in leĆ¢n maĆøn hƬnh chuoĆ£i ā€œHELLO!ā€ . ThoĆ¢ng
ƱieƤp HELLO ƱƶƓĆÆc Ć±Ć²nh nghĆ³a nhƶ sau trong ƱoaĆÆn soĆ” lieƤu :

        MSG DB          ā€˜HELLO!$ā€™

        LeƤnh LEA ( Load Effective Address )

        LEA     destnation , source

        NgaĆ©t 21h , haĆøm soĆ” 9 seƵ xuaĆ”t moƤt chuoĆ£i kyĆ¹ tƶĆÆ ra maĆøn hƬnh vĆ“Ć¹i ƱieĆ u kieƤn Ć±Ć²a chƦ
hieƤu duĆÆng cuĆ»a bieĆ”n chuoĆ£i phaĆ»i Ć“Ć» treĆ¢n DX . CoĆ¹ theĆ„ thƶĆÆc hieƤn ƱieĆ u naĆøy bĆ“Ć»i leƤnh :
                LEA DX,MSG                ; Ʊƶa Ć±Ć²a chƦ offset cuĆ»a bieĆ”n MSG vaĆøo DX

         Program Segment Prefix ( PSP ) : PhaĆ n ƱaĆ u cuĆ»a ƱoaĆÆn chƶƓng trƬnh
         Khi moƤt chƶƓng trƬnh ƱƶƓĆÆc naĆÆp vaĆøo boƤ nhĆ“Ć¹ maĆ¹y tĆ­nh , DOS daĆønh ra 256 byte
cho caĆ¹i goĆÆi laĆø PSP . PSP chƶaĆ¹ moƤt soĆ” thoĆ¢ng tin veĆ  chƶƓng trƬnh Ʊang ƱƶƓĆÆc naĆÆp trong
boƤ nhĆ“Ć¹ . ƑeĆ„ cho caĆ¹c chƶƓng trƬnh coĆ¹ theĆ„ truy xuaĆ”t tĆ“Ć¹i PSP , DOS ƱaĆ«t soĆ” phaĆ¢n ƱoaĆÆn
cuĆ»a noĆ¹ (PSP) trong caĆ» DS vaĆø ES trĆ¶Ć“Ć¹c khi thƶĆÆc thi chƶƓng trƬnh . KeĆ”t quĆ»a laĆø thanh
ghi DS khoĆ¢ng chĆ¶Ć¹a soĆ” ƱoaĆÆn cuĆ»a ƱoaĆÆn soĆ” lieƤu cuĆ»a chƶƓng trƬnh . ƑeĆ„ khaĆ©c phuĆÆc ƱieĆ u
naĆøy , moƤt chƶƓng trƬnh coĆ¹ chĆ¶Ć¹a ƱoaĆÆn soĆ” lieƤu phaĆ»i ƱƶƓĆÆc baĆ©t ƱaĆ u bĆ“Ć»i 2 leƤnh sau ƱaĆ¢y :
                  MOV AX,@DATA
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                               15


              MOV DS,AX
     Ɣƛ ƱaĆ¢y @DATA laĆø teĆ¢n cuĆ»a ƱoaĆÆn soĆ” lieƤu ƱƶƓĆÆc Ć±Ć²nh nghĆ³a bĆ“Ć»i DATA .
Assembler seƵ chuyeĆ„n @DATA thaĆønh soĆ” ƱoaĆÆn .

        Sau ƱaĆ¢y laĆø chƶƓng trƬnh hoaĆøn chƦnh ƱeĆ„ xuaĆ”t chuoĆ£i kyĆ¹ tƶĆÆ HELLO!

        TITLE          PGM2: PRINT STRING PROGRAM
        .MODEL         SMALL
        .STACK         100H
        .DATA
        MSG DB         ā€˜HELLO!$ā€™
        .CODE
        MAIN           PROC
        ; initialize DS
                 MOV AX,@DATA
                 MOV DS,AX
        ; display message
                 LEA DX,MSG
                 MOV AH,9
                 INT 21H
        ; return to DOS
                 MOV AH,4CH
                 INT 21H
        MAIN                ENDP
                 END MAIN



        1.12 ChƶƓng trƬnh ƱoĆ„i chƶƵ thƶƓĆøng sang chƶƵ hoa

                ChuĆ¹ng ta seƵ vieĆ”t 1 chƶƓng trƬnh yeĆ¢u caĆ u ngƶƓĆøi duĆøng goƵ vaĆøo moƤt kyĆ¹ tƶĆÆ
baĆØng chƶƵ thƶƓĆøng . ChƶƓng trƬnh seƵ ƱoĆ„i noĆ¹ sang daĆÆng chƶƵ hoa roĆ i in ra Ć“Ć» doĆøng tieĆ”p
theo .

        TITLE           PGM3: CASE COVERT PROGRAM
        .MODEL          SMALL
        .STACK          100H
        .DATA
              CR        EQU     0DH
              LF        EQU     0AH
        MSG1            DB      ā€˜ENTER A LOWER CASE LETTER:$ā€™
        MSG2            DB      0DH,0AH,ā€™IN UPPER CASE IT IS :ā€™
ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ                                                               16


      CHAR            DB      ?,ā€™$ā€™    ; Ć±Ć²nh nghĆ³a bieĆ”n CHAR coĆ¹ giaĆ¹ trĆ² ban ƱaĆ u chƶa
                                       ;xaĆ¹c Ć±Ć²nh
      .CODE
      MAIN               PROC
      ; INITIALIZE                        DS
               MOV               AX,@DATA
               MOV               DS,AX
      ;PRINT PROMPT USER
               LEA DX,MSG1                ; laĆ”y thoĆ¢ng ƱieƤp soĆ” 1
               MOV AH,9
               INT 21H                    ; xuaĆ”t noĆ¹ ra maĆøn hƬnh
      ;nhaƤp vaĆøo moƤt kyĆ¹ tƶĆÆ thƶƓĆøng vaĆø ƱoĆ„i noĆ¹ thaĆønh kyĆ¹ tƶĆÆ hoa
               MOV AH,1                   ; nhaƤp vaĆøo 1 kyĆ¹ tƶĆÆ
               INT 21H                    ; caĆ”t noĆ¹ trong AL
               SUB AL,20H                 ; ƱoĆ„i thaĆønh chƶƵ hoa vaĆø caĆ”t noĆ¹ trong AL
               MOV CHAR, AL ; caĆ”t kyĆ¹ tƶĆÆ trong bieĆ”n CHAR
      ; xuaĆ”t kyĆ¹ tƶĆÆ treĆ¢n doĆøng tieĆ”p theo
               LEA DX, MSG2 ; laĆ”y thoĆ¢ng ƱieƤp thĆ¶Ć¹ 2
               MOV AH,9
               INT 21H                    ; xuaĆ”t chuoĆ£i kyĆ¹ tƶĆÆ thĆ¶Ć¹ hai , vƬ MSG2 khoĆ¢ng keĆ”t
      ;thuĆ¹c bĆ“Ć»i kyĆ¹ tƶĆÆ $ neĆ¢n noĆ¹ tieĆ”p tuĆÆc xuaĆ”t kyĆ¹ tƶĆÆ coĆ¹ trong bieĆ”n CHAR
      ;dos exit
               MOV AH,4CH
               INT 21H                    ; dos exit
      MAIN               ENDP
               END MAIN
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                                     17
       ChƶƓng 2 : TraĆÆng thaĆ¹i cuĆ»a vi xƶƻ lyĆ¹ vaĆø caĆ¹c thanh ghi cĆ“Ćø



      Trong chƶƓng naĆøy chuĆ¹ng ta seƵ xem xeĆ¹t caĆ¹c thanh ghi
cĆ“Ćø cuĆ»a vi xƶƻ lyĆ¹ vaĆø aĆ»nh hƶƓƻng cuĆ»a caĆ¹c leƤnh maĆ¹y ƱeĆ”n caĆ¹c
thanh ghi cĆ“Ćø nhƶ theĆ” naĆøo . TraĆÆng thaĆ¹i cuĆ»a caĆ¹c thanh ghi laĆø
caĆŖn cĆ¶Ć¹ ƱeĆ„ chƶƓng trƬnh coĆ¹ theĆ„ thƶĆÆc hieƤn leƤnh nhaĆ»y , reĆ»
nhaĆ¹nh vaĆø laĆ«p .
      MoƤt phaĆ n cuĆ»a chƶƓng naĆøy seƵ giĆ“Ć¹i thieƤu chƶƓng trƬnh
DEBUG cuƻa DOS .

           2.1 CaĆ¹c thanh ghi cĆ“Ćø ( Flags register)

      ƑieĆ„m khaĆ¹c bieƤt quan troĆÆng cuĆ»a maĆ¹y tĆ­nh so vĆ“Ć¹i caĆ¹c
      thieĆ”t bĆ² ƱieƤn tƶƻ khaĆ¹c laĆø khaĆ» naĆŖng cho caĆ¹c quyeĆ”t Ć±Ć²nh
      . MoƤt maĆÆch ƱaĆ«c bieƤt trong CPU coĆ¹ theĆ„ laĆøm caĆ¹c quyeĆ”t
      Ć±Ć²nh naĆøy baĆØng caĆ¹ch caĆŖn cĆ¶Ć¹ vaĆøo traĆÆng thaĆ¹i hieƤn haĆønh
      cuĆ»a CPU . CoĆ¹ moƤt thanh ghi ƱaĆ«c bieƤt cho bieĆ”t traĆÆng
      thaĆ¹i cuĆ»a CPU ƱoĆ¹ laĆø thanh ghi cĆ“Ćø .
      BaĆ»ng 2.1 cho thaĆ”y thanh ghi cĆ“Ćø 16 bit cuĆ»a 8086

       11 10 9 8             7        6   5   4 3   2    1    0
       O D IF T              S        Z       A     P         C
       F F     F             F        F       F     F         F

                     BaĆ»ng 2.1 :Thanh ghi cĆ“Ćø cuĆ»a 8086
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                             18


MuĆÆc Ʊƭch cuĆ»a caĆ¹c thanh ghi cĆ“Ćø laĆø chƦ ra traĆÆng thaĆ¹i cuĆ»a
CPU .CoĆ¹ hai loaĆÆi cĆ“Ćø laĆø cĆ“Ćø traĆÆng thaĆ¹i ( status flags) vaĆø cĆ“Ćø
ƱieĆ u khieĆ„n (control flags) . CĆ“Ćø traĆÆng thaĆ¹i phaĆ»n aĆ¹nh caĆ¹c
keĆ”t quĆ»a thƶĆÆc hieƤn leƤnh cuĆ»a CPU . BaĆ»ng 2.2 chƦ ra teĆ¢n vaĆø
kyĆ¹ hieƤu caĆ¹c thanh ghi cĆ“Ćø trong 8086 .

                    Bit          Name          Symbol
                     0       Carry flag          CF
                     2       Parity flag         PF
                     4       Auxiliary           AF
                             carry flag
                      6      Zero flag          ZF
                      7      Sign flag          SF
                     11      Overflow flag      OF
                      8      Trap flag          TF
                      9      Interrrupt flag    IF
                     10      Direction flag     DF

                     BaĆ»ng 2.2 : CaĆ¹c cĆ“Ćø cuĆ»a 8086

      MoĆ£i bit treĆ¢n thanh ghi cĆ“Ćø phaĆ»n aĆ¹nh 1 traĆÆng thaĆ¹i cuĆ»a
      CPU .

      CaĆ¹c cĆ“Ćø traĆÆng thaĆ¹i ( status flags)
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                              19

      CaĆ¹c cĆ“Ćø traĆÆng thaĆ¹i phaĆ»n aĆ¹nh keĆ”t quaĆ» cuĆ»a caĆ¹c pheĆ¹p
toaĆ¹n . VĆ­ duĆÆ sau khi thƶĆÆc hieƤn leƤnh SUB AX,AX cĆ“Ćø ZF
=1 , nghĆ³a laĆø keĆ”t quĆ»a cuĆ»a pheĆ¹p trƶĆø laĆø zero .
      CĆ“Ćø nhĆ“Ć¹ ( Carry Flag - CF) : CF=1 neĆ”u xuaĆ”t hieƤn bit
nhĆ“Ć¹ (carry) tƶĆø vĆ² trĆ­ MSB trong khi thƶĆÆc hieƤn pheĆ¹p coƤng
hoaĆ«c coĆ¹ bit mƶƓĆÆn ( borrow ) taĆÆi MSB trong khi thƶĆÆc hieƤn
pheĆ¹p trƶĆø . Trong caĆ¹c trƶƓĆøng hĆ“ĆÆp khaĆ¹c CF=0 . CĆ“Ćø CF cuƵng
bĆ² aĆ»nh hƶƓƻng bĆ“Ć»i leƤnh dĆ²ch ( Shift) vaĆø quay ( Rotate) soĆ”
lieƤu .
      CĆ“Ćø chaĆŗn leĆ» ( Parity Flag - PF) : PF=1 neĆ”u byte thaĆ”p
cuĆ»a keĆ”t quĆ»a coĆ¹ toĆ„ng soĆ” con soĆ” 1 laĆø moƤt soĆ” chaĆŗn ( even
parity). PF=0 neĆ”u byte thaĆ”p laĆø chaĆŗn leĆ» leĆ» (old parity ). VĆ­
duĆÆ neĆ”u keĆ”t quĆ»a laĆø FFFEh thƬ PF=0
      CĆ“Ćø nhĆ“Ć¹ phuĆÆ ( Auxiliary Carry Flag - AF ) :AF =1 neĆ”u
coĆ¹ nhĆ“Ć¹ ( mƶƓĆÆn) tƶĆø bit thĆ¶Ć¹ 3 trong pheĆ¹p coƤng ( trƶĆø) .
      CĆ“Ćø Zero ( Zero Flag -ZF) : ZF=1 neĆ”u keĆ”t quĆ»a laĆø soĆ” 0 .
      CĆ“Ćø daĆ”u ( Sign Flag - SF ) : SF=1 neĆ”u MSB cuĆ»a keĆ”t
quĆ»a laĆø 1 ( keĆ”t quĆ»a laĆø soĆ” aĆ¢m ) . SF=0 neĆ”u MSB=0
        CĆ“Ćø traĆøn ( Overflow Flag - OF ) : OF=1 neĆ”u xaĆ»y ra
traĆøn soĆ” trong khi thƶĆÆc hieƤn caĆ¹c pheĆ¹p toaĆ¹n . Sau ƱaĆ¢y
chuĆ¹ng ta seƵ phaĆ¢n tĆ­ch caĆ¹c trƶƓĆøng hĆ“ĆÆp xaĆ»y ra traĆøn trong
khi thƶĆÆc hieƤn tĆ­nh toaĆ¹n . HieƤn tƶƓĆÆng traĆøn soĆ” lieĆ¢n quan ƱeĆ”n
vieƤc bieĆ£u dieĆ£n soĆ” trong maĆ¹y tĆ­nh vĆ“Ć¹i moƤt soĆ” hƶƵu haĆÆn caĆ¹c
bit . CaĆ¹c soĆ” thaƤp phaĆ¢n coĆ¹ daĆ”u bieĆ£u dieĆ£n bĆ“Ć»i 1 byte laĆø -
128 ƱeĆ”n +127 . NeĆ”u bieĆ£u dieĆ£n baĆØng 1 tƶĆø (16 bit) thƬ caĆ¹c
soĆ” thaƤp phaĆ¢n coĆ¹ theĆ„ bieĆ£u dieĆ£n laĆø -32768 ƱeĆ”n +32767 . ƑoĆ”i
vĆ“Ć¹i caĆ¹c soĆ” khoĆ¢ng daĆ”u , daĆ»i caĆ¹c soĆ” coĆ¹ theĆ„ bieĆ£u dieĆ£n trong
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                                 20

moƤt tƶĆø laĆø 0 ƱeĆ”n 65535 , trong moƤt byte laĆø 0 ƱeĆ”n 255 . NeĆ”u
keĆ”t quĆ»a cuĆ»a moƤt pheĆ¹p toaĆ¹n vƶƓĆÆt ra ngoaĆøi daƵi soĆ” coĆ¹ theĆ„
bieĆ£u dieĆ£n thƬ xaĆ»y ra sƶĆÆ traĆøn soĆ” . Khi coĆ¹ sƶĆÆ traĆøn soĆ” keĆ”t quĆ»a
thu ƱƶƓĆÆc seƵ bĆ² sai .

      2.2 TraĆøn ( overflow)
       CoĆ¹ 2 loaĆÆi traĆøn soĆ” : TraĆøn coĆ¹ daĆ”u ( signed overflow)
vaĆø traĆøn khoĆ¢ng daĆ”u ( unsigned overflow) . Khi thƶĆÆc hieƤn
pheĆ¹p coƤng soĆ” hoĆÆc chaĆŗng haĆÆn pheĆ¹p coƤng , seƵ xaĆ»y ra 4 khaĆ»
naĆŖng sau ƱaĆ¢y :
      1) khoĆ¢ng traĆøn
      2) chƦ traĆøn daĆ”u
      3) chƦ traĆøn khoĆ¢ng daĆ”u
      4) traĆøn caĆ» daĆ”u vaĆø khoĆ¢ng daĆ”u
      VĆ­ duĆÆ cuĆ»a traĆøn khoĆ¢ng daĆ”u laĆø pheĆ¹p coƤng ADD AX,BX
vĆ“Ć¹i AX=0FFFFh , BX=0001h .KeĆ”t quĆ»a dĆ¶Ć“Ć¹i daĆÆng nhĆ² phaĆ¢n
laĆø :




              1111 1111 1111 1111
              0000 0000 0000 0001

             10000 0000 0000 0000
      NeĆ”u dieĆ£n giaĆ»i keĆ”t quĆ»a dĆ¶Ć“Ć¹i daĆÆng khoĆ¢ng daĆ”u thƬ keĆ”t
      quĆ»a laĆø ƱuĆ¹ng ( 10000h=65536) . Nhƶng keĆ”t quĆ»a ƱaƵ
      vƶƓĆÆt quaĆ¹ ƱoƤ lĆ“Ć¹n cuĆ»a tƶĆø nhĆ“Ć¹ . Bit 1 ( bit nhĆ“Ć¹ tƶĆø vĆ² trĆ­
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                             21

     MSB ) ƱaƵ xaĆ»y ra vaĆø keĆ”t quĆ»a treĆ¢n AX =0000h laĆø sai .
     SƶĆÆ traĆøn nhƶ theĆ” laĆø traĆøn khoĆ¢ng daĆ”u . NeĆ”u xem raĆØng
     pheĆ¹p coƤng treĆ¢n ƱaĆ¢y laĆø pheĆ¹p coƤng hai soĆ” coĆ¹ daĆ”u thƬ
     keĆ”t quĆ»a treĆ¢n AX = 0000h laĆø ƱuĆ¹ng , vƬ FFFFh = -1 ,
     coĆøn 0001h = +1 , do ƱoĆ¹ keĆ”t quĆ»a pheĆ¹p coƤng laĆø 0 . VaƤy
     trong trƶƓĆøng hĆ“ĆÆp naĆøy sƶĆÆ traĆøn daĆ”u khoĆ¢ng xaĆ»y ra .
     VĆ­ duĆÆ veĆ  sƶĆÆ traĆøn daĆ”u : giaĆ» sƶƻ AX = BX = 7FFFh ,
leƤnh ADD AX,BX seƵ cho keƔt quƻa nhƶ sau :

                     0111 1111 1111 1111
                     0111 1111 1111 1111

                 1111 1111 1111 1110 = FFFE h
     BieĆ£u dieĆ£n coĆ¹ daĆ”u vaĆø khoĆ¢ng daĆ”u cuĆ»a 7FFFh laĆø
3276710 . Nhƶ vaƤy laĆø ƱoĆ”i vĆ“Ć¹i pheĆ¹p coƤng coĆ¹ daĆ”u cuƵng nhƶ
khoĆ¢ng daĆ”u thƬ keĆ”t quĆ»a vaĆ£n laĆø 32767 + 32767 = 65534 . SoĆ”
naĆøy(65534) ƱaƵ vƶƓĆÆt ngoaĆøi daƵi giaĆ¹ trĆ² maĆø 1 soĆ” 16 bit coĆ¹
daĆ”u coĆ¹ theĆ„ bieĆ£u dieĆ£n . HĆ“n nƶƻa FFFEh = -2 . Do vaƤy sƶĆÆ
traĆøn daĆ”u ƱaƵ xaĆ»y ra .
     Trong trƶƓĆøng hĆ“ĆÆp xaĆ»y ra traĆøn , CPU seƵ bieĆ„u thĆ² sƶĆÆ
traĆøn nhƶ sau :
ā€¢ CPU seƵ set OF =1 neĆ”u xaĆ»y ra traĆøn daĆ”u
ā€¢ CPU seƵ set CF = 1 neĆ”u xaĆ»y ra traĆøn khoĆ¢ng daĆ”u
     Sau khi coĆ¹ traĆøn , moƤt chƶƓng trƬnh hĆ“ĆÆp lyĆ¹ seƵ ƱƶƓĆÆc
thƶĆÆc hieƤn ƱeĆ„ sƶƻa sai keĆ”t quĆ»a ngay laƤp tĆ¶Ć¹c . CaĆ¹c laƤp trƬnh
vieĆ¢n seƵ chƦ phaĆ»i quan taĆ¢m tĆ“Ć¹i cĆ“Ćø OF hoaĆ«c CF neĆ”u bieĆ£u
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                            22

dieĆ£n soĆ” cuĆ»a hoĆÆ laĆø coĆ¹ daĆ”u hay khoĆ¢ng daĆ”u moƤt caĆ¹ch tƶƓng
Ć¶Ć¹ng .
     VaƤy thƬ laĆøm theĆ” naĆøo ƱeĆ„ CPU bieĆ”t ƱƶƓĆÆc coĆ¹ traĆøn ?
ā€¢ TraĆøn khoĆ¢ng daĆ”u seƵ xaĆ»y ra khi coĆ¹ moƤt bit nhĆ“Ć¹ ( hoaĆ«c
   mƶƓĆÆn ) tƶĆø MSB
ā€¢ TraĆøn daĆ”u seƵ xaĆ»y ra trong caĆ¹c trƶƓĆøng hĆ“ĆÆp sau :
             a) Khi coƤng hai soĆ” cuĆøng daĆ”u , sƶĆÆ traĆøn daĆ”u xaĆ»y
ra khi toĆ„ng coĆ¹ daĆ”u khaĆ¹c vĆ“Ć¹i hai toaĆ¹n haĆÆng ban ƱaĆ u .
Trong vĆ­ duĆÆ 2 , coƤng hai soĆ” 7FFFh +7FFFh ( hai soĆ” dƶƓng
) nhƶng keĆ”t quĆ»a laĆø FFFFh ( soĆ” aĆ¢m)
            b) Khi trƶĆø hai soĆ” khaĆ¹c daĆ”u ( gioĆ”ng nhƶ coƤng hai
soĆ” cuĆøng daĆ”u) keĆ”t quĆ»a phaĆ»i coĆ¹ daĆ”u hĆ“ĆÆp lyĆ¹ .NeĆ”u keĆ”t quĆ»a
cho daĆ”u khoĆ¢ng nhƶ mong ƱƓĆÆi thƬ coĆ¹ nghĆ³a laĆø ƱaƵ xaĆ»y ra sƶĆÆ
traĆøn daĆ”u . VĆ­ duĆÆ 8000h - 0001h = 7FFFh ( soĆ” dƶƓng ) . Do
ƱoĆ¹ OF=1 .
     VaƤy laĆøm theĆ” naĆøo ƱeĆ„ CPU chƦ ra raĆØng coĆ¹ traĆøn ?
           ā€¢ OF=1 neĆ”u traĆøn daĆ”u
           ā€¢ CF=1 neĆ”u traĆøn khoĆ¢ng daĆ”u
     LaĆøm theĆ” naĆøo ƱeĆ„ CPU bieĆ”t laĆø coĆ¹ traĆøn ?
ā€¢ TraĆøn khoĆ¢ng daĆ”u xaĆ»y ra khi coĆ¹ soĆ” nhĆ“Ć¹ ( carry) hoaĆ«c
   mƶƓĆÆn ( borrow) tƶĆø MSB
ā€¢ TraĆøn daĆ”u xaĆ»y ra khi coƤng hai soĆ” cuĆøng daĆ”u ( hoaĆ«c trƶĆø 2
soĆ” khaĆ¹c daĆ”u ) maĆø keĆ”t quĆ»a vĆ“Ć¹i daĆ”u khaĆ¹c vĆ“Ć¹i daĆ”u mong ƱƓĆÆi
. PheĆ¹p coƤng hai soĆ” coĆ¹ daĆ”u khaĆ¹c nhau khoĆ¢ng theĆ„ xaĆ»y ra sƶĆÆ
traĆøn . TreĆ¢n thƶĆÆc teĆ” CPU duĆøng phƶƓng phaĆ¹p sau : cĆ“Ćø OF=1
neĆ”u soĆ” nhĆ“Ć¹ vaĆøo vaĆø soĆ” nhĆ“Ć¹ ra tƶĆø MSB laĆø khoĆ¢ng phuĆø hĆ“ĆÆp :
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                             23

nghĆ³a laĆø coĆ¹ nhĆ“Ć¹ vaĆøo nhƶng khoĆ¢ng coĆ¹ nhĆ“Ć¹ ra hoaĆ«c coĆ¹ nhĆ“Ć¹
ra nhƶng khoĆ¢ng coĆ¹ nhĆ“Ć¹ vaĆøo .




      CĆ“Ćø ƱieĆ u khieĆ„n ( control flags)
      CoĆ¹ 3 cĆ“Ć» ƱieĆ u khieĆ„n trong CPU , ƱoĆ¹ laĆø :
ā€¢ CĆ“Ćø hĆ¶Ć“Ć¹ng ( Direction Flag = DF)
ā€¢ CĆ“Ćø baĆ£y ( Trap flag = TF)
ā€¢ CĆ“Ćø ngaĆ©t ( Interrupt Flag = IF)
CaĆ¹c cĆ“Ćø ƱieĆ u khieĆ„n ƱƶƓĆÆc duĆøng ƱeĆ„ ƱieĆ u khieĆ„n hoaĆÆt ƱoƤng
cuƻa CPU
      CĆ“Ćø hĆ¶Ć“Ć¹ng (DF) ƱƶƓĆÆc duĆøng trong caĆ¹c leƤnh xƶƻ lyĆ¹ chuoĆ£i
cuĆ»a CPU . MuĆÆc Ʊƭch cuĆ»a DF laĆø duĆøng ƱeĆ„ ƱieĆ u khieĆ„n hĆ¶Ć“Ć¹ng
maĆø moƤt chuoĆ£i ƱƶƓĆÆc xƶƻ lyĆ¹ . Trong caĆ¹c leƤnh xƶƻ lyĆ¹ chuoĆ£i hai
thanh ghi DI vaĆø SI ƱƶƓĆÆc duĆøng ƱeĆ„ Ć±Ć²a chƦ boƤ nhĆ“Ć¹ chĆ¶Ć¹a
chuoĆ£i . NeĆ”u DF=0 thƬ leƤnh xƶƻ lyĆ¹ chuoĆ£i seƵ taĆŖng Ć±Ć²a chƦ boƤ
nhĆ“Ć¹ sao cho chuoĆ£i ƱƶƓĆÆc xƶƻ lyĆ¹ tƶĆø traĆ¹i sang phaĆ»i NeĆ”u DF=1
thƬ Ć±Ć²a chƦ boƤ nhĆ“Ć¹ seƵ ƱƶƓĆÆc xƶƻ lyĆ¹ theo hĆ¶Ć“Ć¹ng tƶĆø phaĆ»i sang
traĆ¹i .

      2.3 CaĆ¹c leƤnh aĆ»nh hƶƓƻng ƱeĆ” cĆ“Ćø nhƶ theĆ” naĆøo

      TaĆÆi moƤt thĆ“Ćøi ƱieĆ„m , CPU thƶĆÆc hieƤn 1 leƤnh , caĆ¹c cĆ“Ćø
laĆ n lƶƓĆÆt phaĆ»n aĆ¹nh keĆ”t quĆ»a thƶĆÆc hieƤn leƤnh . DĆ³ nhieĆ¢n coĆ¹
moƤt soĆ” leƤnh khoĆ¢ng laĆøm thay ƱoĆ„i moƤt cĆ“Ćø naĆøo caĆ» hoaĆ«c thay
ƱoĆ„i chƦ 1 vaĆøi cĆ“Ćø hoaĆ«c laĆøm cho moƤt vaĆøi cĆ“Ćø coĆ¹ traĆÆng thaĆ¹i
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                              24

khoĆ¢ng xaĆ¹c Ć±Ć²nh . Trong phaĆ n naĆøy chuĆ¹ng ta chƦ xeĆ¹t aĆ»nh
hƶƓƻng cuĆ»a caĆ¹c leƤnh ( ƱaƵ nghieĆ¢n cĆ¶Ć¹u Ć“Ć» chƶƓng trĆ¶Ć“Ć¹c ) leĆ¢n
caĆ¹c cĆ“Ćø nhƶ theĆ” naĆøo .
      BaĆ»ng sau ƱaĆ¢y cho thaĆ”y aĆ»nh hƶƓƻng cuĆ»a caĆ¹c leƤnh ƱeĆ”n
caĆ¹c cĆ“Ćø :

      INSTRUCTION                     AFFECTS FLAGS

      MOV/XCHG                       NONE
      ADD/SUB                        ALL
      INC/DEC                   ALL trƶĆø CF
      NEG                       ALL
                            (CF=1 trƶĆø khi keĆ”t quĆ»a baĆØng 0 ,
                             OF=1 neĆ”u keĆ”t quĆ»a laĆø 8000H )



     ƑeĆ„ thaĆ”y roĆ» aĆ»nh hƶƓƻng cuĆ»a caĆ¹c leƤnh leĆ¢n caĆ¹c cĆ“Ćø chuĆ¹ng
ta seƵ laĆ”y vaĆøi vĆ­ duĆÆ .
     VĆ­ duĆÆ 1 : ADD AX,AX trong ƱoĆ¹ AX=BX=FFFFh

                           FFFFh
                          +    FFFFh

                    1FFFEh
   KeĆ”t quĆ»a chĆ¶Ć¹a treĆ¢n AX laĆø FFFEh = 1111 1111 1111
1110
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                        25


    SF=1 vƬ MSB=1
    PF=0 vƬ coĆ¹ 7 ( leĆ») soĆ” 1 trong byte thaĆ”p cuĆ»a keĆ”t quĆ»a
    ZF=0 vƬ keĆ”t quĆ»a khaĆ¹c 0
    CF=1 vƬ coĆ¹ nhĆ“Ć¹ 1 tƶĆø MSB
    OF=0 vƬ daƔu cuƻa keƔt quƻa gioƔng nhƶ daƔu cuƻa 2 soƔ
haĆÆng ban ƱaĆ u .

      VĆ­ duĆÆ 2 : ADD AL,BL trong ƱoĆ¹ AL= BL= 80h

                  80h
                + 80h

                 100h
     KeĆ”t quĆ»a treĆ¢n AL = 00h
     SF=0 vƬ MSB=0
     PF=1 vƬ taĆ”t caĆ» caĆ¹c bit ƱeĆ u baĆØng 0
     ZF=1 vƬ keĆ”t quĆ»a baĆØng 0
     CF=1 vƬ coĆ¹ nhĆ“Ć¹ 1 tƶĆø MSB
     OF=1 vƬ caĆ» 2 toaĆ¹n haĆÆng laĆø soĆ” aĆ¢m nhƶng keĆ”t quĆ»a laĆø
soĆ” dƶƓng ( coĆ¹ nhĆ“Ć¹ ra tƶĆø MSB nhƶng khoĆ¢ng coĆ¹ nhĆ“Ć¹ vaĆøo ) .

    VĆ­ duĆÆ 3 : SUB AX,BX trong ƱoĆ¹ AX=8000h vaĆø BX=
0001h

                  8000h
                - 0001h
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                         26


                7FFFFh = 0111 1111 1111 1111
       SF=0 vƬ MSB=0
       PF=1 vƬ coĆ¹ 8 ( chaĆŗn ) soĆ” 1 trong byte thaĆ”p cuĆ»a keĆ”t
quƻa
     ZF=0 vƬ keĆ”t quĆ»a khaĆ¹c 0
     CF=0 vƬ khoĆ¢ng coĆ¹ mƶƓĆÆn
     OF=1 vƬ trƶĆø moƤt soĆ” aĆ¢m cho 1 soĆ” dƶƓng ( tĆ¶Ć¹c laĆø coƤng
2 soĆ” aĆ¢m ) maĆø keĆ”t quĆ»a laĆø moƤt soĆ” dƶƓng .

       VĆ­ duĆÆ 4 : INC AL trong ƱoĆ¹ AL=FFh

       KeĆ”t quĆ»a treĆ¢n AL=00h = 0000 0000

    SF=0 vƬ MSB=0
    PF=1
    ZF=1 vƬ keĆ”t quĆ»a baĆØng 0
    CF khoĆ¢ng bĆ² aĆ»nh hƶƓƻng bĆ“Ć»i leƤnh INC maĆ«c duĆø coĆ¹ nhĆ“Ć¹
1 tƶĆø MSB

    OF=0 vƬ hai soĆ” khaĆ¹c daĆ”u ƱƶƓĆÆc coƤng vĆ“Ć¹i nhau ( coĆ¹ soĆ”
nhĆ“Ć¹ vaĆøo MSB vaĆø cuƵng coĆ¹ soĆ” nhĆ“Ć¹ ra tƶĆø MSB)

       VĆ­ duĆÆ 5: MOV AX,-5
       KeĆ”t quaĆ» treĆ¢n BX = -5 = FFFBh
       KhoĆ¢ng coĆ¹ cĆ“Ćø naĆøo aĆ»nh hƶƓƻng bĆ“Ć»i leƤnh MOV
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                           27

       VĆ­ duĆÆ 6: NEG AX trong ƱoĆ¹ AX=8000h

              8000h =1000 0000 0000 0000
              buĆø 1 =0111 1111 1111 1111
                                +1

                   1000 0000 0000 0000 = 8000h
       KeĆ”t quĆ»a treĆ¢n AX=8000h
       SF=1 vƬ MSB=1
       PF=1 vƬ coĆ¹ soĆ” chaĆŗn con soĆ” 1 trong byte thaĆ”p cuĆ»a keĆ”t
quƻa
    ZF=0 vƬ keĆ”t quĆ»a khaĆ¹c 0
    CF=1 vƬ leƤnh NEG laĆøm cho CF=1 trƶĆø khi keĆ”t quĆ»a
baĆØng 0
    OF=1 vƬ daĆ”u cuĆ»a keĆ”t quĆ»a gioĆ”ng vĆ“Ć¹i daĆ”u cuĆ»a toaĆ¹n
haĆÆng nguoĆ n .

      2.4 ChƶƓng trƬnh DEBUG.EXE
     Debug laĆø moƤt chƶƓng trƬnh cuĆ»a DOS cho pheĆ¹p chaĆÆy
thƶƻ caĆ¹c chƶƓng trƬnh hĆ“ĆÆp ngƶƵ . NgƶƓĆøi duĆøng coĆ¹ theĆ„ cho
chaĆÆy chƶƓng trƬnh tƶĆøng leƤnh 1 tƶĆø ƱaĆ u ƱeĆ”n cuoĆ”i ,trong quaĆ¹
trƬnh ƱoĆ¹ coĆ¹ theĆ„ thaĆ”y noƤi dung caĆ¹c thanh ghi thay ƱoĆ„i nhƶ
theĆ” naĆøo . Debug cho pheĆ¹p nhaƤp vaĆøo moƤt maƵ hĆ“ĆÆp ngƶƵ trƶĆÆc
tieĆ”p sau ƱoĆ¹ DEBUG seƵ chuyeĆ„n thaĆønh maƵ maĆ¹y vaĆø lƶu trƶƵ
trong boƤ nhĆ“Ć¹ . DEBUG cung caĆ”p khaĆ» naĆŖng xem noƤi dung
cuĆ»a taĆ”t caĆ» caĆ¹c thanh ghi coĆ¹ trong CPU.
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                        28

     Sau ƱaĆ¢y chuĆ¹ng ta seƵ duĆøng DEBUG ƱeĆ„ moĆ¢ taĆ» caĆ¹ch
thĆ¶Ć¹c maĆø caĆ¹c leƤnh aĆ»nh hƶƓƻng ƱeĆ”n caĆ¹c cĆ“Ćø nhƶ theĆ” naĆøo .
     GiaĆ» sƶƻ chuĆ¹ng ta coĆ¹ chƶƓng trƬnh hĆ“ĆÆp ngƶƵ sau :




      TITLE PGM2_1: CHECK - FLAGS
      ; duĆøng DEBUG ƱeĆ„ kieĆ„m tra caĆ¹c cĆ“Ćø
      .MODEL SMALL
      .STACK 100H
      .CODE
             MOV     AX,4000H ; AX=4000H
             ADD     AX,AX ;             AX=8000H
             SUB     AX,0FFFFH           ;AX=8001H
             NEG     AX           ;      AX=7FFFH
             INC     AX           ;          AX=8000H
             MOV     AH,4CH ; HAƘM THOAƙT VEƀ DOS
             INT 21H        ; EXIT TO DOS
       END

      MAIN    ENDP
          END MAIN




    Sau khi dĆ²ch chƶƓng trƬnh , giaĆ» sƶƻ file chaĆÆy laĆø CHECK-
FL.EXE treĆ¢n ƱƶƓĆøng daĆ£n
C:ASM . ƑeĆ„ chaĆÆy debug chuĆ¹ng ta goƵ leƤnh sau :
    C:> DEBUG C:ASMCHECK-FL.EXE
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                                     29
     tƶĆø luĆ¹c naĆøy trĆ“Ć» Ʊi daĆ”u nhaĆ©c laĆøcuĆ»a debug ( daĆ”u ā€œ_ā€) , ngƶƓĆøi sƶƻ
duĆÆng coĆ¹ theĆ„ Ʊƶa vaĆøo caĆ¹c leƤnh debug tƶĆø daĆ”u nhaĆ©c naĆøy .
     TrĆ¶Ć“Ć¹c heĆ”t coĆ¹ theĆ„ xem noƤi dung caĆ¹c thanh ghi baĆØng leƤnh
R(Register) , maĆøn hƬnh seƵ coĆ¹ noƤi dung nhƶ sau :

      -R
      AX=0000 BX=0000                 CX=001F   DX=0000 SP=000A
      BP=0000 SI=0000                 DI=0000   DS=0ED5 ES=0ED5
      SS=0EE5 CS=0EE6                 IP=0000
      NV UP DI PL                     NZ NA     PO NC
      0EE6:0000 B80040                MOV       AX,4000

      ChuĆ¹ng ta thaĆ”y teĆ¢n caĆ¹c thanh ghi vaĆø noƤi dung cuĆ»a chuĆ¹ng (
dĆ¶Ć“Ć¹i daĆÆng HEX) treĆ¢n 3 doĆøng ƱaĆ u .
      DoĆøng thĆ¶Ć¹ 4 laĆø traĆÆng thaĆ¹i caĆ¹c thanh ghi theo caĆ¹ch bieĆ„u thĆ² cuĆ»a
debug.
 BaĆ»ng 2-3 laĆø caĆ¹ch maĆø Debug bieĆ„u thĆ² traĆÆng thaĆ¹i cuĆ»a caĆ¹c thanh
ghi cĆ“Ćø cuĆ»a CPU .

            Flag    Set (1) Symbol         Clear (0) Symbol
            s
            CF      CY (carry)             NC ( no carry)
            PF      PE (even parity)       PO ( odd parity)
            AF      AC ( auxiliary         NA ( no auxiliary
                    carry)                 carry)
            ZF      ZR ( zero)             NZ ( non zero)
            SF      NG ( negative)         PL ( plus)
            OF      OV ( overflow)         NV ( no overflow)
            DF      DN ( down)             UP ( up)
            IF      EI     (   enable      DI      (    disable
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                                    30
                    interrupts)            interrupts)

                     BaĆ»ng 2.3 : BieĆ„u thĆ² traĆÆng traĆÆng caĆ¹c cĆ“Ćø cuĆ»a
DEBUG

      DoĆøng cuoĆ”i cuĆøng cho bieĆ”t giaĆ¹ trĆ² hieƤn haĆønh cuĆ»a PC (Ć±Ć²a chƦ
cuĆ»a leƤnh seƵ ƱƶƓĆÆc thƶĆÆc hieƤn dĆ¶Ć“Ć¹i daĆÆng Ć±Ć²a chƦ logic ) maƵ maĆ¹y
cuĆ»a leƤnh vaĆø noƤi dung cuĆ»a leƤnh tƶƓng Ć¶Ć¹ng . Khi chaĆÆy chƶƓng trƬnh
naĆøy treĆ¢n 1 maĆ¹y tĆ­nh khaĆ¹c coĆ¹ theĆ„ seƵ thaĆ”y moƤt ƱiaĆÆ chƦ ƱoaĆÆn khaĆ¹c .
      ChuĆ¹ng ta seƵ duĆøng leƤnh T(Trace) ƱeĆ„ thi haĆønh tƶĆøng leƤnh cuĆ»a
chƶƓng trƬnh baĆ©t ƱaĆ u tƶĆø leƤnh      MOV         AX,4000h

      -T
      AX=4000 BX=0000                 CX=001F DX=0000 SP=000A
      BP=0000 SI=0000                 DI=0000 DS=0ED5 ES=0ED5
      SS=0EE5 CS=0EE6                 IP=0003
      NV UP DI PL                     NZ NA PO NC
      0EE6:0003 03C0                  ADD AX,AX

     Sau khi thƶĆÆc hieƤn leƤnh MOV    AX,4000 caĆ¹c cĆ“Ćø khoĆ¢ng bĆ²
thay ƱoĆ„i , chƦ coĆ¹ AX=4000h . BaĆ¢y giĆ“Ćø chuĆ¹ng ta thƶĆÆc hieƤn leƤnh
     ADD AX,AX

      -T
      AX=8000 BX=0000 CX=001F                 DX=0000 SP=000A
      BP=0000 SI=0000 DI=0000                 DS=0ED5 ES=0ED5
      SS=0EE5 CS=0EE6 IP=0005
      OV UP DI NG NZ NA                       PE NC
       0EE6:0005   2DFFFF SUB                 AX,FFFF
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                             31
    KeĆ”t quĆ»a cuĆ»a pheĆ¹p coƤng laĆø 8000h , do ƱoĆ¹ SF=1(NG) ,
OF=1(OV) vaĆø PF=1(PE)
    BaĆ¢y giĆ“Ćø chuĆ¹ng ta thƶĆÆc hieƤn leƤnh      SUB AX,0FFFh

      -T
      AX=8001 BX=0000 CX=001F                DX=0000 SP=000A
      BP=0000 SI=0000 DI=0000                DS=0ED5 ES=0ED5
      SS=0EE5 CS=0EE6 IP=0008
      NV UP DI NG NZ AC                      PO CY
       0EE6:0008   F7D8                      NEG AX

       AX=8000H-FFFFH=8001H
       CĆ“Ćø OF=0(NV) nhƶng CF=1(CY) vƬ coĆ¹ mƶƓĆÆn tƶĆø MSB
       CĆ“Ćø PF=0(PO) vƬ byte thaĆ”p chƦ coĆ¹ 1 con soĆ” 1.

       LeƤnh tieĆ”p theo seƵ laĆø leƤnh NEG AX

      -T
      AX=7FFF BX=0000                 CX=001F DX=0000 SP=000A
      BP=0000 SI=0000                 DI=0000 DS=0ED5 ES=0ED5
      SS=0EE5 CS=0EE6                 IP=000A
      NV UP DI PL                     NZ AC PE CY
       0EE6:000A   40                 INC AX



     AX laĆ”y buĆø 2 cuĆ»a 8001h laĆø 7FFFh . CF=1(CY) vƬ leƤnh NEG
cho keĆ”t quĆ»a khaĆ¹c 0.
     OF=0(NV) vƬ keĆ”t quaĆ» khaĆ¹c 8000h

       CuoĆ”i cuĆøng chuĆ¹ng ta thƶĆÆc hieƤn leƤnh        INC AX
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                                    32


      -T
      AX=8000 BX=0000 CX=001F                DX=0000 SP=000A
      BP=0000 SI=0000 DI=0000                DS=0ED5 ES=0ED5
      SS=0EE5 CS=0EE6 IP=000B
      OV UP DI NG NZ AC                      PE CY
       0EE6:000B   B44C                      MOV   AH,4CH

    OF=1(OV) vƬ coƤng 2 soĆ” dƶƓng maĆø keĆ”t quaĆ» laĆø 1 soĆ” aĆ¢m
CF=1(CY) vƬ leƤnh INC khoĆ¢ng aĆ»nh hƶƓƻng tĆ“Ć¹i cĆ“Ćø naĆøy .
    ƑeĆ„ thƶĆÆc hieƤn toaĆøn boƤ chƶƓng trƬnh chuĆ¹ng ta goƵ G(Go)

       -G
       Program terminated normally

       ƑeĆ„ thoaĆ¹t khoƦ debug goƵ Q(Quit)

       -Q
       C:>

       BaĆ»ng sau ƱaĆ¢y cho bieĆ”t moƤt soĆ” leƤnh debug thƶƓĆøng duĆøng ,
caĆ¹c tham soĆ” ƱeĆ„ trong ngoaĆ«c laĆø tuyĆø choĆÆn



    COMMAND                                     ACTION
D(start (end)               LieƤt keĆ¢ noƤi dung caĆ¹c byte dĆ¶Ć“Ć¹i daĆÆng HEX
(range))
D 100                       LieƤt keĆ¢ 80h bytes baĆ©t ƱaĆ u tƶĆø DS:100h
D CS:100 120                LieƤt keĆ¢ caĆ¹c bytes tƶĆø DS:100h ƱeĆ”n DS:120
D( DUMP)                    LieƤt keĆ¢ 80h bytes tƶĆø byte cuoĆ”i cuĆøng ƱaƵ
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                                         33
                            ƱƶƓĆÆc hieĆ„n thĆ²
G(=start ) (addr1           ChaĆÆy ( go) leƤnh tƶĆø vĆ² trĆ­ Start vĆ“Ć¹i caĆ¹c ƱieĆ„m
addr2...addrn)              dƶĆøng taĆÆi addr1,addr2,addrn

G                           ThƶĆÆc thi leƤnh tƶĆø CS:IP ƱeĆ”n heĆ”t
G=100                       ThƶĆÆc thi leƤnh tƶĆø CS:100h ƱeĆ”n heĆ”t
G=100 150                   ThƶĆÆc thi leƤnh taĆÆi CS:100h dƶĆøng taĆÆi
                            CS:150h
Q                           Quit debug and return to DOS
R(register)                 Xem/ thay ƱoƄi noƤi dung cuƻa thanh ghi

R                           Xem noƤi dung taĆ”t caĆ» caĆ¹c thnah ghi vaĆø cĆ“Ćø
R AX                        Xem vaĆø thay ƱoĆ„i noƤi dung cuĆ»a thanh ghi
                            AX
T(=start)(value)            QueĆ¹t ā€œvalueā€ leƤnh tƶĆø vĆ² trĆ­ start

T                           Trace leƤnh taĆÆi CS:IP
T=100                       Trace leƤnh taĆÆi CS:100h
T=100 5                     Trace 5 leƤnh baĆ©t ƱaĆ u tƶĆø CS:100h
T4                          Trace 4 leƤnh baĆ©t ƱaĆ u tƶĆø CS:IP




U(start)(value)              Unassemble vuĆøng Ć±Ć²a chƦ thaĆønh leƤnh asm

U CS:100 110                 Unassemble tƶĆø CS:100h ƱeĆ”n CS:110h
U 200 L 20                   Unassemble 20 leƤnh tƶĆø CS:200h
U                            Unassemble 32 bytes tƶĆø bytes cuoĆ”i cuĆøng
                             ƱƶƓĆÆc hieĆ„n thĆ²
A(start)                     Ƒƶa vaĆøo maƵ hĆ“ĆÆp ngƶƵ cho 1 Ć±Ć²a chƦ hoaĆ«c 1
ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ                                34
                             vuĆøng ƱiaĆÆ chƦ
A
A CS:100h                    Ƒƶa vaĆøo maƵ hĆ“ĆÆp ngƶƵ taĆÆi CS:IP
                             Ƒƶa vaĆøo maƵ hĆ“ĆÆp ngƶƵ taĆÆi CS:100h
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                        28


        ChƶƓng 3 : CAƙC LEƄNH ƑIEƀU KHIEƅN

        MoƤt chƶƓng trƬnh thoĆ¢ng thƶƓĆøng seƵ thƶĆÆc hieƤn laĆ n lƶƓĆÆt caĆ¹c leƤnh theo thĆ¶Ć¹ thƶĆÆ maĆø
chuĆ¹ng ƱƶƓĆÆc vieĆ”t ra . Tuy nhieĆ¢n trong moƤt vaĆøi trƶƓĆøng hĆ“ĆÆp caĆ n phaĆ»i chuyeĆ„n ƱieĆ u khieĆ„n
ƱeĆ”n 1 phaĆ n khaĆ¹c cuĆ»a chƶƓng trƬnh . Trong phaĆ n naĆøy chuĆ¹ng ta seƵ nghieĆ¢n cĆ¶Ć¹u caĆ¹c leƤnh
nhaĆ»y vaĆø leƤnh laĆ«p coĆ¹ tĆ­nh ƱeĆ”n caĆ”u truĆ¹c cuĆ»a caĆ¹c leƤnh naĆøy trong caĆ¹c ngoĆ¢n ngƶƵ caĆ”p cao .

        3.1     VĆ­ duĆÆ veĆ  leƤnh nhaĆ»y

        ƑeĆ„ hƬnh dung ƱƶƓĆÆc leƤnh nhaĆ»y laĆøm vieƤc nhƶ theĆ” naĆøo chuĆ¹ng ta haƵy vieĆ”t chƶƓng
trƬnh in ra toaĆøn boƤ taƤp caĆ¹c kyĆ¹ tƶĆÆ IBM .


        TITLE PGR3-1:IBM CHARACTER DISPLAY
        .MODEL     SMALL
        .STACK     100H
        .CODE
        MAIN            PROC
              MOV AH,2       ; haĆøm xuaĆ”t kyĆ¹ tƶĆÆ
              MOV CX,256     ; soĆ” kyĆ¹ tƶĆÆ caĆ n xuaĆ”t
              MOV DL,0       ; DL giƶƵ maƵ ASCII cuĆ»a kyĆ¹ tƶĆÆ NUL
        ; PRINT_LOOP :
              INT 21H        ;display character
              INC DL
              DEC CX
              JNZ PRINT_LOOP           ;nhaƻy ƱeƔn print_loop neƔu CX# 0
        ;DOS EXIT
              MOV AH,4CH
              INT 21H
        MAIN ENDP
              END MAIN




       Trong chƶƓng trƬnh chuĆ¹ng ta ƱaƵ duĆøng leƤnh ƱieĆ u khieĆ„n Jump if not zero (JNZ)
ƱeĆ„ quay trĆ“Ć» laĆÆi ƱoaĆÆn chƶƓng trƬnh xuaĆ”t kyĆ¹ tƶĆÆ coĆ¹ nhaƵn Ć±Ć²a chƦ boƤ nhĆ“Ć¹ laĆøPRINT_LOOP
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                       29


        3.2     NhaĆ»y coĆ¹ ƱieĆ u kieƤn

         LeƤnh JNZ laĆø moƤt leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn .CuĆ¹ phaĆ¹p cuĆ»a moƤt leƤnh nhaĆ»y coĆ¹ ƱieĆ u
kieƤn laĆø :
                  Jxxx destination-label
         NeĆ”u ƱieĆ u kieƤn cuĆ»a leƤnh ƱƶƓĆÆc thoĆ»a maƵn thƬ leƤnh taĆÆi Destination-label seƵ ƱƶƓĆÆc
thƶĆÆc hieƤn , neĆ”u ƱieĆ u kieƤn khoĆ¢ng thoĆ»a thƬ leƤnh tieĆ”p theo leƤnh nhaĆ»y seƵ ƱƶƓĆÆc thƶĆÆc hieƤn.
ƑoĆ”i vĆ“Ć¹i leƤnh JNZ thƬ ƱieĆ u kieƤn laĆø keĆ”t quĆ»a cuĆ»a leƤnh trĆ¶Ć“Ć¹c noĆ¹ phaĆ»i baĆØng 0 .
         PhaĆÆm vi cuĆ»a leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn .
         CaĆ”u truĆ¹c maƵ maĆ¹y cuĆ»a leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn yeĆ¢u caĆ u destination-label ƱeĆ”n
 ( precede) leƤnh nhaĆ»y phaĆ»i khoĆ¢ng quaĆ¹ 126 bytes .
         LaĆøm theĆ” naĆøo ƱeĆ„ CPU thƶĆÆc hieƤn moƤt leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn ?
         ƑeĆ„ thƶĆÆc hieƤn moƤt leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn CPU phaĆ»i theo doƵi thanh ghi cĆ“Ćø.
NeĆ”u ƱieĆ u kieƤn cho leƤnh nhaĆ»y ( ƱƶƓĆÆc bieĆ„u dieĆ£n bĆ“Ć»i moƤt toĆ„ hĆ“ĆÆp traĆÆng thaĆ¹i caĆ¹c cĆ“Ćø ) laĆø
ƱuĆ¹ng thƬ CPU seƵ ƱieĆ u chƦnh IP ƱeĆ”n destination-label sao cho leƤnh taĆÆi ƱiaĆÆ chƦ
destination-label ƱƶƓĆÆc thƶĆÆc hieƤn .NeĆ”u ƱieĆ u kieƤn nhaĆ»y khoĆ¢ng thoĆ»a thƬ IP seƵ khoĆ¢ng thay
ƱoĆ„i , nghĆ³a laĆø leƤnh tieĆ”p theo leƤnh nhaĆ»y seƵ ƱƶƓĆÆc thƶĆÆc hieƤn .
         Trong chƶƓng trƬnh treĆ¢n ƱaĆ¢y , CPU thƶĆÆc hieƤn leƤnh JNZ PRINT_LOOP baĆØng
caĆ¹ch khaĆ¹m xeĆ¹t caĆ¹c cĆ“Ćø ZF . NeĆ”u ZF=0 ƱieĆ u khieĆ„n ƱƶƓĆÆc chuyeĆ„n tĆ“Ć¹i PRINT_LOOP.
NeĆ”u ZF=1 leƤnh MOV AH,4CH seƵ ƱƶƓĆÆc thƶc hieƤn .
         BaĆ»ng 3-1 cho thaĆ”y caĆ¹c leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn . CaĆ¹c leƤnh nhaĆ»y ƱƶƓĆÆc chia
thaĆønh 3 loaĆÆi :
ā€¢ nhaĆ»y coĆ¹ daĆ”u ( duĆøng cho caĆ¹c dieĆ£n dĆ²ch coĆ¹ daĆ”u ƱoĆ”i vĆ“Ć¹i keĆ”t quaĆ»)
ā€¢ nhaĆ»y khoĆ¢ng daĆ”u (duĆøng cho caĆ¹c dieĆ£n dĆ²ch khoĆ¢ng daĆ”u ƱoĆ”i vĆ“Ć¹i keĆ”t quaĆ»)
ā€¢ nhaĆ»y moƤt cĆ“Ćø ( duĆøng cho caĆ¹c thao taĆ¹c chƦ aĆ»nh hƶƓƻng leĆ¢n 1 cĆ“Ćø )
MoƤt soĆ”Ć¹ leƤnh nhaĆ»y coĆ¹ 2 Opcode . ChuĆ¹ng ta coĆ¹ theĆ„ duĆøng moƤt trong 2 Opcode , nhƶng
keĆ”t quaĆ» thƶĆÆc hieƤn leƤnh laĆø nhƶ nhau .

        NhaĆ»y coĆ¹ daĆ”u

        SYMBOL           DESCRITION                               CONDITION FOR JUMPS
        JG/JNLE          jump if greater than                     ZF=0 and SF=OF
                         jump if not less than or equal to

        JGE/JNL          jump if greater than or equal to         SF=OF
                         jupm if not less or equal to

        JL/JNGE          jump if lees than
                         jump if not greater or equal             SF<>OF
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                   30



       JLE/JNG         jump if less than or equal          ZF=1 or SF<>OF
                       jump if not greater

       NhaĆ»y coĆ¹ ƱieĆ u kieƤn khoĆ¢ng daĆ”u

       SYMBOL          DESCRITION                   CONDITION FOR JUMPS

       JA/JNBE         jump if above              CF=0 and ZF=0
                       jump if not below or equal

       JAE/JNB         jump if above or equal       CF=0
                       jump if not below

       JB/JNA          jump if below              Cf=1
                       jump if not above or equal

       JBE/JNA         jump if below or equal       CF=1 or ZF=1
                       jump if not above

       NhaĆ»y 1 cĆ“Ćø

       SYMBOL          DESCRITION                   CONDITION FOR JUMPS

       JE/JZ           jump if equal                ZF=1
                       jump if equal to zero

       JNE/JNZ         jump if not equal            ZF=0
                       jump if not zero

       JC              jump if carry                CF=1

       JNC             jump if no carry             CF=0

       JO              jump if overflow             OF=1

       JNO             jump if not overflow         OF=0

       JS              jump if sign negative        SF=1

       SYMBOL          DESCRITION                   CONDITION FOR JUMPS
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                    31



        JNS             jump if nonnegative sign        SF=0

        JP/JPE          jump if parity even             PF=1

        JNP/JPO         jump if parity odd              PF=0

        LeƤnh CMP ( Compare)

        CaĆ¹c leƤnh nhaĆ»y thƶƓĆøng laĆ”y keĆ”t quĆ»a cuĆ»a leƤnh Compare nhƶ laĆø ƱieĆ u kieƤn . CuĆ¹
phaĆ¹p cuĆ»a leƤnh CMP laĆø :
                 CMP destination, source
        LeƤnh naĆøy so saĆ¹nh toaĆ¹n haĆÆng nguoĆ n vaĆø toaĆ¹n haĆÆng Ʊƭch baĆØng caĆ¹ch tĆ­nh hieƤu
Destinaition - Source . KeĆ”t quĆ»a seƵ khoĆ¢ng ƱƶƓĆÆc caĆ”t giƶƵ . Nhƶ vaƤy laĆø leƤnh CMP gioĆ”ng
nhƶ leƤnh SUB , chƦ khaĆ¹c laĆø trong leƤnh CMP toaĆ¹n haĆÆng Ʊƭch khoĆ¢ng thay ƱoĆ„i .
        GiaĆ» sƶƻ chƶƓng trƬnh chƶaĆ¹ caĆ¹c leƤnh sau :
                 CMP AX,BX              ;trong ƱoĆ¹ AX=7FFF vaĆø BX=0001h
                 JG      BELOW
        KeĆ”t quĆ»a cuĆ»a leƤnh CMP AX,BX laĆø 7FFEh . LeƤnh JG ƱƶƓĆÆc thoĆ»a maƵn vƬ
ZF=0=SF=OF do ƱoĆ¹ ƱieĆ u khieĆ„n ƱƶƓĆÆc chuyeĆ„n ƱeĆ”n nhaƵn BELOW.

        DieĆ£n dĆ²ch leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn

        VĆ­ duĆÆ treĆ¢n ƱaĆ¢y veĆ  leƤnh CMP cho pheĆ¹p leƤnh nhaĆ»y sau noĆ¹ chuyeĆ„n ƱieĆ u khieĆ„n
ƱeĆ”n nhaƵn BELOW . ƑaĆ¢y laĆø vĆ­ duĆÆ cho thaĆ”y CPU thƶĆÆc hieƤn leƤnh nhaĆ»y nhƶ theĆ” naĆøo .
ChuĆ¹ng thƶĆÆc hieƤn baĆØng caĆ¹ch khaĆ¹m xeĆ¹t traĆÆng thaĆ­ caĆ¹c cĆ“Ćø .LaƤp trƬnh vieĆ¢n khoĆ¢ng caĆ n
quan taĆ¢m ƱeĆ”n caĆ¹c cĆ“Ćø , maĆø coĆ¹ theĆ„ duĆøng teĆ¢n cuĆ»a caĆ¹c leƤnh nhaĆ»y ƱeĆ„ chuyeĆ„n ƱieĆ u khieĆ„n
ƱeĆ”n moƤt nhaƵn naĆøo ƱoĆ¹ . CaĆ¹c leƤnh
                CMP AX,BX
                JG       BELOW
        coĆ¹ nghĆ³a laĆø neĆ”u AX>BX thƬ nhaĆ»y ƱeĆ”n nhaƵn BELOW
        MaĆ«c duĆø leƤnh CMP ƱƶƓĆÆc thieĆ”t keĆ” cho caĆ¹c leƤnh nhaĆ»y . Nhƶng leƤnh nhaĆ»y coĆ¹ theĆ„
Ć±Ć¶Ć¹ng trĆ¶Ć“Ć¹c 1 leƤnh khaĆ¹c , chaĆŗng haĆÆn :
                DEC AX
                JL       THERE
        coĆ¹ nghĆ³a laĆø neĆ”u AX trong dieĆ£n dĆ²ch coĆ¹ daĆ”u < 0 thƬ ƱieĆ u khieĆ„n ƱƶƓĆÆc chuyeĆ„n cho
THERE .



        NhaĆ»y coĆ¹ daĆ”u so vĆ“Ć¹i nhaĆ»y khoĆ¢ng daĆ”u
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                         32


         MoƤt leƤnh nhaĆ»y coĆ¹ daĆ”u tƶƓng Ć¶Ć¹ng vĆ“Ć¹i 1 nhaĆ»y khoĆ¢ng daĆ”u . VĆ­ duĆÆ leƤnh nhaĆ»y coĆ¹
daĆ”u JG vaĆø leƤnh nhaĆ»y khoĆ¢ng daĆ”u JA . VieƤc sƶƻ duĆÆng JG hay JA laĆø tuyĆø thuoƤc vaĆøo dieĆ£n
dĆ²ch coĆ¹ daĆ”u hay khoĆ¢ng daĆ”u . BaĆ»ng 3-1 cho thaĆ”y caĆ¹c leƤnh nhaĆ»y coĆ¹ daĆ”u phuĆÆ thuoƤc vaĆøo
traĆÆng thaĆ¹i cuĆ»a caĆ¹c cĆ“Ćø ZF,SF,OF .CaĆ¹c leƤnh nhaĆ»y khoĆ¢ng daĆ”u phuĆÆ thuoƤc vaĆøo traĆÆng thaĆ¹i
cuĆ»a caĆ¹c cĆ“Ćø ZF vaĆø CF . Sƶƻ duĆÆnh leƤnh nhaĆ»y khoĆ¢ng hĆ“ĆÆp lyĆ¹ seƵ taĆÆo ra keĆ”t quaĆ» sai .
         GiaĆ» sƶƻ raĆØng chuĆ¹ng ta dieĆ£n dĆ²ch coĆ¹ daĆ”u .NeĆ”u AX=7FFFh vaĆø BX=8000h , caĆ¹c
leƤnh :
         CMP AX,BX
         JA       below
         seƵ cho keĆ”t quĆ»a sai maĆ«c duĆø 7FFFh > 8000h ( leƤnh JA khoĆ¢ng thƶĆÆc hieƤn ƱƶƓĆÆc vƬ
                          7FFFFh < 8000h trong dieĆ£n dĆ²ch khoĆ¢ng daĆ”u )
         Sau ƱaĆ¢y chuĆ¹ng ta seƵ laĆ”y vĆ­ duĆÆ Ć±eĆ„ minh hoĆÆa vieƤc sƶƻ duĆÆng caĆ¹c leƤnh nhaĆ»y
         VĆ­ duĆÆ : GiaĆ» sƶƻ raĆØng AX vaĆø BX chƶaĆ¹ caĆ¹c soĆ” coĆ¹ daĆ”u . VieĆ”t ƱoaĆÆn ct ƱeĆ„ ƱaĆ«t soĆ”
lĆ“Ć¹n nhaĆ”t vaĆøo CX .
         Giaƻi :
                  MOV CX,AX               ; ƱaĆ«t AX vaĆøo CX
                  CMP BX,CX               ;BX lĆ“Ć¹n hĆ“n CX?
                  JLE NEXT                ; khoĆ¢ng thƬ tieĆ”p tuĆÆc
                  MOV CX,BX               ; yes , ƱaĆ«t BX vaĆøo CX
         NEXT:



        3.3     LeƤnh JMP

        LeƤnh JMP ( jump) laĆø leƤnh nhaĆ»y khoĆ¢ng ƱieĆ u kieƤn . CuĆ¹ phaĆ¹p cuĆ»a JMP laĆø
               JMP destination

       Trong ƱoĆ¹ destination laĆø moƤt nhaƵn Ć“Ć» trong cuĆøng 1 ƱoĆÆan vĆ“Ć¹i leƤnh JMP .
       LeƤnh JMP duĆøng ƱeĆ„ khaĆ©c phuĆÆc haĆÆn cheĆ” cuĆ»a caĆ¹c leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn ( khoĆ¢ng
quaĆ¹ 126 bytes keĆ„ tƶĆø vĆ² trĆ­ cuĆ»a leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn )
       VĆ­ duĆÆ chuĆ¹ng ta coĆ¹ ƱoaĆÆn chƶƓng trƬnh sau :

        TOP:
                  ; thaĆ¢n voĆøng laĆ«p
                  DEC CX
                  JNZ TOP ; neĆ”u CX>0 tieĆ”p tuĆÆc laĆ«p
                  MOV AX,BX
        giaĆ» sƶƻ thaĆ¢n voĆøng laĆ«p chĆ¶Ć¹a nhieĆ u leƤnh maĆø noĆ¹ vƶƓĆÆt khoĆ»i 126 bytes trĆ¶Ć“Ć¹c leƤnh
JNZ     TOP . CoĆ¹ theĆ„ giaĆ»i quyeĆ”t tƬnh traĆÆng naĆøy baĆØng caĆ¹c leƤnh sau :

        TOP:
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                     33


              ; thaĆ¢n voĆøng laĆ«p
              DEC CX
              JNZ BOTTOM                 ; neĆ”u CX>0 tieĆ”p tuĆÆc laĆ«p
              JMP EXIT
        BOTTOM:
              JMP TOP
        EXIT:
              MOV AX,BX


        3.4 CaĆ”u truĆ¹c cuĆ»a ngoĆ¢n ngƶƵ caĆ”p cao

       ChuĆ¹ng ta seƵ duĆøng caĆ¹c leƤnh nhaĆ»y ƱeĆ„ thƶĆÆc hieƤn caĆ¹c caĆ”u truĆ¹c tƶƓng tƶĆÆ nhƶ trong
ngoĆ¢n ngƶƵ caĆ”p cao

        3.4.1 CaĆ”u truĆ¹c reƵ nhaĆ¹nh

Trong ngoĆ¢n ngƶƵ caĆ”p cao caĆ”u truĆ¹c reƵ nhaĆ¹nh cho pheĆ¹p moƤt chƶƓng trƬnh reƵ nhaĆ¹nh ƱeĆ”n
nhƶƵng ƱoaĆÆn khaĆ¹c nhau tuyĆø thuoƤc vaĆøo caĆ¹c ƱieĆ u kieƤn . Trong phaĆ n naĆøy chuĆ¹ng ta seƵ xem
xeĆ¹t 3 caĆ”u truĆ¹c


        a) IF-THEN
        CaĆ”u truĆ¹c IF-THEN coĆ¹ theĆ„ dieĆ£n ƱaĆÆt nhƶ sau :

        IF condition is true
                THEN
                         execute true branch statements
        END IF

        VĆ­ duĆÆ : Thay theĆ” giaĆ¹ trĆ² treĆ¢n AX baĆØng giaĆ¹ trĆ² tuyeĆ”t ƱoĆ”i cuĆ»a noĆ¹
        ThuaƤt toaĆ¹n nhƶ sau :
        IF AX<0
                THEN
                       replace AX by -AX
        END-IF

        CoĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau :
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                    34


       ; if AX<0
                       CMP AX,0
                       JNL END_IF              ; no , exit
       ;then
                       NEG AX                  , yes , change sign
       END_IF :



          b) IF_THEN_ELSE
          IF condition is true
                  THEN
                  execute true branch statements
                  ELSE
                  execute false branch statements
          END_IF
          VĆ­ duĆÆ : giaĆ» sƶƻ AL vaĆø BL chĆ¶Ć¹a ASCII code cuĆ»a 1 kyĆ¹ tƶĆÆ .HaƵy xuaĆ”t ra maĆøn hƬnh
kyĆ¹ tƶĆÆ trĆ¶Ć“Ć¹c ( theo thĆ¶Ć¹ tƶĆÆ kyĆ¹ tƶĆÆ )
          ThuaƤt toaĆ¹n
                  IF AL<= BL
                            THEN
                            display AL
                            ELSE
                            display character in BL
                  END_IF

       CoĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau :

                    MOV AH,2                   ; chuaĆ„n bĆ² xuaĆ”t kyĆ¹ tƶĆÆ
       ;if     AL<=BL
                    CMP AL,BL                          ;AL<=BL?
                    JNBE ELSE_                         ; no, display character in BL
       ;then
            MOV DL,AL
            JMP DISPLAY
       ELSE_:
            MOV DL,BL

       DISPLAY:
                       INT     21H
       END_IF :
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                        35


        c) CASE
        Case laĆø moƤt caĆ”u truĆ¹c reƵ nhaĆ¹nh nhieĆ u hĆ¶Ć“Ć¹ng . CoĆ¹ theĆ„ duĆøng ƱeĆ„ test moƤt thanh
ghi hay , bieĆ”n naĆøo Ʊo Ć¹hay moƤt bieĆ„u thĆ¶Ć¹c maĆø giaĆ¹ trĆ² cuĆÆ theĆ„ naĆØn trong 1 vuĆøng caĆ¹c giaĆ¹ trĆ²
CaĆ”u truĆ¹c cuĆ»a CASE nhƶ sau :

        CASE expression
                value_1 : Statements_1
                value_2 : Statements_2
                .
                .
                value_n : Statements_n
        VĆ­ duĆÆ : NeĆ”u AX aĆ¢m thƬ ƱaĆ«t -1 vaĆøo BX
                NeĆ”u AX baĆØng 0 thƬ ƱaĆ«t 0 vaĆøo BX
                NeĆ”u AX dƶƓng thƬ ƱaĆ«t 1 vaĆøo BX

        ThuaƤt toaĆ¹n :
                CASE            AX
                        < 0 put -1 in BX
                        = 0 put 0 in BX
                        > 0 put 1 in BX
        CoĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau :
        ; case AX
                        CMP AX,0                  ;test AX
                        JL      NEGATIVE          ;AX<0
                        JE      ZERO              ;AX=0
                        JG      positive          ;AX>0
        NEGATIVE:
                        MOV BX,-1
                        JMP END_CASE
        ZERO:
                        MOV BX,0
                        JMP END_CASE
        POSITIVE:
                        MOV BX,1
                        JMP END_CASE
        END_CASE :

        ReĆ» nhaĆ¹nh vĆ“Ć¹i moƤt toĆ„ hĆ“ĆÆp caĆ¹c ƱieĆ u kieƤn

       ƑoĆ¢i khi tƬnh traĆÆng reĆ» nhaĆ¹nh trong caĆ¹c leƤnh IF ,CASE caĆ n moƤt toĆ„ hĆ“ĆÆp caĆ¹c ƱieĆ u
kieƤn dĆ¶Ć“Ć¹i daĆÆng :
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                        36


                Condition_1 AND Condition_2
                Condition_1 OR  Condition_2

       VĆ­ duĆÆ veĆ  ƱieĆ u kieƤn AND : ƑoĆÆc moƤt kyĆ¹ tƶĆÆ vaĆø neĆ”u noĆ¹ laĆø kyĆ¹ tƶĆÆ hoa thƬ in noĆ¹ ra
maĆøn hƬnh
       ThuaƤt toaĆ¹n :
       Read a character ( into AL)
       IF ( ā€˜Aā€™<= character ) AND ( charater <= ā€˜Zā€™)
               THEN
               display character
       END_IF

        Sau ƱaĆ¢y laĆø code

        ;read a character
                MOV AH,2
                INT 21H            ; character in AL
        ; IF ( ā€˜Aā€™<= character ) AND ( charater <= ā€˜Zā€™)
                CMP AL,ā€™Aā€™         ; char >=ā€˜Aā€™?
                JNGE END_IF        ;no, exit
                CMP AL,ā€™Z          ; char <=ā€˜Zā€™?
                JNLE END_IF        ; no exit
        ; then display it
                MOV DL,AL
                MOV AH,2
                INT 21H
        END_IF :


         VĆ­ duĆÆ veĆ  ƱieĆ u kieƤn OR : ƑoĆÆc moƤt kyĆ¹ tƶĆÆ , neĆ”u kyĆ¹ tƶĆÆ Ć±oĆ¹ laĆø ā€˜Yā€™ hoaĆ«c ā€˜yā€™ thƬ in
noĆ¹ leĆ¢n maĆøn hƬnh , ngƶƓĆÆc laĆÆi thƬ keĆ”t thuĆ¹c chƶƓng trƬnh .
         ThuaƤt toaĆ¹n
         Read a charcter ( into AL)
         IF ( character =ā€˜Yā€™) OR ( character=ā€˜yā€™)
                 THEN
                 dispplay it
         ELSE
                 terminate the program
         END_IF

        Code
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                             37



         ;read a character
                MOV AH,2
                INT 21H              ; character in AL
        ; IF ( character =ā€˜yā€™ ) OR ( charater = ā€˜Yā€™)
                CMP AL,ā€™yā€™           ; char =ā€˜yā€™?
                JE     THEN          ;yes , goto display it
                CMP AL,ā€™Yā€™           ; char =ā€˜Yā€™?
                JE     THEN          ; yes , goto display it
                JMP ELSE_                     ;no , terminate
        THEN :
                MOV DL,AL
                MOV AH,2
                INT 21H
                JMP END_IF
        ELSE_:
                MOV AH,4CH
                INT 21h
        END_IF :

        4.3.2 CaĆ”u truĆ¹c laĆ«p

        MoƤt voĆøng laĆ«p goĆ m nhieĆ u leƤnh ƱƶƓĆÆc laĆ«p laĆÆi , soĆ” laĆ n laĆ«p phuĆÆ thuoƤc ƱieĆ u kieƤn .

        a) VoĆøng FOR
        LeƤnh LOOP coĆ¹ theĆ„ duĆøng ƱeĆ„ thƶĆÆc hieƤn voĆøng FOR .CuĆ¹ phaĆ¹p cuĆ»a leƤnh LOOP nhƶ
sau :
                LOOP destination_label
        SoĆ” ƱeĆ”m cho voĆøng laĆ«p laĆø thanh ghi CX maĆø ban ƱaĆ u noĆ¹ ƱƶƓĆÆc gaĆ¹n 1 giaĆ¹ trĆ² naĆøo
ƱoĆ¹ . Khi leƤnh LOOP ƱƶƓĆÆc thƶĆÆc hieƤn CX seƵ tƶĆÆ Ć±oƤng giaĆ»m Ʊi 1 . NeĆ”u CX chƶa baĆØng 0
thƬ voĆøng laĆ«p ƱƶƓĆÆc thƶĆÆc hieƤn tieĆ”p tuĆÆc . NeĆ”u CX=0 leƤnh sau leƤnh LOOP ƱƶƓĆÆc thƶĆÆc hieƤn
        DuĆøng leƤnh LOOP , voĆøng FOR coĆ¹ theĆ„ thƶĆÆc hieƤn nhƶ sau :


        ; gaĆ¹n cho cho CX soĆ” laĆ n laĆ«p
        TOP:
        ; thaĆ¢n cuĆ»a voĆøng laĆ«p
        LOOP             TOP
         VĆ­ duĆÆ : DuĆøng voĆøng laĆ«p in ra 1 haĆøng 80 daĆ”u ā€˜*ā€™
                 MOV CX,80               ; CX chƶaĆ¹ soĆ” laĆ n laĆ«p
                 MOV AH,2                ; haĆøm xuaĆ”t kyĆ¹ tƶĆÆ
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                       38


                MOV DL,ā€™*ā€™              ;DL chƶaĆ¹ kyĆ¹ tƶĆÆ ā€˜*ā€™
        TOP:
                 INT 21h                 ; in daĆ”u ā€˜*ā€™
                 LOOP TOP                ; laƫp 80 laƠn
        Lƶu yĆ¹ raĆØng voĆøng FOR cuƵng nhƶ leƤnh LOOP thƶĆÆc hieƤn Ć­t nhaĆ”t laĆø 1 laĆ n . Do Ʊo
neĆ”u ban ƱaĆ u CX=0 thƬ voĆøng laĆ«p seƵ laĆøm cho CX=FFFH ,tĆ¶Ć¹c laĆø thƶĆÆc hieƤn laĆ«p ƱeĆ”n
65535 laĆ n . ƑeĆ„ traĆ¹nh tƬnh traĆÆng naĆøy , leƤnh JCXZ ( Jump if CX is zero) phaĆ»i ƱƶƓĆÆc duĆøng
trĆ¶Ć“Ć¹c voĆøng laĆ«p . LeƤnh JXCZ coĆ¹ cuĆ¹ phaĆ¹p nhƶ sau :
                 JCXZ destination_label
        NeĆ”u CX=0 ƱieĆ u khieĆ„n ƱƶƓĆÆc chuyeĆ„n cho destination_label . CaĆ¹c leƤnh sau ƱaĆ¢y
seƵ ƱaĆ»m baĆ»o voĆøng laĆ«p khoĆ¢ng thƶĆÆc hieƤn neĆ”u CX=0
                 JCXZ SKIP
        TOP :
                 ; thaĆ¢n voĆøng laĆ«p
                 LOOP TOP
        SKIP :

        b) VoĆøng WHILE

      VoĆøng WHILE phuĆÆ thuoƤc vaĆøo 1 ƱieĆ u kieƤn .NeĆ”u ƱieĆ u kieƤn ƱuĆ¹ng thƬ thƶĆÆc hieƤn
voĆøng WHILE . VƬ vaƤy neĆ”u ƱieĆ u kieƤn sai thƬ voĆøng WHILE khoĆ¢ng thƶĆÆc hieƤn gƬ caĆ» .
      VĆ­ duĆÆ : VieĆ”t ƱoaĆÆn maƵ ƱeĆ„ ƱeĆ”m soĆ” kyĆ¹ tƶĆÆ Ć±Ć¶Ć“ĆÆc nhaƤp vaĆøo treĆ¢n cuĆøng moƤt haĆøng .
                      MOV DX,0                 ; DX ƱeĆ„ ƱeĆ”m soĆ” kyĆ¹ tƶĆÆ
                      MOV AH,1                 ;haĆøm ƱoĆÆc 1 kyĆ¹ tƶĆÆ
                      INT 21h                  ; ƱoĆÆc kyĆ¹ tƶĆÆ vaĆøo AL
      WHILE_:
                      CMP AL,0DH               ; coĆ¹ phaĆ»i laĆø kyĆ¹ tƶĆÆ CR?
                      JE      END_WHILE                ; ƱuĆ¹ng , thoaĆ¹t
                      INC DX                   ;taĆŖng DX leĆ¢n 1
                      INT 21h                  ; ƱoĆÆc kyĆ¹ tƶĆÆ
                      JMP WHILE_               ; laƫp
      END_WHILE :



        c) VoĆøng REPEAT

        CaĆ”u truĆ¹c cuĆ»a REPEAT laĆø
                repeat statements
                until condition
         Trong caĆ”u truĆ¹c repeat meƤnh ƱeĆ  ƱƶƓĆÆc thi haĆønh ƱoĆ ng thĆ“Ćøi ƱieĆ u kieƤn ƱƶƓĆÆc kieĆ„m
tra. NeĆ”u ƱieĆ u kieƤn ƱuĆ¹ng thƬ voĆøng laĆ«p keĆ”t thuĆ¹c .
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                         39


        VĆ­ duĆÆ : vieĆ”t ƱoaĆÆn maƵ ƱeĆ„ ƱoĆÆc vaĆøo caĆ¹c kyĆ¹ tƶĆÆ cho ƱeĆ”n khi gaĆ«p kyĆ¹ tƶĆÆ troĆ”ng .

               MOV       AH,1            ; ƱoĆÆc kyĆ¹ tƶĆÆ
        REPEAT:
               INT       21h             ; kyĆ¹ tƶĆÆ treĆ¢n AL
        ;until
               CMP       AL,ā€™ ā€˜          ; AL=ā€˜ ā€˜?
               JNE       REPEAT

        Lƶu yĆ¹ : vieƤc sƶƻ duĆÆng REPEAT hay WHILE laĆø tuyĆø theo chuĆ» quan cuĆ»a moĆ£i
ngƶƓĆøi . Tuy nhieĆ¢n coĆ¹ theĆ„ thaĆ”y raĆØng REPEAT phaĆ»i tieĆ”n haĆønh Ć­t nhaĆ”tĆ¹ laĆ n , trong khi ƱoĆ¹
WHILE coĆ¹ theĆ„ khoĆ¢ng tieĆ”n haĆønh laĆ n naĆøo caĆ» neĆ”u ngay tƶĆø ƱaĆ u ƱieĆ u kieƤn ƱaƵ bĆ² sai .

        3.5     LaƤp trƬnh vĆ“Ć¹i caĆ”u truĆ¹c caĆ”p cao

         BaĆøi toaĆ¹n : VieĆ”t chƶƓng trƬnh nhaĆ©c ngƶƓĆøi duĆøng goƵ vaĆøo moƤt doĆøng vaĆŖn baĆ»n .
TreĆ¢n 2 doĆøng tieĆ”p theo in ra kyĆ¹ tƶĆÆ vieĆ”t hoa ƱaĆ u tieĆ¢n vaĆø kyĆ¹ tƶĆÆ vieĆ”t hoa cuoĆ”i cuĆøng theo
thĆ¶Ć¹ tƶĆÆ alphabetical . NeĆ”u ngƶƓĆøi duĆøng goƵ vaĆøo moƤt kyĆ¹ tƶĆÆ thƶƓĆøng , maĆ¹y seƵ thoĆ¢ng baĆ¹o
ā€˜No capitalsā€™
         KeĆ”t quĆ»a chaĆÆy chƶƓng trƬnh seƵ nhƶ sau :
         Type a line of text :
         TRUONG DAi HOC DALAT
         First capital = A
         Last capital = U

        ƑeĆ„ giaĆ»i baĆøi toaĆ¹n naĆøy ta duĆøng kyƵ thuaƤt laƤp trƬnh TOP-DOWN , nghĆ³a laĆø chia
nhoĆ» baĆøi toaĆ¹n thaĆønh nhieĆ u baĆøi toaĆ¹n con . CoĆ¹ theĆ„ chia baĆøi toaĆ¹n thaĆønh 3 baĆøi toaĆ¹n con
nhƶ sau :
        1. XuaĆ”t 1 chuoĆ£i kyĆ¹ tƶĆÆ ( lĆ“Ćøi nhaĆ©c)
        2. ƑoĆÆc vaĆø xƶƻ lyĆ¹ 1 doĆøng vaĆŖn baĆ»n
        3. In keƔt quƻa

        BĆ¶Ć“Ć¹c 1: HieƤn daĆ”u nhaĆ©c .
        BĆ¶Ć“Ć¹c naĆøy coĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau :

        MOV AH,9                ; haĆøm xuaĆ”t chuoĆ£i
        LEA DX,PRMOPT ;laĆ”y Ć±Ć²a chƦ chuoĆ£i vaĆøo DX
        INT 21H                 ; xuaĆ”t chuoĆ£i
        DaĆ”u nhaĆ©c coĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau trong ƱoaĆÆn soĆ” lieƤu .
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                       40


        PROMPT          DB       ā€˜Type a line of text :ā€™,0DH,0AH,ā€™$ā€™

        BĆ¶Ć“Ć¹c 2 : ƑoĆÆc vaĆø xƶƻ lyĆ¹ moƤt doĆøng vaĆŖn baĆ»n

       BĆ¶Ć“Ć¹c naĆøy thƶĆÆc hieƤn haĆ u heĆ”t caĆ¹c coĆ¢ng vieƤc cuĆ»a chƶƓng trƬnh : ƱoĆÆc caĆ¹c kyĆ¹ tƶĆÆ tƶĆø
baĆøn phĆ­m , tƬm ra kyĆ¹ tƶĆÆ Ć±aĆ u vaĆø kyĆ¹ tƶĆÆ cuoĆ”i , nhaĆ©c nhĆ“Ć» ngƶƓĆøi duĆøng neĆ”u kyĆ¹ tƶĆÆ goƵ vaĆøo
khoĆ¢ng phaĆ»i laĆø kyĆ¹ tƶĆÆ hoa .
       CoĆ¹ theĆ„ bieĆ£u dieĆ£n bĆ¶Ć“Ć¹c naĆøy bĆ“Ć»i thuaƤt toaĆ¹n sau :
       Read a character
WHILE character is not a carrige return DO
IF character is a capital (*)
       THEN
                 IF character precedes first capital
                          Then
                                 first capital= character
                 End_if
                 IF character follows last character
                          Then
                                 last character = character
                 End_if
END_IF
       Read a character
END_WHILE

        Trong ƱoĆ¹ doĆøng (*) coĆ¹ nghĆ³a laĆø ƱieĆ u kieƤn ƱeĆ„ kyĆ¹ tƶĆÆ laĆø hoa laĆø ƱieĆ u kieƤn AND
        IF ( ā€˜Aā€™<= character ) AND ( character <= ā€˜Zā€™)

BĆ¶Ć“Ć¹c 2 coĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau :

                MOV AH,1 ; ƱoĆÆc kyĆ¹ tƶĆÆ
                INT 21H ; kyĆ¹ tƶĆÆ treĆ¢n AL
WHILE :
;trong khi kyĆ¹ tƶĆÆ goƵ vaĆøo khoĆ¢ng phaĆ»i laĆø CR thƬ thƶĆÆc hieƤn
                   CMP AL,0DH            ; CR?
                   JE    END_WHILE               ;yes, thoaĆ¹t
; neĆ”u kyĆ¹ tƶĆÆ laĆø hoa
                   CMP AL,ā€™Aā€™            ; char >=ā€˜Aā€™?
                   JNGE END_IF           ;khoĆ¢ng phaĆ»i kyĆ¹ tƶĆÆ hoa thƬ nhaĆ»y ƱeĆ”n END_IF
                   CMP AL,ā€™Zā€™                    ; char <= ā€˜Zā€™?
                   JNLE END_IF           ; khoĆ¢ng phaĆ»i kyĆ¹ tƶĆÆ hoa thƬ nhaĆ»y ƱeĆ”n END_IF
; thƬ
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                             41


; neĆ”u kyĆ¹ tƶĆÆ naĆØm trĆ¶Ć“Ć¹c bieĆ”n FIRST ( giaĆ¹ trĆ² ban ƱaĆ u laĆøā€˜[ā€˜ : kyĆ¹ tƶĆÆ sau Z )
                   CMP AL,FISRT           ; char < FIRST ?
                   JNL CHECK_LAST; >=
; thƬ kyĆ¹ tƶĆÆ vieĆ”t hoa ƱaĆ u tieĆ¢n = kyĆ¹ tƶĆÆ
                   MOV FIRST,AL           ; FIRST=character
;end_if
CHECK_LAST:
; neĆ”u kyĆ¹ tƶĆÆ laĆø sau bieĆ”n LAST ( giaĆ¹ trĆ² ban ƱaĆ u laĆø ā€˜@ā€™: kyĆ¹ tƶĆÆ trĆ¶Ć“Ć¹c A)
                   CMP AL,LAST            ; char > LAST ?
                   JNG END_IF             ; <=
;thƬ kyĆ¹ tƶĆÆ cuoĆ”i cuĆøng = kyĆ¹ tƶĆÆ
                   MOV LAST, AL           ;LAST = character
;end_if
END_IF :
; ƱoĆÆc moƤt kyĆ¹ tƶĆÆ
                   INT 21H                ; kyĆ¹ tƶĆÆ treĆ¢n AL
                   JMP WHILE_             ; laƫp
END_WHILE:
CaĆ¹c bieĆ”n FIRST vaĆø LAST ƱƶƓĆÆc Ć±Ć²nh nghĆ³a nhƶ sau trong ƱoaĆÆn soĆ” lieƤu :
         FIRST             DB       ā€˜[ $ā€˜ ; ā€˜[ā€˜ laĆø kyĆ¹ tƶĆÆ sau Z
         LAST              DB      ā€˜@ $ ā€™ ; ā€˜@ā€™ laĆø kyĆ¹ tƶĆÆ trĆ¶Ć“Ć¹c A



BĆ¶Ć“Ć¹c 3 : In keĆ”t quĆ»a
ThuaƤt toaĆ¹n
IF no capital were typed
THEN
        display ā€˜No capitalā€™
ELSE
        display first capital and last capital
END_IF

BĆ¶Ć“Ć¹c 3 seƵ phaĆ»i in ra caĆ¹c thoĆ¢ng baĆ¹o :
ā€¢ NOCAP_MSG neĆ”u khoĆ¢ng phaĆ»i chƶƵ in
ā€¢ CAP1_MSG chƶƵ in ƱaĆ u tieĆ¢n
ā€¢ CAP2_MSG chƶƵ in cuoĆ”i cuĆøng
ChuĆ¹ng ƱƶƓĆÆc Ć±Ć²nh nghĆ³a nhƶ sau trong ƱoaĆÆn soĆ” lieƤu .
       NOCAP_MSG                 DB      0DH,0AH,ā€˜No capitals $ā€™
       CAP1_MSG                  DB      0DH,0AH, ā€˜First capital= ā€™
       FIRST                     DB      ā€˜[ $ ā€™
       CAP2_MSG                  DB      0DH,0AH,ā€˜Last capital=ā€™
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                     42


       LAST                    DB      ā€˜@ $ā€™

BĆ¶Ć“Ć¹c 3 coĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau :
;in keƔt quaƻ
         MOV AH,9 ; haĆøm xuaĆ”t kyĆ¹ tƶĆÆ
; IF khoĆ¢ng coĆ¹ chƶƵ hoa naĆøo ƱƶƓĆÆc nhaƤp thƬ FIRST =ā€˜[ā€™
         CMP FIRST,ā€™[ā€™          ; FIRST=ā€˜[ā€™ ?
         JNE CAPS               ; khoĆ¢ng , in keĆ”t quĆ»a
;THEN
         LEA DX,NOCAP_MSG
         INT 21H
CAPS:
         LEA DX,CAP1_MSG
         INT 21H
         LEA DX,CAP2_MSG
         INT 21H
; end_if

       ChƶƓng trƬnh coĆ¹ theĆ„ vieĆ”t nhƶ sau :

       TITLE PGM3-1 : FIRST AND LAST CAPITALS
       .MODEL    SMALL
       .STACK    100h
       .DATA
       PROMPT    DB     ā€˜Type a line of textā€™, 0DH, AH, ā€˜$ā€™
       NOCAP_MSG        DB    0DH,0AH, ā€˜No capitals $ā€™
       CAP1_MSG         DB    0DH,0AH, ā€˜First capital=ā€™
       FIRST            DB    ā€˜[ $ā€™
       CAP2_MSG         DB    ā€˜Last capital = ā€™
       LAST             DB    ā€˜@ $ā€™

       .CODE
       MAIN            PROC
       ; khĆ“Ć»i taĆÆo DS
                MOV AX,@DATA
                MOV DS,AX
       ; in daƔu nhaƩc

               MOV AH,9      ; haĆøm xuaĆ”t chuoĆ£i
               LEA DX,PROMPT ;laĆ”y Ć±Ć²a chƦ chuoĆ£i vaĆøo DX
               INT 21H       ; xuaĆ”t chuoĆ£i
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh                                                     43


;ƱoĆÆc vaĆø xƶƻ lyĆ¹ 1 doĆøng vaĆŖn baĆ»n
                   MOV AH,1 ; ƱoĆÆc kyĆ¹ tƶĆÆ
                   INT 21H ; kyĆ¹ tƶĆÆ treĆ¢n AL
WHILE :
;trong khi kyĆ¹ tƶĆÆ goƵ vaĆøo khoĆ¢ng phaĆ»i laĆø CR thƬ thƶĆÆc hieƤn
                   CMP AL,0DH              ; CR?
                   JE      END_WHILE                 ;yes, thoaĆ¹t
; neĆ”u kyĆ¹ tƶĆÆ laĆø hoa
                   CMP AL,ā€™Aā€™              ; char >=ā€˜Aā€™?
                   JNGE END_IF             ;khoĆ¢ng phaĆ»i kyĆ¹ tƶĆÆ hoa thƬ nhaĆ»y ƱeĆ”n END_IF
                   CMP AL,ā€™Zā€™                        ; char <= ā€˜Zā€™?
                   JNLE END_IF             ; khoĆ¢ng phaĆ»i kyĆ¹ tƶĆÆ hoa thƬ nhaĆ»y ƱeĆ”n END_IF
; thƬ
; neĆ”u kyĆ¹ tƶĆÆ naĆØm trĆ¶Ć“Ć¹c bieĆ”n FIRST
                   CMP AL,FISRT            ; char < FIRST ?
                   JNL CHECK_LAST; >=
; thƬ kyĆ¹ tƶĆÆ vieĆ”t hoa ƱaĆ u tieĆ¢n = kyĆ¹ tƶĆÆ
                   MOV FIRST,AL            ; FIRST=character
;end_if
CHECK_LAST:
; neĆ”u kyĆ¹ tƶĆÆ laĆø sau bieĆ”n LAST
                   CMP AL,LAST             ; char > LAST ?
                   JNG END_IF              ; <=
;thƬ kyĆ¹ tƶĆÆ cuoĆ”i cuĆøng = kyĆ¹ tƶĆÆ
                   MOV LAST, AL            ;LAST = character
;end_if
END_IF :
; ƱoĆÆc moƤt kyĆ¹ tƶĆÆ
                   INT 21H                 ; kyĆ¹ tƶĆÆ treĆ¢n AL
                   JMP WHILE_              ; laƫp
END_WHILE:
;in keƔt quaƻ
         MOV AH,9 ; haĆøm xuaĆ”t kyĆ¹ tƶĆÆ
; IF khoĆ¢ng coĆ¹ chƶƵ hoa naĆøo ƱƶƓĆÆc nhaƤp thƬ FIRST =ā€˜[ā€˜
         CMP FIRST,ā€™[ā€˜             ; FIRST=ā€˜[ā€˜ ?
         JNE CAPS                  ; khoĆ¢ng , in keĆ”t quĆ»a
;Then
         LEA DX,NOCAP_MSG
         INT 21H
CAPS:
         LEA DX,CAP1_MSG
ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh   44


        INT 21H
        LEA DX,CAP2_MSG
        INT 21H
        ; end_if
; dos exit
        MOV AH,4CH
        INT 21h
MAIN ENDP
        END MAIN
ChƶƓng 4 : CaĆ¹ c leƤ n h dĆ²ch vaĆø quay                                                            45


                ChƶƓng 4 : CAƙC LEƄNH LOGIC , DƒCH VAƘ QUAY

        Trong chƶƓng naĆøy chuĆ¹ng ta seƵ xem xeĆ¹t caĆ¹c leƤnh maĆø chuĆ¹ng coĆ¹ theĆ„ duĆøng ƱeĆ„
thay ƱoĆ„i tƶĆøng bit treĆ¢n moƤt byte hoaĆ«c moƤt tƶĆø soĆ” lieƤu . KhaĆ» naĆŖng quaĆ»n lyĆ¹ ƱeĆ”n tƶĆøng bit
thƶƓĆøng laĆø khoĆ¢ng coĆ¹ trong caĆ¹c ngoĆ¢n ngƶƵ caĆ”p cao ( trƶĆø C ) vaĆø ƱaĆ¢y laĆø lyĆ¹ do giaĆ»i thĆ­ch taĆÆi
sao hĆ“ĆÆp ngƶƵ vaĆ£n ƱoĆ¹ng vai troĆø quan troĆÆng trong khi laƤp trƬnh .

        4.1     CaĆ¹c leƤnh logic

         ChuĆ¹ng ta coĆ¹ theĆ„ duĆøng caĆ¹c leƤnh logic ƱeĆ„ thay ƱoĆ„i tƶĆøng bit treĆ¢n byte hoaĆ«c treĆ¢n
moƤt tƶĆø soĆ” lieƤu .
         Khi moƤt pheĆ¹p toaĆ¹n logic ƱƶƓĆÆc aĆ¹p duĆÆng cho toaĆ¹n haĆÆng 8 hoaĆ«c 16 bit thƬ coĆ¹ theĆ„
aĆ¹p duĆÆng pheĆ¹p toaĆ¹n logic ƱoĆ¹ treĆ¢n tƶĆøng bit ƱeĆ„ thu ƱƶƓĆÆc keĆ”t quĆ»a cuoĆ”i cuĆøng .
         VĆ­ duĆÆ : ThƶĆÆc hieƤn caĆ¹c pheĆ¹p toaĆ¹n sau :
                  1.     10101010 AND 1111 0000
                  2.     10101010 OR 1111 0000
                  3.     10101010 XOR 1111 0000
                  4.     NOT 10101010
         Giaƻi :
                  1.              10101010
                         AND 1111 0000

                         =       1010 0000

                2.               10101010
                         OR      1111 0000

                         =       1111 1010

                3.           1010 1010
                         XOR 1111 0000

                                 0101 1010

                4.       NOT 10101010
                         =   01010101
ChƶƓng 4 : CaĆ¹ c leƤ n h dĆ²ch vaĆø quay                                                            46


                4.1.1 LeƤnh AND,OR vaĆø XOR

         LeƤnh AND,OR vaĆø XOR thƶĆÆc hieƤn caĆ¹c chĆ¶Ć¹c naĆŖng ƱuĆ¹ng nhƶ teĆ¢n goĆÆi cuĆ»a noĆ¹ .
         CuĆ¹ phaĆ¹p cuĆ»a chuĆ¹ng laĆø :
                 AND destination , source
                  OR destination , source
                 XOR destination , source
         KeĆ”t quĆ»a cuĆ»a leƤnh ƱƶƓĆÆc lƶu trƶƵ trong toaĆ¹n haĆÆng Ʊƭch do ƱoĆ¹ chuĆ¹ng phaĆ»i laĆø thanh
ghi hoaĆ«c vĆ² trĆ­ nhĆ“Ć¹ . ToaĆ¹n haĆÆng nguoĆ n laĆø coĆ¹ theĆ„ laĆø haĆØng soĆ” , thanh ghi hoaĆ«c vĆ² trĆ­ nhĆ“Ć¹ .
DĆ³ nhieĆ¢n hai toaĆ¹n haĆÆng ƱeĆ u laĆø vĆ² trĆ­ nhĆ“Ć¹ laĆø khoĆ¢ng ƱƶƓĆÆc pheĆ¹p .
         AĆ»nh hƶƓƻng ƱeĆ”n caĆ¹c cĆ“Ćø :
                 CaĆ¹c cĆ“Ćø SF,ZF vaĆø PF phaĆ»n aĆ¹nh keĆ”t quĆ»a
                 AF khoĆ¢ng xaĆ¹c Ć±Ć²nh
                 CF=OF=0
         ƑeĆ„ thay ƱoĆ„i tƶĆøng bit theo yĆ¹ muoĆ”n chuĆ¹ng ta xaĆ¢y dƶĆÆng toaĆ¹n haĆÆng nguoĆ n theo
kieĆ„u maĆ«t naĆÆ ( mask) . ƑeĆ„ xaĆ¢y dƶĆÆng maĆ«t naĆÆ chuĆ¹ng ta sƶƻ duĆÆng caĆ¹c tĆ­nh chaĆ”t sau ƱaĆ¢y
cuĆ»a caĆ¹c pheĆ¹p toaĆ¹n AND ,OR vaĆø XOR :

             b AND 1 = b             b OR 0 = b           b XOR 0 = b
             b AND 0 = 0             b OR 1 = 1           b XOR 1 = not b

ā€¢ LeƤnh AND coĆ¹ theĆ„ duĆøng ƱeĆ„ xoĆ¹a ( clear) toaĆ¹n haĆÆng Ʊƭch neĆ”u maĆ«t naĆÆ baĆØng 0
ā€¢ LeƤnh OR coĆ¹ theĆ„ duĆøng ƱeĆ„ ƱaĆ«t ( set) 1 cho toaĆ¹n haĆÆng Ʊƭch neĆ”u maĆ«t naĆÆ baĆØng 1
ā€¢ LeƤnh XOR coĆ¹ theĆ„ duĆøng ƱeĆ„ laĆ”y ƱaĆ»o toaĆ¹n haĆÆng Ʊƭch neĆ”u maĆ«t naĆÆ baĆØng 1 . LeƤnh XOR
cuƵng coĆ¹ theĆ„ duĆøng ƱeĆ„ xoĆ¹a noƤi dung moƤt thanh ghi ( XOR vĆ“Ć¹i chĆ­nh noĆ¹ )
        VĆ­ duĆÆ : XoaĆ¹ bit daĆ”u cuĆ»a AL trong khi caĆ¹c bit khaĆ¹c khoĆ¢ng thay ƱoĆ„i
        GiaĆ»i : DuĆøng leƤnh AND vĆ“Ć¹i maĆ«t naĆÆ 0111111=7Fh
                 AND AL,7Fh               ; xoĆ¹a bit daĆ”u ( daĆ”u + ) cuĆ»a AL
        VĆ­ duĆÆ : Set 1 cho caĆ¹c bit MSB vaĆø LSB cuĆ»a AL , caĆ¹c bit khaĆ¹c khoĆ¢ng thay ƱoĆ„i .
        GiaĆ»i : DuĆøng leƤnh OR vĆ“Ć¹i maĆ«t naĆÆ 10000001 =81h
                 OR      AL,81h           ; set 1 cho LSB vaĆø MSB cuĆ»a AL
        VĆ­ duĆÆ : Thay ƱoĆ„i bit daĆ”u cuĆ»a DX
        GiaĆ»i : DuĆøng leƤnh XOR vĆ“Ć¹i maĆ«t naĆÆ 1000000000000000=8000h
                 XOR DX,8000h
        CaĆ¹c leƤnh logic laĆø ƱaĆ«c bieƤt coĆ¹ Ć­ch khi thƶĆÆc hieƤn caĆ¹c nhieƤm vuĆÆ sau :

        ƑoĆ„i moƤt soĆ” dĆ¶Ć“Ć¹i daĆÆng ASCII thaĆønh moƤt soĆ”
        GiaĆ» sƶƻ raĆØng chuĆ¹ng ta ƱoĆÆc moƤt kyĆ¹ tƶĆÆ tƶĆø baĆøn phĆ­m baĆØng haĆøm 1 ngaĆ©t 21h . Khi
ƱoĆ¹ AL chĆ¶Ć¹a maƵ ASCII cuĆ»a kyĆ¹ tƶĆÆ . ƑieĆ u naĆøy cuƵng ƱuĆ¹ng neĆ”u kyĆ¹ tƶĆÆ Ć±oĆ¹ laĆø moƤt soĆ”
( digital character) . VĆ­ duĆÆ neĆ”u chuĆ¹ng ta goĆ» soĆ” 5 thƬ AL = 35h ( ASCII code for 5)
ChƶƓng 4 : CaĆ¹ c leƤ n h dĆ²ch vaĆø quay                                                           47


       ƑeĆ„ chĆ¶Ć¹a 5 treĆ¢n AL chuĆ¹ng ta duĆøng leƤnh :
               SUB AL,30h
       CoĆ¹ moƤt caĆ¹ch khaĆ¹c ƱeĆ„ laĆøm vieƤc naĆøy laĆø duĆøng leƤnh AND ƱeĆ„ xoĆ¹a nƶƻa byte cao
(high nibble = 4 bit cao ) cuƻa AL :
               AND AL,0Fh
       VƬ caĆ¹c soĆ” tƶĆø 0-9 coĆ¹ maƵ ASCII tƶĆø 30h-39h , neĆ¢n caĆ¹ch naĆøy duĆøng ƱeĆ„ ƱoĆ„i moĆÆi soĆ”
ASCII ra thaƤp phaĆ¢n .
       ChƶƓng trƬnh hĆ“ĆÆp ngƶƵ ƱoĆ„i moƤt soĆ” thaƤp phaĆ¢n thaĆønh maƵ ASCII cuĆ»a chuĆ¹ng ƱƶƓĆÆc
xem nhƶ baĆøi taƤp .

         ƑoĆ„i chƶƵ thƶƓĆøng thaĆønh chƶƵ hoa
         MaƵ ASCII cuĆ»a caĆ¹c kyĆ¹ tƶĆÆ thƶƓĆøng tƶĆø a-z laĆø 61h-7Ah vaĆø maƵ ASCII cuĆ»a caĆ¹c kyĆ¹
tƶĆÆ hoa tƶĆø A-Z laĆø 41h -5Ah . GiaĆ» sƶƻ DL chƶaĆ¹ kyĆ¹ tƶĆÆ thƶƓĆøng , ƱeĆ„ ƱoĆ„i noĆ¹ thaĆønh chƶƵ hoa
ta duĆø ng leƤnh :

                 SUB DL,20h
         NeĆ”u chuĆ¹ng ta so saĆ¹nh maƵ nhĆ² phaĆ¢n tƶƓng Ć¶Ć¹ng cuĆ»a kyĆ¹ tƶĆÆ thƶƓĆøng vaĆø kyĆ¹ tƶĆÆ hoa
thƬ thaĆ”y raĆØng chƦ caĆ n xoĆ¹a bit thĆ¶Ć¹ 5 thƬ seƵ ƱoĆ„i kyĆ¹ tƶĆÆ thƶƓĆøng sang kyĆ¹ tƶĆÆ hoa .
         Character Code                  Character                  Code
         a(61h)         01100001         A (41h)                    01000001
         b (62h)        01100010         B ( 42h)                   01000010
         .
         .
         z ( 7Ah)       01111010         Z ( 5Ah)                   01011010

        CoĆ¹ theĆ„ xoĆ¹a bit thĆ¶Ć¹ 5 cuĆ»a DL baĆØng caĆ¹ch duĆøng leƤnh AND vĆ“Ć¹i maĆ«t naĆÆ
        11011111= DF h
                 AND DL,0DFh            ; ƱoĆ„i kyĆ¹ tƶĆÆ thƶƓĆøng trong DL sang kyĆ¹ tƶĆÆ hoa

        XoĆ¹a moƤt thanh ghi

       ChuĆ¹ng ta coĆ¹ theĆ„ duĆøng leƤnh sau ƱeĆ„ xoĆ¹a thanh ghi AX :
              MOV AX,0
       hoaƫc SUB AX,AX
              XOR AX,AX
       LeƤnh thĆ¶Ć¹ nhaĆ”t caĆ n 3 bytes trong khi ƱoĆ¹ 2 leƤnh sau chƦ caĆ n 2 bytes . Nhƶng
leƤnh MOV phaĆ»i ƱƶƓĆÆc duĆøng ƱeĆ„ xoaĆ¹ 1 vĆ² trĆ­ nhĆ“Ć¹ .




        KieĆ„m tra moƤt thanh ghi coĆ¹ baĆØng 0 ?
ChƶƓng 4 : CaĆ¹ c leƤ n h dĆ²ch vaĆø quay                                                         48



        Thay cho leƤnh
                CMP AX,0
        NgƶƓĆøi ta duĆøng leƤnh
                OR      CX,CX
ƱeĆ„ kieĆ„m tra xem CX coĆ¹ baĆØng 0 hay khoĆ¢ng vƬ noĆ¹ laĆøm thay ƱoĆ„i cĆ“Ćø ZF ( ZF=0 neĆ”u CX=0
)

        4.1.2 LeƤnh NOT

        LeƤnh NOT duĆøng ƱeĆ„ laĆ”y buĆø 1 ( ƱaĆ»o) toaĆ¹n haĆÆng Ʊƭch . CuĆ¹ phaĆ¹p laĆø :
                NOT destination
        KhoĆ¢ng coĆ¹ cĆ“Ćø naĆøo bĆ² aĆ»nh hƶƓƻng bĆ“Ć»i leƤnh NOT
        VĆ­ duĆÆ : LaĆ”y buĆø 1 AX
                NOT AX

        4.1.3 LeƤnh TEST

          LeƤnh TEST thƶĆÆc hieƤn pheĆ¹p AND giƶƵa toaĆ¹n haĆÆng Ʊƭch vaĆø toaĆ¹n haĆÆng nguoĆ n
nhƶng khoĆ¢ng laĆøm thay ƱoĆ„i toaĆ¹n haĆÆng Ʊƭch . MuĆÆc Ʊƭch cuĆ»a leƤnh TEST laĆø ƱeĆ„ set caĆ¹c cĆ“Ćø
traĆÆng thaĆ¹i . CuĆ¹ phaĆ¹p cuĆ»a leƤnh test laĆø :
                    TEST destination,source
          CaĆ¹c cĆ“Ćø bĆ² aĆ»nh hƶƓƻng cuĆ»a leƤnh TEST :
                    SF,ZF vaĆø PF phaĆ»n aĆ¹nh keĆ”t quĆ»a
                    AF khoĆ¢ng xaĆ¹c Ć±Ć²nh
                    CF=OF=0
          LeƤnh TEST coĆ¹ theĆ„ duĆøng ƱeĆ„ khaĆ¹m 1 bit treĆ¢n toaĆ¹n haĆÆng . MaĆ«t naĆÆ phaĆ»i chĆ¶Ć¹a bit 1
taĆÆi vĆ² trĆ­ caĆ n khaĆ¹m , caĆ¹c bit khaĆ¹c thƬ baĆØng 0 . KeĆ”t quaĆ» cuĆ»a leƤnh :
                    TEST destination,mask
seƵ laĆø 1 taĆÆi bit caĆ n test neĆ”u nhƶ toaĆ¹n haĆÆng Ʊƭch chĆ¶Ć¹a 1 taĆÆi bit test . NeĆ”u toaĆ¹n haĆÆng
Ʊƭch chĆ¶Ć¹a 0 taĆÆi bit test thƬ keĆ”t quaĆ» seƵ baĆØng 0 vaĆø do ƱoĆ¹ ZF=1 .
          VĆ­ duĆÆ : NhaĆ»y tĆ“Ć¹i nhaƵn BELOW neĆ”u AL laĆø moƤt soĆ” chaĆŗn
          GiaĆ»i : SoĆ” chaĆŗn coĆ¹ bit thĆ¶Ć¹ 0 baĆØng 0 , leƤnh
                    TEST AL,1               ; AL chaĆŗn ?
                    JZ      BELOW           ; ƱuĆ¹ng , nhaĆ»y ƱeĆ”n BELOW




        4.2     LeƤnh SHIFT
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu
Giao Trinh Hop Ngu

More Related Content

Similar to Giao Trinh Hop Ngu

Lenh tat trong autocad
Lenh tat trong autocadLenh tat trong autocad
Lenh tat trong autocad
http://lenhan.net
Ā 
huong dan PHP-2
huong dan PHP-2huong dan PHP-2
huong dan PHP-2
xeroxk
Ā 
GiƔo trƬnh S7300
GiƔo trƬnh S7300GiƔo trƬnh S7300
GiƔo trƬnh S7300
quanglocbp
Ā 
Giao trinh-autocad-2007-pham van hau
Giao trinh-autocad-2007-pham van hauGiao trinh-autocad-2007-pham van hau
Giao trinh-autocad-2007-pham van hau
DUNGZIDAN
Ā 
Chuong04
Chuong04Chuong04
Chuong04
na
Ā 

Similar to Giao Trinh Hop Ngu (20)

Giao trinh hop ngu (1)
Giao trinh hop ngu (1)Giao trinh hop ngu (1)
Giao trinh hop ngu (1)
Ā 
Giao trinh hop_ngu
Giao trinh hop_nguGiao trinh hop_ngu
Giao trinh hop_ngu
Ā 
Chį»n HSG lį»›p 9 - ĐƠ Nįŗµng NH 2012 2013
Chį»n HSG lį»›p 9 - ĐƠ Nįŗµng NH 2012 2013 Chį»n HSG lį»›p 9 - ĐƠ Nįŗµng NH 2012 2013
Chį»n HSG lį»›p 9 - ĐƠ Nįŗµng NH 2012 2013
Ā 
Plc
PlcPlc
Plc
Ā 
Lenh tat trong autocad
Lenh tat trong autocadLenh tat trong autocad
Lenh tat trong autocad
Ā 
HĘ°į»›ng dįŗ«n cĆ i đįŗ·t bį»™ điį»u khiį»ƒn siemens simatic logo!
HĘ°į»›ng dįŗ«n cĆ i đįŗ·t bį»™ điį»u khiį»ƒn siemens simatic logo!HĘ°į»›ng dįŗ«n cĆ i đįŗ·t bį»™ điį»u khiį»ƒn siemens simatic logo!
HĘ°į»›ng dįŗ«n cĆ i đįŗ·t bį»™ điį»u khiį»ƒn siemens simatic logo!
Ā 
huong dan PHP-2
huong dan PHP-2huong dan PHP-2
huong dan PHP-2
Ā 
GiƔo trƬnh S7300
GiƔo trƬnh S7300GiƔo trƬnh S7300
GiƔo trƬnh S7300
Ā 
13.chap13 distributed systems
13.chap13 distributed systems13.chap13 distributed systems
13.chap13 distributed systems
Ā 
Giao trinh-autocad-2007-tieng-viet
Giao trinh-autocad-2007-tieng-vietGiao trinh-autocad-2007-tieng-viet
Giao trinh-autocad-2007-tieng-viet
Ā 
Giaotrinhautocad2007 pgh
Giaotrinhautocad2007 pghGiaotrinhautocad2007 pgh
Giaotrinhautocad2007 pgh
Ā 
Giao trinh-autocad-2007-pham van hau
Giao trinh-autocad-2007-pham van hauGiao trinh-autocad-2007-pham van hau
Giao trinh-autocad-2007-pham van hau
Ā 
Tu hoc matlab
Tu hoc matlabTu hoc matlab
Tu hoc matlab
Ā 
Ch01
Ch01Ch01
Ch01
Ā 
Tailieu.vncty.com tu hoc-matlab
Tailieu.vncty.com   tu hoc-matlabTailieu.vncty.com   tu hoc-matlab
Tailieu.vncty.com tu hoc-matlab
Ā 
giao-trinh-tu-hoc-matlab.pdf
giao-trinh-tu-hoc-matlab.pdfgiao-trinh-tu-hoc-matlab.pdf
giao-trinh-tu-hoc-matlab.pdf
Ā 
Chuong04
Chuong04Chuong04
Chuong04
Ā 
1 -nhapmon
1  -nhapmon1  -nhapmon
1 -nhapmon
Ā 
Chuong 4 he thong truyen dan pdh va sdh
Chuong 4 he thong truyen dan pdh va sdhChuong 4 he thong truyen dan pdh va sdh
Chuong 4 he thong truyen dan pdh va sdh
Ā 
Lenh cad
Lenh cadLenh cad
Lenh cad
Ā 

More from bstuananh (11)

36 Ke Nhan Hoa(Q2) 792
36 Ke Nhan Hoa(Q2)  79236 Ke Nhan Hoa(Q2)  792
36 Ke Nhan Hoa(Q2) 792
Ā 
36 Ke Nhan Hoa(Q1) 791
36 Ke Nhan Hoa(Q1) 79136 Ke Nhan Hoa(Q1) 791
36 Ke Nhan Hoa(Q1) 791
Ā 
Ke Chuyen Ve Kim Loai(Q2) 784
Ke Chuyen Ve Kim Loai(Q2) 784Ke Chuyen Ve Kim Loai(Q2) 784
Ke Chuyen Ve Kim Loai(Q2) 784
Ā 
Ke Chuyen Ve Kim Loai(Q1) 783
Ke Chuyen Ve Kim Loai(Q1) 783Ke Chuyen Ve Kim Loai(Q1) 783
Ke Chuyen Ve Kim Loai(Q1) 783
Ā 
Thuat Xu The Cua Nguoi Xua 659
Thuat Xu The Cua Nguoi Xua 659Thuat Xu The Cua Nguoi Xua 659
Thuat Xu The Cua Nguoi Xua 659
Ā 
Hu Ng D N DƠNh Cho Ngu I Cao Huy T ƔP
Hu Ng D N DƠNh Cho Ngu I Cao Huy T ƔPHu Ng D N DƠNh Cho Ngu I Cao Huy T ƔP
Hu Ng D N DƠNh Cho Ngu I Cao Huy T ƔP
Ā 
KhƔM Tim
KhƔM TimKhƔM Tim
KhƔM Tim
Ā 
Kham Ho Hap
Kham Ho HapKham Ho Hap
Kham Ho Hap
Ā 
Benh Dau Lung
Benh Dau LungBenh Dau Lung
Benh Dau Lung
Ā 
Bo Dung Cu Phau Thuat
Bo Dung Cu Phau ThuatBo Dung Cu Phau Thuat
Bo Dung Cu Phau Thuat
Ā 
Bg Mo Slide1
Bg Mo Slide1Bg Mo Slide1
Bg Mo Slide1
Ā 

Recently uploaded

SD-05_XĆ¢y dį»±ng website bĆ”n vĆ”y Lolita Alice - PhĆ¹ng Thį»‹ ThĆŗy Hiį»n PH 2 7 8 6 ...
SD-05_XĆ¢y dį»±ng website bĆ”n vĆ”y Lolita Alice - PhĆ¹ng Thį»‹ ThĆŗy Hiį»n PH 2 7 8 6 ...SD-05_XĆ¢y dį»±ng website bĆ”n vĆ”y Lolita Alice - PhĆ¹ng Thį»‹ ThĆŗy Hiį»n PH 2 7 8 6 ...
SD-05_XĆ¢y dį»±ng website bĆ”n vĆ”y Lolita Alice - PhĆ¹ng Thį»‹ ThĆŗy Hiį»n PH 2 7 8 6 ...
ChuThNgnFEFPLHN
Ā 
TƀI LIį»†U Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI Kį»ø NĂNG VIįŗ¾T ĐOįŗ N VĂN NGHį»Š LUįŗ¬N Xƃ Hį»˜I 200 C...
TƀI LIį»†U Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI Kį»ø NĂNG VIįŗ¾T ĐOįŗ N VĂN NGHį»Š LUįŗ¬N Xƃ Hį»˜I 200 C...TƀI LIį»†U Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI Kį»ø NĂNG VIįŗ¾T ĐOįŗ N VĂN NGHį»Š LUįŗ¬N Xƃ Hį»˜I 200 C...
TƀI LIį»†U Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI Kį»ø NĂNG VIįŗ¾T ĐOįŗ N VĂN NGHį»Š LUįŗ¬N Xƃ Hį»˜I 200 C...
Nguyen Thanh Tu Collection
Ā 
xemsomenh.com-VĆ²ng ThĆ”i Tuįŗæ vĆ  Ɲ NghÄ©a CĆ”c Sao Tįŗ”i Cung Mį»‡nh.pdf
xemsomenh.com-VĆ²ng ThĆ”i Tuįŗæ vĆ  Ɲ NghÄ©a CĆ”c Sao Tįŗ”i Cung Mį»‡nh.pdfxemsomenh.com-VĆ²ng ThĆ”i Tuįŗæ vĆ  Ɲ NghÄ©a CĆ”c Sao Tįŗ”i Cung Mį»‡nh.pdf
xemsomenh.com-VĆ²ng ThĆ”i Tuįŗæ vĆ  Ɲ NghÄ©a CĆ”c Sao Tįŗ”i Cung Mį»‡nh.pdf
Xem Sį»‘ Mį»‡nh
Ā 
SLIDE - Tu van, huong dan cong tac tuyen sinh-2024 (đįŗ§y đį»§ chi tiįŗæt).pdf
SLIDE - Tu van, huong dan cong tac tuyen sinh-2024 (đįŗ§y đį»§ chi tiįŗæt).pdfSLIDE - Tu van, huong dan cong tac tuyen sinh-2024 (đįŗ§y đį»§ chi tiįŗæt).pdf
SLIDE - Tu van, huong dan cong tac tuyen sinh-2024 (đįŗ§y đį»§ chi tiįŗæt).pdf
hoangtuansinh1
Ā 

Recently uploaded (20)

SD-05_XĆ¢y dį»±ng website bĆ”n vĆ”y Lolita Alice - PhĆ¹ng Thį»‹ ThĆŗy Hiį»n PH 2 7 8 6 ...
SD-05_XĆ¢y dį»±ng website bĆ”n vĆ”y Lolita Alice - PhĆ¹ng Thį»‹ ThĆŗy Hiį»n PH 2 7 8 6 ...SD-05_XĆ¢y dį»±ng website bĆ”n vĆ”y Lolita Alice - PhĆ¹ng Thį»‹ ThĆŗy Hiį»n PH 2 7 8 6 ...
SD-05_XĆ¢y dį»±ng website bĆ”n vĆ”y Lolita Alice - PhĆ¹ng Thį»‹ ThĆŗy Hiį»n PH 2 7 8 6 ...
Ā 
PHUĢ›OĢ›NG THUĢ›ĢC VAĢ£Ģ‚N TAĢ‰I ĐĘÆį»œNG Sįŗ®T TRONG Vįŗ¬N Tįŗ¢I
PHUĢ›OĢ›NG THUĢ›ĢC VAĢ£Ģ‚N TAĢ‰I ĐĘÆį»œNG Sįŗ®T TRONG Vįŗ¬N Tįŗ¢IPHUĢ›OĢ›NG THUĢ›ĢC VAĢ£Ģ‚N TAĢ‰I ĐĘÆį»œNG Sįŗ®T TRONG Vįŗ¬N Tįŗ¢I
PHUĢ›OĢ›NG THUĢ›ĢC VAĢ£Ģ‚N TAĢ‰I ĐĘÆį»œNG Sįŗ®T TRONG Vįŗ¬N Tįŗ¢I
Ā 
GNHH vaĢ€ KBHQ - giao nhįŗ­n hĆ ng hoĆ” vĆ  khai bĆ”o hįŗ£i quan
GNHH vaĢ€ KBHQ - giao nhįŗ­n hĆ ng hoĆ” vĆ  khai bĆ”o hįŗ£i quanGNHH vaĢ€ KBHQ - giao nhįŗ­n hĆ ng hoĆ” vĆ  khai bĆ”o hįŗ£i quan
GNHH vaĢ€ KBHQ - giao nhįŗ­n hĆ ng hoĆ” vĆ  khai bĆ”o hįŗ£i quan
Ā 
TƀI LIį»†U Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI Kį»ø NĂNG VIįŗ¾T ĐOįŗ N VĂN NGHį»Š LUįŗ¬N Xƃ Hį»˜I 200 C...
TƀI LIį»†U Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI Kį»ø NĂNG VIįŗ¾T ĐOįŗ N VĂN NGHį»Š LUįŗ¬N Xƃ Hį»˜I 200 C...TƀI LIį»†U Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI Kį»ø NĂNG VIįŗ¾T ĐOįŗ N VĂN NGHį»Š LUįŗ¬N Xƃ Hį»˜I 200 C...
TƀI LIį»†U Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI Kį»ø NĂNG VIįŗ¾T ĐOįŗ N VĂN NGHį»Š LUįŗ¬N Xƃ Hį»˜I 200 C...
Ā 
Đį» cĘ°Ę”ng mĆ“n giįŗ£i phįŗ«u......................
Đį» cĘ°Ę”ng mĆ“n giįŗ£i phįŗ«u......................Đį» cĘ°Ę”ng mĆ“n giįŗ£i phįŗ«u......................
Đį» cĘ°Ę”ng mĆ“n giįŗ£i phįŗ«u......................
Ā 
Access: Chuong III Thiet ke truy van Query.ppt
Access: Chuong III Thiet ke truy van Query.pptAccess: Chuong III Thiet ke truy van Query.ppt
Access: Chuong III Thiet ke truy van Query.ppt
Ā 
kinh tįŗæ chĆ­nh trį»‹ mĆ”c lĆŖnin chĘ°Ę”ng hai vĆ  hĆ ng hoĆ” vĆ  sxxhh
kinh tįŗæ chĆ­nh trį»‹ mĆ”c lĆŖnin chĘ°Ę”ng hai vĆ  hĆ ng hoĆ” vĆ  sxxhhkinh tįŗæ chĆ­nh trį»‹ mĆ”c lĆŖnin chĘ°Ę”ng hai vĆ  hĆ ng hoĆ” vĆ  sxxhh
kinh tįŗæ chĆ­nh trį»‹ mĆ”c lĆŖnin chĘ°Ę”ng hai vĆ  hĆ ng hoĆ” vĆ  sxxhh
Ā 
xemsomenh.com-VĆ²ng ThĆ”i Tuįŗæ vĆ  Ɲ NghÄ©a CĆ”c Sao Tįŗ”i Cung Mį»‡nh.pdf
xemsomenh.com-VĆ²ng ThĆ”i Tuįŗæ vĆ  Ɲ NghÄ©a CĆ”c Sao Tįŗ”i Cung Mį»‡nh.pdfxemsomenh.com-VĆ²ng ThĆ”i Tuįŗæ vĆ  Ɲ NghÄ©a CĆ”c Sao Tįŗ”i Cung Mį»‡nh.pdf
xemsomenh.com-VĆ²ng ThĆ”i Tuįŗæ vĆ  Ɲ NghÄ©a CĆ”c Sao Tįŗ”i Cung Mį»‡nh.pdf
Ā 
Bį»˜ LUYį»†N NGHE VƀO 10 TIįŗ¾NG ANH Dįŗ NG TRįŗ®C NGHIį»†M 4 CƂU TRįŗ¢ Lį»œI - CƓ FILE NGHE.pdf
Bį»˜ LUYį»†N NGHE VƀO 10 TIįŗ¾NG ANH Dįŗ NG TRįŗ®C NGHIį»†M 4 CƂU TRįŗ¢ Lį»œI - CƓ FILE NGHE.pdfBį»˜ LUYį»†N NGHE VƀO 10 TIįŗ¾NG ANH Dįŗ NG TRįŗ®C NGHIį»†M 4 CƂU TRįŗ¢ Lį»œI - CƓ FILE NGHE.pdf
Bį»˜ LUYį»†N NGHE VƀO 10 TIįŗ¾NG ANH Dįŗ NG TRįŗ®C NGHIį»†M 4 CƂU TRįŗ¢ Lį»œI - CƓ FILE NGHE.pdf
Ā 
bĆ i thi bįŗ£o vį»‡ nį»n tįŗ£ng tĘ° tĘ°į»Ÿng cį»§a Đįŗ£ng.docx
bĆ i thi bįŗ£o vį»‡ nį»n tįŗ£ng tĘ° tĘ°į»Ÿng cį»§a Đįŗ£ng.docxbĆ i thi bįŗ£o vį»‡ nį»n tįŗ£ng tĘ° tĘ°į»Ÿng cį»§a Đįŗ£ng.docx
bĆ i thi bįŗ£o vį»‡ nį»n tįŗ£ng tĘ° tĘ°į»Ÿng cį»§a Đįŗ£ng.docx
Ā 
sĆ”ch sinh hį»c đįŗ”i cĘ°Ę”ng - Textbook.pdf
sĆ”ch sinh hį»c đįŗ”i cĘ°Ę”ng   -   Textbook.pdfsĆ”ch sinh hį»c đįŗ”i cĘ°Ę”ng   -   Textbook.pdf
sĆ”ch sinh hį»c đįŗ”i cĘ°Ę”ng - Textbook.pdf
Ā 
GIƁO ƁN Dįŗ Y THƊM (Kįŗ¾ HOįŗ CH BƀI Dįŗ Y BUį»”I 2) - TIįŗ¾NG ANH 7 GLOBAL SUCCESS (2 Cį»˜...
GIƁO ƁN Dįŗ Y THƊM (Kįŗ¾ HOįŗ CH BƀI Dįŗ Y BUį»”I 2) - TIįŗ¾NG ANH 7 GLOBAL SUCCESS (2 Cį»˜...GIƁO ƁN Dįŗ Y THƊM (Kįŗ¾ HOįŗ CH BƀI Dįŗ Y BUį»”I 2) - TIįŗ¾NG ANH 7 GLOBAL SUCCESS (2 Cį»˜...
GIƁO ƁN Dįŗ Y THƊM (Kįŗ¾ HOįŗ CH BƀI Dįŗ Y BUį»”I 2) - TIįŗ¾NG ANH 7 GLOBAL SUCCESS (2 Cį»˜...
Ā 
GIƁO TRƌNH KHį»I NGUį»’N CƁC LOįŗ I - ĐIį»†N Lįŗ NH BƁCH KHOA Hƀ Nį»˜I
GIƁO TRƌNH  KHį»I NGUį»’N CƁC LOįŗ I - ĐIį»†N Lįŗ NH BƁCH KHOA Hƀ Nį»˜IGIƁO TRƌNH  KHį»I NGUį»’N CƁC LOįŗ I - ĐIį»†N Lįŗ NH BƁCH KHOA Hƀ Nį»˜I
GIƁO TRƌNH KHį»I NGUį»’N CƁC LOįŗ I - ĐIį»†N Lįŗ NH BƁCH KHOA Hƀ Nį»˜I
Ā 
3-Bįŗ¢NG Mƃ Lį»–I Cį»¦A CƁC HƃNG ĐIį»€U HƒA .pdf - ĐIį»†N Lįŗ NH BƁCH KHOA Hƀ Nį»˜I
3-Bįŗ¢NG Mƃ Lį»–I Cį»¦A CƁC HƃNG ĐIį»€U HƒA .pdf - ĐIį»†N Lįŗ NH BƁCH KHOA Hƀ Nį»˜I3-Bįŗ¢NG Mƃ Lį»–I Cį»¦A CƁC HƃNG ĐIį»€U HƒA .pdf - ĐIį»†N Lįŗ NH BƁCH KHOA Hƀ Nį»˜I
3-Bįŗ¢NG Mƃ Lį»–I Cį»¦A CƁC HƃNG ĐIį»€U HƒA .pdf - ĐIį»†N Lįŗ NH BƁCH KHOA Hƀ Nį»˜I
Ā 
Đį»€ CHƍNH THį»ØC Kį»² THI TUYį»‚N SINH VƀO Lį»šP 10 THPT CƁC Tį»ˆNH THƀNH NĂM Hį»ŒC 2020 ā€“...
Đį»€ CHƍNH THį»ØC Kį»² THI TUYį»‚N SINH VƀO Lį»šP 10 THPT CƁC Tį»ˆNH THƀNH NĂM Hį»ŒC 2020 ā€“...Đį»€ CHƍNH THį»ØC Kį»² THI TUYį»‚N SINH VƀO Lį»šP 10 THPT CƁC Tį»ˆNH THƀNH NĂM Hį»ŒC 2020 ā€“...
Đį»€ CHƍNH THį»ØC Kį»² THI TUYį»‚N SINH VƀO Lį»šP 10 THPT CƁC Tį»ˆNH THƀNH NĂM Hį»ŒC 2020 ā€“...
Ā 
TƀI LIį»†U Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI LƝ LUįŗ¬N VĂN Hį»ŒC NĂM Hį»ŒC 2023-2024 - MƔN NGį»® ...
TƀI LIį»†U Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI LƝ LUįŗ¬N VĂN Hį»ŒC NĂM Hį»ŒC 2023-2024 - MƔN NGį»® ...TƀI LIį»†U Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI LƝ LUįŗ¬N VĂN Hį»ŒC NĂM Hį»ŒC 2023-2024 - MƔN NGį»® ...
TƀI LIį»†U Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI LƝ LUįŗ¬N VĂN Hį»ŒC NĂM Hį»ŒC 2023-2024 - MƔN NGį»® ...
Ā 
SƁNG KIįŗ¾N ƁP Dį»¤NG CLT (COMMUNICATIVE LANGUAGE TEACHING) VƀO QUƁ TRƌNH Dįŗ Y - H...
SƁNG KIįŗ¾N ƁP Dį»¤NG CLT (COMMUNICATIVE LANGUAGE TEACHING) VƀO QUƁ TRƌNH Dįŗ Y - H...SƁNG KIįŗ¾N ƁP Dį»¤NG CLT (COMMUNICATIVE LANGUAGE TEACHING) VƀO QUƁ TRƌNH Dįŗ Y - H...
SƁNG KIįŗ¾N ƁP Dį»¤NG CLT (COMMUNICATIVE LANGUAGE TEACHING) VƀO QUƁ TRƌNH Dįŗ Y - H...
Ā 
Campbell _2011_ - Sinh hį»c - Tįŗæ bĆ o - Ref.pdf
Campbell _2011_ - Sinh hį»c - Tįŗæ bĆ o - Ref.pdfCampbell _2011_ - Sinh hį»c - Tįŗæ bĆ o - Ref.pdf
Campbell _2011_ - Sinh hį»c - Tįŗæ bĆ o - Ref.pdf
Ā 
SLIDE - Tu van, huong dan cong tac tuyen sinh-2024 (đįŗ§y đį»§ chi tiįŗæt).pdf
SLIDE - Tu van, huong dan cong tac tuyen sinh-2024 (đįŗ§y đį»§ chi tiįŗæt).pdfSLIDE - Tu van, huong dan cong tac tuyen sinh-2024 (đįŗ§y đį»§ chi tiįŗæt).pdf
SLIDE - Tu van, huong dan cong tac tuyen sinh-2024 (đįŗ§y đį»§ chi tiįŗæt).pdf
Ā 
TrįŗÆc nghiį»‡m CHĘÆĘ NG 5 mĆ“n Chį»§ nghÄ©a xĆ£ hį»™i
TrįŗÆc nghiį»‡m CHĘÆĘ NG 5 mĆ“n Chį»§ nghÄ©a xĆ£ hį»™iTrįŗÆc nghiį»‡m CHĘÆĘ NG 5 mĆ“n Chį»§ nghÄ©a xĆ£ hį»™i
TrįŗÆc nghiį»‡m CHĘÆĘ NG 5 mĆ“n Chį»§ nghÄ©a xĆ£ hį»™i
Ā 

Giao Trinh Hop Ngu

  • 1. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 1 ChƶƓng 1 : CƔ BAƛN VEƀ HƔƏP NGƖƕ Trong chƶƓng naĆøy seƵ giĆ“Ć¹i thieƤu nhƶƵng nguyeĆ¢n taĆ©c chung ƱeĆ„ taĆÆo ra , dĆ²ch vaĆø chaĆÆy moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ treĆ¢n maĆ¹y tĆ­nh . CaĆ”u truĆ¹c ngƶƵ phaĆ¹p cuĆ»a leƤnh hĆ“ĆÆp ngƶƵ trong giaĆ¹o trƬnh naĆøy ƱƶƓĆÆc trƬnh baĆøy theo Macro Assembler ( MASM) dƶĆÆa treĆ¢n CPU 8086 . 1.1 CuĆ¹ phaĆ¹p leƤnh hĆ“ĆÆp ngƶƵ MoƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ bao goĆ m moƤt loaĆÆt caĆ¹c meƤnh ƱeĆ  ( statement) ƱƶƓĆÆc vieĆ”t lieĆ¢n tieĆ”p nhau , moĆ£i meƤnh ƱeĆ  ƱƶƓĆÆc vieĆ”t treĆ¢n 1 doĆøng . MoƤt meƤnh ƱeĆ  coĆ¹ theĆ„ laĆø : ā€¢ moƤt leƤnh ( instruction) : ƱƶƓĆÆc trƬnh bieĆ¢n dĆ²ch ( Assembler =ASM) chuyeĆ„n thaĆønh maƵ maĆ¹y. ā€¢ moƤt chƦ daĆ£n cuĆ»a Assembler ( Assembler directive) : ASM khoĆ¢ng chuyeĆ„n thaĆønh maƵ maĆ¹y CaĆ¹c meƤnh ƱeĆ  cuĆ»a ASM goĆ m 4 trƶƓĆøng : Name Operation Operand(s) Comment caĆ¹c trƶƓĆøng caĆ¹ch nhau Ć­t nhaĆ”t laĆø moƤt kyĆ¹ tƶĆÆ troĆ”ng hoaĆ«c moƤt kyĆ¹ tƶĆÆ TAB vĆ­ duĆÆ leƤnh ƱeĆ  sau : START : MOV CX,5 ; khƓƦ taĆÆo thanh ghi CX Sau ƱaĆ¢y laĆø moƤt chƦ daĆ£n cuĆ»a ASM : MAIN PROC ; taĆÆo moƤt thuĆ» tuĆÆc coĆ¹ teĆ¢n laĆø MAIN 1.1.1 TrƶƓĆøng TeĆ¢n ( Name Field) TrƶƓĆøng teĆ¢n ƱƶƓĆÆc duĆøng cho nhaƵn leƤnh , teĆ¢n thuĆ» tuĆÆc vaĆø teĆ¢n bieĆ”n . ASM seƵ chuyeĆ„n teĆ¢n thaĆønh Ć±Ć²a chƦ boƤ nhĆ“Ć¹ . TeĆ¢n coĆ¹ theĆ„ daĆøi tƶĆø 1 ƱeĆ”n 31 kyĆ¹ tƶĆÆ . Trong teĆ¢n chĆ¶Ć¹a caĆ¹c kyĆ¹ tƶĆÆ tƶĆø a-z , caĆ¹c soĆ” vaĆø caĆ¹c kyĆ¹ tƶĆÆ Ć±aĆ«c bieƤt sau : ? ,@ , _ , $ vaĆø daĆ”u . KhoĆ¢ng ƱƶƓĆÆc pheĆ¹p coĆ¹ kyĆ¹ tƶĆÆ troĆ”ng trong phaĆ n teĆ¢n . NeĆ”u trong teĆ¢n coĆ¹ kyĆ¹ tƶĆÆ . thƬ noĆ¹ phaĆ»i laĆø kyĆ¹ tƶĆÆ Ć±aĆ u tieĆ¢n . TeĆ¢n khoĆ¢ng ƱƶƓĆÆc baĆ©t ƱaĆ u baĆØng moƤt soĆ” . ASM khoĆ¢ng phaĆ¢n bieƤt giƶƵa kyĆ¹ tƶĆÆ vieĆ”t thƶƓĆøng vaĆø vieĆ”t hoa . Sau ƱaĆ¢y laĆø caĆ¹c vĆ­ duĆÆ veĆ  teĆ¢n hĆ“ĆÆp leƤ vaĆø khoĆ¢ng hĆ“ĆÆp leƤ trong ASM . TeĆ¢n hoƤp leƤ TeĆ¢n khoĆ¢ng hĆ“ĆÆp leƤ COUNTER1 TWO WORDS @CHARACTER 2ABC SUM_OF_DIGITS A45.28 DONE? YOU&ME .TEST ADD-REPEAT
  • 2. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 2 1.1.2 TrƶƓĆøng toaĆ¹n tƶƻ ( operation field) ƑoĆ”i vĆ“Ć¹i 1 leƤnh trƶƓĆøng toaĆ¹n tƶƻ chƶaĆ¹ kyĆ¹ hieƤu ( sumbol) cuĆ»a maƵ pheĆ¹p toaĆ¹n ( operation code = OPCODE) .ASM seƵ chuyeĆ„n kyĆ¹ hieƤu maƵ pheĆ¹p toaĆ¹n thaĆønh maƵ maĆ¹y . ThoĆ¢ng thƶƓĆøng kyĆ¹ hieƤu maƵ pheĆ¹p toaĆ¹n moĆ¢ taĆ» chĆ¶Ć¹c naĆŖng cuĆ»a pheĆ¹p toaĆ¹n , vĆ­ duĆÆ ADD , SUB , INC , DEC , INT ... ƑoĆ”i vĆ“Ć¹i chƦ daĆ£n cuĆ»a ASM , trƶƓĆøng toaĆ¹n tƶƻ chƶaĆ¹ moƤt opcode giaĆ» (pseudo operation code = pseudo-op) . ASM khoĆ¢ng chuyeĆ„n pseudo-op thaĆønh maƵ maĆ¹y maĆø hĆ¶Ć“Ć¹ng daĆ£n ASM thƶĆÆc hieƤn moƤt vieƤc gƬ ƱoĆ¹ vĆ­ duĆÆ taĆÆo ra moƤt thuĆ» tuĆÆc , Ć±Ć²nh nghĆ³a caĆ¹c bieĆ”n ... 1.1.3 TrƶƓĆøng caĆ¹c toaĆ¹n haĆÆng ( operand(s) field) Trong moƤt leƤnh trƶƓĆøng toaĆ¹n haĆÆng chƦ ra caĆ¹c soĆ” lieƤu tham gia trong leƤnh ƱoĆ¹. MoƤt leƤnh coĆ¹ theĆ„ khoĆ¢ng coĆ¹ toaĆ¹n haĆÆng , coĆ¹ 1 hoaĆ«c 2 toaĆ¹n haĆÆng . VĆ­ duĆÆ : NOP ; khoĆ¢ng coĆ¹ toaĆ¹n haĆÆng INC AX ; 1 toaĆ¹n haĆÆng ADD WORD1,2 ; 2 toaĆ¹n haĆÆng coƤng 2 vĆ“Ć¹i noƤi dung cuĆ»a tƶĆø nhĆ“Ć¹ WORD1 Trong caĆ¹c leƤnh 2 toaĆ¹n haĆÆng toaĆ¹n haĆÆng ƱaĆ u laĆø toaĆ¹n haĆÆng Ʊƭch ( destination operand) . ToaĆ¹n haĆÆng Ʊƭch thƶƓĆøng laĆøthanh ghi hoaĆ«c vĆ² trĆ­ nhĆ“Ć¹ duĆøng ƱeĆ„ lƶu trƶƵ keĆ”t quaĆ» . ToaĆ¹n haĆÆng thĆ¶Ć¹ hai laĆø toaĆ¹n haĆÆng nguoĆ n . ToaĆ¹n haĆÆng nguoĆ n thƶƓĆøng khoĆ¢ng bĆ² thay ƱoĆ„i sau khi thƶĆÆc hieƤn leƤnh . ƑoĆ”i vĆ“Ć¹i moƤt chƦ daĆ£n cuĆ»a ASM , trƶƓĆøng toaĆ¹n haĆÆng chĆ¶Ć¹a moƤt hoaĆ«c nhieĆ u thoĆ¢ng tin maĆø ASM duĆøng ƱeĆ„ thƶĆÆc thi chƦ daĆ£n . 1.1.4 TrƶƓĆøng chuĆ¹ thĆ­ch ( comment field) TrƶƓĆøng chuĆ¹ thĆ­ch laĆø moƤt tuyĆø choĆÆn cuĆ»a meƤnh ƱeĆ  trong ngoĆ¢n ngƶƵ ASM . LaƤp trƬnh vieĆ¢n duĆøng trƶƓĆøng chuĆ¹ thĆ­ch ƱeĆ„ thuyeĆ”t minh veĆ  caĆ¢u leƤnh . ƑieĆ u naĆøy laĆø caĆ n thieĆ”t vƬ ngoĆ¢n ngƶƵ ASM laĆø ngoĆ¢n ngƶƵ caĆ”p thaĆ”p ( low level) vƬ vaƤy seƵ raĆ”t khoĆ¹ hieĆ„u chƶƓng trƬnh neĆ”u noĆ¹ khoĆ¢ng ƱƶƓĆÆc chuĆ¹ thĆ­ch moƤt caĆ¹ch ƱaĆ y ƱuĆ» vaĆø roĆ» raĆøng . Tuy nhieĆ¢n khoĆ¢ng neĆ¢n coĆ¹ chuĆ¹ thĆ­ch ƱoĆ”i vĆ“Ć¹i moĆÆi doĆøng cuĆ»a chƶƓng trƬnh , keĆ„ caĆ» nnhƶƵng leƤnh maĆø yĆ¹ nghĆ³a cuĆ»a noĆ¹ ƱaƵ raĆ”t roĆ» raĆøng nhƶ : NOP ; khoĆ¢ng laĆøm chi caĆ» NgƶƓĆøi ta duĆøng daĆ”u chaĆ”m phaĆ„y (;) ƱeĆ„ baĆ©t ƱaĆ u trƶƓĆøng chuĆ¹ thĆ­ch . ASM cuƵng cho pheĆ¹p duĆøng toaĆøn boƤ moƤt doĆøng cho chuĆ¹ thĆ­ch ƱeĆ„ taĆÆo moƤt khoaĆ»ng troĆ”ng ngaĆŖn caĆ¹ch caĆ¹c phaĆ n khaĆ¹c nhau cuaĆ» chƶƓng trƬnh ,vĆ­ duĆÆ : ; ; khĆ“Ć»i taĆÆo caĆ¹c thanh ghi ; MOV AX,0 MOV BX,0 1.2 CaĆ¹c kieĆ„u soĆ” lieƤu trong chƶƓng trƬnh hĆ“ĆÆp ngƶƵ
  • 3. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 3 CPU chƦ laĆøm vieƤc vĆ“Ć¹i caĆ¹c soĆ” nhĆ² phaĆ¢n . VƬ vaƤy ASM phaĆ»i chuyeĆ„n taĆ”t caĆ» caĆ¹c loaĆÆi soĆ” lieƤu thaĆønh soĆ” nhĆ² phaĆ¢n . Trong moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ cho pheĆ¹p bieĆ„u dieĆ£n soĆ” lieƤu dĆ¶Ć“Ć¹i daĆÆng nhĆ² phaĆ¢n , thaƤp phaĆ¢n hoaĆ«c thaƤp luĆÆc phaĆ¢n vaĆø thaƤm chĆ­ laĆø caĆ» kyĆ¹ tƶĆÆ nƶƻa . 1.2.1 CaĆ¹c soĆ” MoƤt soĆ” nhĆ² phaĆ¢n laĆø moƤt daƵy caĆ¹c bit 0 vaĆø 1 va 2phaĆ»i keĆ”t thuĆ¹c baĆØng h hoaĆ«c H MoƤt soĆ” thaƤp phaĆ¢n laĆø moƤt daƵy caĆ¹c chƶƵ soĆ¹ thaƤp phaĆ¢n vaĆø keĆ”t thuĆ¹c bĆ“Ć»i d hoaĆ«c D ( coĆ¹ theĆ„ khoĆ¢ng caĆ n) MoƤt soĆ” hex phaĆ»i baĆ©t ƱaĆ u bĆ“Ć»i 1 chƶƵ soĆ” thaƤp phaĆ¢n vaĆø phaĆ»i keĆ”t thuĆ¹c bĆ“Ć»i h hoaĆ«c H. Sau ƱaĆ¢y laĆø caĆ¹c bieĆ„u dieĆ£n soĆ” hĆ“ĆÆp leƤ vaĆø khoĆ¢ng hĆ“ĆÆp leƤ trong ASM : SoĆ” LoaĆÆi 10111 thaƤp phaĆ¢n 10111b nhĆ² phaĆ¢n 64223 thaƤp phaĆ¢n -2183D thaƤp phaĆ¢n 1B4DH hex 1B4D soĆ” hex khoĆ¢ng hĆ“ĆÆp leƤ FFFFH soĆ” hex khoĆ¢ng hĆ“ĆÆp leƤ 0FFFFH soĆ” hex 1.2.2 CaĆ¹c kyĆ¹ tƶĆÆ KyĆ¹ tƶĆÆ vaĆø moƤt chuoĆ£i caĆ¹c kyĆ¹ tƶĆÆ phaĆ»i ƱƶƓĆÆc ƱoĆ¹ng giƶƵa hai daĆ”u ngoaĆ«c ƱƓn hoaĆ«c hai daĆ”u ngoaĆ«c keĆ¹p . VĆ­ duĆÆ ā€˜Aā€™ vaĆø ā€œHELLOā€ . CaĆ¹c kyĆ¹ tƶĆÆ Ć±eĆ u ƱƶƓĆÆc chuyeĆ„n thaĆønh maƵ ASCII bĆ“Ć»i ASM . Do ƱoĆ¹ trong moƤt chƶƓng trƬnh ASM seƵ xem khai baĆ¹o ā€˜Aā€™ vaĆø 41h ( maƵ ASCII cuĆ»a A) laĆø gioĆ”ng nhau . 1.3 CaĆ¹c bieĆ”n ( variables) Trong ASM bieĆ”n ƱoĆ¹ng vai troĆø nhƶ trong ngoĆ¢n ngƶƵ caĆ”p cao . MoĆ£i bieĆ”n coĆ¹ moƤt loaĆÆi dƶƵ lieƤu vaĆø noĆ¹ ƱƶƓĆÆc gaĆ¹n moƤt Ć±Ć²a chƦ boƤ nhĆ“Ć¹ sau khi dĆ²ch chƶƓng trƬnh . BaĆ»ng sau ƱaĆ¢y lieƤt keĆ¢ caĆ¹c toaĆ¹n tƶƻ giaĆ» duĆøng ƱeĆ„ Ć±Ć²nh nghĆ³a caĆ¹c loaĆÆi soĆ” lieƤu . PSEUDO-OP STANDS FOR DB define byte DW define word ( doublebyte) DD define doubeword ( 2 tƶĆø lieĆ¢n tieĆ”p) DQ define quadword ( 4 tƶĆø lieĆ¢n tieĆ”p ) DT define tenbytes ( 10 bytes lieĆ¢n tieĆ”p) 1.3.1. BieĆ”n byte
  • 4. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 4 ChƦ daĆ£n cuĆ»a ASM ƱeĆ„ Ć±Ć²nh nghĆ³a bieĆ”n byte coĆ¹ daĆÆng nhƶ sau : NAME DB initial_value VĆ­ duĆÆ : ALPHA DB 4 ChƦ daĆ£n naĆøy seƵ gaĆ¹n teĆ¢n ALPHA cho moƤt byte nhĆ“Ć¹ trong boƤ nhĆ“Ć¹ maĆø giaĆ¹ trĆ² ban ƱaĆ u cuĆ»a noĆ¹ laĆø 4 . NeĆ”u giaĆ¹ trĆ² cuĆ»a byte laĆø khoĆ¢ng xaĆ¹c Ć±Ć²nh thƬ ƱaĆ«t daĆ”u chaĆ”m hoĆ»i ( ?) vaĆøo giaĆ¹ trĆ² ban ƱaĆ u . VĆ­ duĆÆ : BYT DB ? ƑoĆ”i vĆ“Ć¹i bieĆ”n byte vuĆøng giaĆ¹ trĆ² khaĆ» dĆ³ maĆø noĆ¹ lƶu trƶƵ ƱƶƓĆÆc laĆø -128 ƱeĆ”n 127 ƱoĆ”i vĆ“Ć¹i soĆ” coĆ¹ daĆ”u vaĆø 0 ƱeĆ”n 255 ƱoĆ”i vĆ“Ć¹i soĆ” khoĆ¢ng daĆ”u . 1.3.2 BieĆ”n tƶĆø ChƦ daĆ£n cuĆ»a ASM ƱeĆ„ Ć±Ć²nh nghĆ³a moƤt bieĆ”n tƶĆø nhƶ sau : NAME DW initial_value VĆ­ duĆÆ : WRD DW -2 CuƵng coĆ¹ theĆ„ duĆøng daĆ”u ? ƱeĆ„ thay theĆ” cho bieĆ”n tƶĆø coĆ¹ giaĆ¹ trĆ² khoĆ¢ng xaĆ¹c Ć±Ć²nh . VuĆøng giaĆ¹ trĆ² cuĆ»a bieĆ”n tƶĆø laĆø -32768 ƱeĆ”n 32767 ƱoĆ”i vĆ“Ć¹i soĆ” coĆ¹ daĆ”u vaĆø 0 ƱeĆ”n 56535 ƱoĆ”i vĆ“Ć¹i soĆ” khoĆ¢ng daĆ”u . 1.3.3 MaĆ»ng ( arrays) Trong ASM moƤt maĆ»ng laĆø moƤt loaĆÆt caĆ¹c byte nhĆ“Ć¹ hoaĆ«c tƶĆø nhĆ“Ć¹ lieĆ¢n tieĆ”p nhau . VĆ­ duĆÆ Ć±eĆ„ Ć±Ć²nh nghĆ³a moƤt maĆ»ng 3 byte goĆÆi laĆø B_ARRAY maĆø giaĆ¹ trĆ² ban ƱaĆ u cuĆ»a noĆ¹ laĆø 10h,20h vaĆø 30h chuĆ¹ng ta coĆ¹ theĆ„ vieĆ”t : B_ARRAY DB 10h,20h,30h B_ARRAY laĆø teĆ¢n ƱƶƓĆÆc gaĆ¹n cho byte ƱaĆ u tieĆ¢n B_ARRAY+1 laĆø teĆ¢n cuĆ»a byte thĆ¶Ć¹ hai B_ARRAY+2 laĆø teĆ¢n cuĆ»a byte thĆ¶Ć¹ ba NeĆ”u ASM gaĆ¹n Ć±Ć²a chƦ offset laĆø 0200h cho maĆ»ng B_ARRAY thƬ noƤi dung boƤ nhĆ“Ć¹ seƵ nhƶ sau : SYMBOL ADDRESS CONTENTS B_ARRAY 200h 10h B_ARRAY+1 201h 20h B_ARRAY+2 202h 30h ChƦ daĆ£n sau ƱaĆ¢y seƵ Ć±Ć²nh nghĆ³a moƤt maĆ»ng 4 phaĆ n tƶƻ coĆ¹ teĆ¢n laĆø W_ARRAY: W_ARRAY DW 1000,40,29887,329
  • 5. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 5 GiaĆ» sƶƻ maĆ»ng baĆ©t ƱaĆ u taĆÆi 0300h thƬ boƤ nhĆ“Ć¹ seƵ nhƶ sau: SYMBOL ADDRESS CONTENTS W_ARRAY 300h 1000d W_ARRAY+2 302h 40d W_ARRAY+4 304h 29887d W_ARRAY+6 306h 329d Byte thaĆ”p vaĆø byte cao cuĆ»a moƤt tƶĆø ƑoĆ¢i khi chuĆ¹ng ta caĆ n truy xuaĆ”t tĆ“Ć¹i byte thaĆ”p vaĆø byte cao cuĆ»a moƤt bieĆ”n tƶĆø . GiaĆ» sƶƻ chuĆ¹ng ta Ć±Ć²nh nghĆ³a : WORD1 DW 1234h Byte thaĆ”p cuĆ»a WORD1 chĆ¶Ć¹a 34h , coĆøn byte cao cuĆ»a WORD1 chĆ¶Ć¹a 12h KyĆ¹ hieƤu Ć±Ć²a chƦ cuĆ»a byte thaĆ”p laĆø WORD1 coĆøn kyĆ¹ hieƤu Ć±Ć²a chƦ cuĆ»a byte cao laĆø WORD1+1 . ChuoĆ£i caĆ¹c kyĆ¹ tƶĆÆ ( character strings) MoƤt maĆ»ng caĆ¹c maƵ ASCII coĆ¹ theĆ„ ƱƶƓĆÆc Ć±Ć²nh nghĆ³a baĆØng moƤt chuoĆ£i caĆ¹c kyĆ¹ tƶĆÆ VĆ­ duĆÆ : LETTERS DW 41h,42h,43h tƶƓng ƱƶƓng vĆ“Ć¹i LETTERS DW ā€˜ABC ā€™ BeĆ¢n trong moƤt chuoĆ£i , ASM seƵ phaĆ¢n bieƤt chƶƵ hoa vaĆø chƶƵ thƶƓĆøng . VƬ vaƤy chuoĆ£i ā€˜abcā€™ seƵ ƱƶƓĆÆc chuyeĆ„n thaĆønh 3 bytes : 61h ,62h vaĆø 63h. Trong ASM cuƵng coĆ¹ theĆ„ toĆ„ hĆ“ĆÆp caĆ¹c kyĆ¹ tƶĆÆ vaĆø caĆ¹c soĆ” trong moƤt Ć±Ć²nh nghĆ³a . VĆ­ duĆÆ : MSG DB ā€˜HELLOā€™, 0AH, 0DH, ā€˜$ā€™ tƶƓng ƱƶƓng vĆ“Ć¹i MSG DB 48H,45H,4CH,4Ch,4FH,0AH,0DH,24H 1.4 CaĆ¹c haĆØng ( constants) Trong moƤt chƶƓng trƬnh caĆ¹c haĆØng coĆ¹ theĆ„ ƱƶƓĆÆc ƱaĆ«t teĆ¢n nhĆ“Ćø chƦ daĆ£n EQU (equates) . CuĆ¹ phaĆ¹p cuĆ»a EQU laĆø : NAME EQU constant vĆ­ duĆÆ : LF EQU 0AH sau khi coĆ¹ khai baĆ¹o treĆ¢n thƬ LF ƱƶƓĆÆc duĆøng thay cho 0Ah trong chƶƓng trƬnh . VƬ vaƤy ASM seƵ chuyeĆ£n caĆ¹c leƤnh : MOV DL,0Ah vaĆø MOV DL,LF thaĆønh cuĆøng moƤt maƵ maĆ¹y .
  • 6. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 6 CuƵng coĆ¹ theĆ„ duĆøng EQU ƱeĆ„ Ć±Ć²nh nghĆ³a moƤt chuoĆ£i , vĆ­ duĆÆ: PROMPT EQU ā€˜TYPE YOUR NAME ā€™ Sau khi coĆ¹ khai baĆ¹o naĆøy , thay cho MSG DB ā€˜TYPE YOUR NAME ā€™ chuĆ¹ng ta coĆ¹ theĆ„ vieĆ”t MSG DB PROMPT 1.5 CaĆ¹c leƤnh cĆ“ baĆ»n CPU 8086 coĆ¹ haĆøng traĆŖm leƤnh , trong chƶƓng naĆøy ,chuĆ¹ng ta seƵ xem xeĆ¹t 7 leƤnh ƱƓn giaĆ»n cuĆ»a 8086 maĆø chuĆ¹ng thƶƓĆøng ƱƶƓĆÆc duĆøng vĆ“Ć¹i caĆ¹c thao taĆ¹c di chuyeĆ„n soĆ” lieƤu vaĆø thƶĆÆc hieƤn caĆ¹c pheĆ¹p toaĆ¹n soĆ” hoĆÆc . Trong phaĆ n sau ƱaĆ¢y , WORD1 vaĆø WORD2 laĆø caĆ¹c bieĆ”n tƶĆø , BYTE1 vaĆø BYTE2 laĆø caĆ¹c bieĆ”n byte . 1.5.1 LeƤnh MOV vaĆø XCHG LeƤnh MOV duĆøng ƱeĆ„ chuyeĆ„n soĆ” lieƤu giƶƵa caĆ¹c thanh ghi , giƶƵa 1 thanh ghi vaĆø moƤt vĆ² trĆ­ nhĆ“Ć¹ hoaĆ«c ƱeĆ„ di chuyeĆ„n trƶĆÆc tieĆ”p moƤt soĆ” ƱeĆ”n moƤt thanh ghi hoaĆ«c moƤt vĆ² trĆ­ nhĆ“Ć¹ . CuĆ¹ phaĆ¹p cuĆ»a leƤnh MOV laĆø : MOV Destination , Source Sau ƱaĆ¢y laĆø vaĆøi vĆ­ duĆÆ : MOV AX,WORD1 ; laĆ”y noƤi dung cuĆ»a tƶĆø nhĆ“Ć¹ WORD1 Ʊƶa vaĆøo thanh ghi AX MOV AX,BX ; AX laĆ”y noƤi dung cuĆ»a BX , BX khoĆ¢ng thay ƱoĆ„i MOV AH,ā€™Aā€™ ; AX laĆ”y giaĆ¹ trĆ² 41h BaĆ»ng sau cho thaĆ”y caĆ¹c trƶƓĆøng hĆ“ĆÆp cho pheĆ¹p hoaĆ«c caĆ”m cuĆ»a leƤnh MOV Destination operand source operand General Reg Segment Reg Memory Location Constant General Reg Y Y Y NO Segment Reg Y NO Y NO MemoryLocation Y Y NO NO Constant Y NO Y NO LeƤnh XCHG ( Exchange) duĆøng ƱeĆ„ trao ƱoĆ„i noƤi dung cuĆ»a 2 thanh ghi hoaĆ«c cuĆ»a moƤt thanh ghi vaĆø moƤt vĆ² trĆ­ nhĆ“Ć¹ . VĆ­ duĆÆ : XCHG AH,BL XCHG AX,WORD1 ; trao ƱoĆ„i noƤi dung cuĆ»a thanh ghi AX vaĆø tƶĆø nhĆ“Ć¹ WORD1. CuƵng nhƶ leƤnh MOV coĆ¹ moƤt soĆ” haĆÆn cheĆ” ƱoĆ”i vĆ“Ć¹i leƤnh XCHG nhƶ baĆ»ng sau :
  • 7. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 7 Destination operand Source operand General Memory Locatin Register General Memory Y Y Memory Location Y No 1.5.2 LeƤnh ADD, SUB, INC , DEC LeƤnh ADD vaĆø SUB ƱƶƓĆÆc duĆøng ƱeĆ„ coƤng vaĆø trƶĆø noƤi dung cuĆ»a 2 thanh ghi , cuĆ»a moƤt thanh ghi vaĆø moƤt vĆ² trĆ­ nhĆ“Ć¹ , hoaĆ«c coƤng ( trƶĆø) moƤt soĆ” vĆ“Ć¹i (khoĆ»i) moƤt thanh ghi hoaĆ«c moƤt vĆ² trĆ­ nhĆ“Ć¹ . CuĆ¹ phaĆ¹p laĆø : ADD Destination , Source SUB Destination , Source VĆ­ duĆÆ : ADD WORD1, AX ADD BL , 5 SUB AX,DX ; AX=AX-DX VƬ lyĆ¹ do kyƵ thuaƤt , leƤnh ADD vaĆø SUB cuƵng bĆ² moƤt soĆ” haĆÆn cheĆ” nhƶ baĆ»ng sau: Destination operand Source operand General Reg Memory Loacation Gen Memory Y Y Memory Location Y NO Constant Y Y VieƤc coƤng hoaĆ«c trƶĆø trƶĆÆc tieĆ”p giƶƵa 2 vĆ² trĆ­ nhĆ“Ć¹ laĆø khoĆ¢ng ƱƶƓĆÆc pheĆ¹p . ƑeĆ„ giaĆ»i quyeĆ”t vaĆ”n ƱeĆ  naĆøy ngƶƓĆøi ta phaĆ»i di chuyeĆ„n byte ( tƶĆø ) nhĆ“Ć¹ ƱeĆ”n moƤt thanh ghi sau ƱoĆ¹ mĆ“Ć¹i coƤng hoaĆ«c trƶĆø thanh ghi naĆøy vĆ“Ć¹i moƤt byte ( tƶĆø ) nhĆ“Ć¹ khaĆ¹c . VĆ­ duĆÆ: MOV AL, BYTE2 ADD BYTE1, AL LeƤnh INC ( incremrent) ƱeĆ„ coƤng theĆ¢m 1 vaĆøo noƤi dung cuĆ»a moƤt thanh ghi hoaĆ«c moƤt vĆ² trĆ­ nhĆ“Ć¹ . LeƤnh DEC ( decrement) ƱeĆ„ giaĆ»m bĆ“Ć¹t 1 khoĆ»i moƤt thanh ghi hoaĆ«c 1 vĆ² trĆ­ nhĆ“Ć¹ . CuĆ¹ phaĆ¹p cuĆ»a chuĆ¹ng laĆø : INC Destination DEC Destination VĆ­ duĆÆ : INC WORD1 INC AX DEC BL
  • 8. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 8 1.5.3 LeƤnh NEG ( negative) LeƤnh NEG ƱeĆ„ ƱoĆ„i daĆ”u ( laĆ”y buĆø 2 ) cuĆ»a moƤt thanh ghi hoaĆ«c moƤt vĆ² trĆ­ nhĆ“Ć¹ . CuĆ¹ phaĆ¹p : NEG destination VĆ­ duĆÆ : NEG AX ; GiaĆ» sƶƻ AX=0002h sau khi thƶĆÆc hieƤn leƤnh NEG AX thƬ AX=FFFEh LƖU Yƙ : 2 toaĆ¹n haĆÆng trong caĆ¹c leƤnh treĆ¢n ƱaĆ¢y phaĆ»i cuĆøng loaĆÆi ( cuĆøng laĆø byte hoaĆ«c tƶĆø ) 1.6 ChuyeĆ„n ngoĆ¢n ngƶƵ caĆ”p cao thaĆønh ngoĆ¢n ngƶƵ ASM GiaĆ» sƶƻ A vaĆø B laĆø 2 bieĆ”n tƶĆø . ChuĆ¹ng ta seƵ chuyeĆ„n caĆ¹c meƤnh ƱeĆ  sau trong ngoĆ¢n ngƶƵ caĆ”p cao ra ngoĆ¢n ngƶƵ ASM . 1.6.1 MeƤnh ƱeĆ  B=A MOV AX,A ; Ʊƶa A vaĆøo AX MOV B,AX ; Ʊƶa AX vaĆøo B 1.6.2 MeƤnh ƱeĆ  A=5-A MOV AX,5 ; Ʊƶa 5 vaĆøo AX SUB AX,A ; AX=5-A MOV A,AX ; A=5-A caĆ¹ch khaĆ¹c : NEG A ;A=-A ADD A,5 ;A=5-A 1.6.3 MeƤnh ƱeĆ  A=B-2*A MOV AX,B ;Ax=B SUB AX,A ;AX=B-A SUB AX,A ;AX=B-2*A MOV A,AX ;A=B-2*A 1.7 CaĆ”u truĆ¹c cuĆ»a moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ MoƤt chƶƓng trƬnh ngoĆ¢n ngƶƵ maĆ¹y bao goĆ m maƵ ( code) , soĆ” lieƤu ( data) vaĆø ngaĆŖn xeĆ”p (stack ) . MoĆ£i moƤt phaĆ n chieĆ”m moƤt ƱoaĆÆn boƤ nhĆ“Ć¹ . MoĆ£i moƤt ƱoaĆÆn chƶƓng trƬnh laĆø ƱƶƓĆÆc chuyeĆ„n thaĆønh moƤt ƱoaĆÆn boƤ nhĆ“Ć¹ bĆ“Ć»i ASM . 1.7.1 CaĆ¹c kieĆ„u boƤ nhĆ“Ć¹ ( memory models) ƑoƤ lĆ“Ć¹n cuĆ»a maƵ vaĆø soĆ” lieƤu trong moƤt chƶƓng trƬnh ƱƶƓĆÆc quy Ć±Ć²nh bĆ“Ć»i chƦ daĆ£n MODEL nhaĆØm xaĆ¹c Ć±Ć²nh kieĆ„u boƤ nhĆ“Ć¹ duĆøng vĆ“Ć¹i chƶƓng trƬnh . CuĆ¹ phaĆ¹p cuĆ»a chƦ daĆ£n MODEL nhƶ sau : .MODEL memory_model BaĆ»ng sau cho thaĆ”y caĆ¹c kieĆ„u boƤ nhĆ“Ć¹ :
  • 9. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 9 MODEL DESCRITION SMALL code vaĆø data naĆØm trong 1 ƱoaĆÆn MEDIUM code nhieĆ u hĆ“n 1 ƱoaĆÆn , data trong 1 ƱoaĆÆn COMPACT data nhieĆ u hĆ“n 1 ƱoĆÆan , code trong 1 ƱoaĆÆn LARGE code vaĆø dayta lĆ“Ć¹n hĆ“n 1 ƱoaĆÆn , array khoĆ¢ng quĆ¹a 64KB HUGE code ,data lĆ“Ć¹n hĆ“Ć¹n 1 ƱoaĆÆn , array lĆ“Ć¹n hĆ“n 64KB 1.7.2 ƑoaĆÆn soĆ” lieƤu ƑoaĆÆn soĆ” lieƤu cuĆ»a chƶƓng trƬnh chƶaĆ¹ caĆ¹c khai baĆ¹o bieĆ”n , khai baĆ¹o haĆØng ... ƑeĆ„ baĆ©t ƱaĆ u ƱoaĆÆn soĆ” lieƤu chuĆ¹ng ta duĆøng chƦ daĆ£n DATA vĆ“Ć¹i cuĆ¹ phaĆ¹p nhƶ sau : .DATA ;khai baĆ¹o teĆ¢n caĆ¹c bieĆ”n , haĆØng vaĆø maƵng vĆ­ duĆÆ : .DATA WORD1 DW 2 WORD2 DW 5 MSG DB ā€˜THIS IS A MESSAGE ā€™ MASK EQU 10010010B 1.7.3 ƑoaĆÆn ngaĆŖn xeĆ”p MuĆÆc Ʊƭch cuĆ»a vieƤc khai baĆ¹o ƱoaĆÆn ngaĆŖn xeĆ”p laĆø daĆønh moƤt vuĆøng nhĆ“Ć¹ ( vuĆøng satck) ƱeĆ„ lƶu trƶƵ cho stack . CuĆ¹ phaĆ¹p cuĆ»a leƤnh nhƶ sau : .STACK size neĆ”u khoĆ¢ng khai baĆ¹o size thƬ 1KB ƱƶƓĆÆc daĆønh cho vuĆøng stack . .STACK 100h ; daĆønh 256 bytes cho vuĆøng stack 1.7.4 ƑoĆÆan maƵ ƑoaĆÆn maƵ chƶaĆ¹ caĆ¹c leƤnh cuĆ»a chƶƓng trƬnh . BaĆ©t ƱaĆ u ƱoaĆÆn maƵ baĆØng chƦ daĆ£n CODE nhƶ sau : .CODE BeĆ¢n trong ƱoaĆÆn maƵ caĆ¹c leƤnh thƶƓĆøng ƱƶƓĆÆc toĆ„ chĆ¶Ć¹c thaĆønh thuĆ» tuĆÆc (procedure) maĆø caĆ”u truĆ¹c cuĆ»a moƤt thuĆ» tuĆÆc nhƶ sau : name PROC ; body of the procedure name ENDP Sau ƱaĆ¢y laĆø caĆ¢uĆ¹ truĆ¹c cuĆ»a moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ maĆø phaĆ n CODE laĆø thuĆ» tuĆÆc coĆ¹ teĆ¢n laĆø MAIN
  • 10. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 10 .MODEL SMALL .STACK 100h .DATA ; Ć±Ć²nh nghĆ³a soĆ” lieƤu taĆÆi ƱaĆ¢y .CODE MAIN PROC ;thaĆ¢n cuĆ»a thuĆ» tuĆÆc MAIN MAIN ENDP ; caĆ¹c thuĆ» tuĆÆc khaĆ¹c neĆ”u coĆ¹ END MAIN 1.8 CaĆ¹c leƤnh vaĆøo ra CPU thoĆ¢ng tin vĆ“Ć¹i caĆ¹c ngoaĆÆi vi thoĆ¢ng qua caĆ¹c coĆ„ng IO . LeƤnh IN vaĆø OUT cuĆ»a CPU cho pheĆ¹p truy xuaĆ”t ƱeĆ”n caĆ¹c coĆ„ng naĆøy . Tuy nhieĆ¢n haĆ u heĆ”t caĆ¹c Ć¶Ć¹ng duĆÆng khoĆ¢ng duĆøng leƤnh IN vaĆø OUT vƬ 2 lyĆ¹ do: ā€¢ caĆ¹c Ć±Ć²a chƦ coĆ„ng thay ƱoĆ„i tuyĆø theo loaĆÆi maĆ¹y tĆ­nh ā€¢ coĆ¹ theĆ„ laƤp trƬnh cho caĆ¹c IO deĆ£ daĆøng hĆ“n nhĆ“Ćø caĆ¹c chƶƓng trƬnh con ( routine) ƱƶƓĆÆc cung caĆ”p bĆ“Ć»i caĆ¹c haƵng cheĆ” taĆÆo maĆ¹y tĆ­nh CoĆ¹ 2 loaĆÆi chƶƓng trƬnh phuĆÆc vuĆÆ IO laĆø : caĆ¹c routine cuĆ»a BIOS ( Basic Input Output System) vaĆø caĆ¹c routine cuĆ»a DOS . LeƤnh INT ( interrupt) ƑeĆ„ goĆÆi caĆ¹c chƶƓng trƬnh con cuĆ»a BIOS vaĆø DOS coĆ¹ theĆ„ duĆøng leƤnh INT vĆ“Ć¹i cuĆ¹ phaĆ¹p nhƶ sau : INT interrupt_number Ć“Ć» ƱaĆ¢y interrupt_number laĆø moƤt soĆ” maĆø noĆ¹ chƦ Ć±Ć²nh moƤt routine . VĆ­ duĆÆ INT 16h goĆÆi routine thƶĆÆc hieƤn vieƤc nhaƤp soĆ” lieƤu tƶĆø Keyboard . 1.8.1 LeƤnh INT 21h INT 21h ƱƶƓĆÆc duĆøng ƱeĆ„ goĆÆi moƤt soĆ” lĆ“Ć¹n caĆ¹c caĆ¹c haĆøm ( function) cuĆ»a DOS . TuyĆø theo giaĆ¹ trĆ² maĆø chuĆ¹ng ta ƱaĆ«t vaĆøo thanh ghi AH , INT 21h seƵ goĆÆi chaĆÆy moƤt routine tƶƓng Ć¶Ć¹ng . Trong phaĆ n naĆøy chuĆ¹ng ta seƵ quan taĆ¢m ƱeĆ”n 2 haĆøm sau ƱaĆ¢y :
  • 11. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 11 FUNCTION NUMBER ROUTINE 1 Single key input 2 Single character output FUNTION 1 : Single key input Input : AH=1 Output:AL= ASCII code if character key is pressed AL=0 if non character key is pressed ƑeĆ„ goĆÆi routine naĆøy thƶĆÆc hieƤn caĆ¹c leƤnh sau : MOV AH,1 ; input key function INT 21h ; ASCII code in AL and display character on the screen FUNTION 2 : Display a character or execute a control function Input : AH=2 DL=ASCII code of the the display character or control character Output:AL= ASCII code of the the display character or control character CaĆ¹c leƤnh sau seƵ in leĆ¢n maĆøn hƬnh daĆ”u ? MOV AH,2 MOV DL,ā€™?ā€™ ; character is ā€˜?ā€™ INT 21H ; display character HaĆøm 2 cuƵng coĆ¹ theĆ„ duĆøng ƱeĆ„ thƶĆÆc hieƤn chĆ¶Ć¹c naĆŖng ƱieĆ u khieĆ„n .NeĆ”u DL chƶaĆ¹ kyĆ¹ tƶĆÆ Ć±ieĆ u khieĆ„n thƬ khi goĆÆi INT 21h , kyĆ¹ tƶĆÆ Ć±ieĆ u khieĆ„n seƵ ƱƶƓĆÆc thƶĆÆc hieƤn . CaĆ¹c kyĆ¹ tƶĆÆ Ć±ieĆ u khieĆ„n thƶƓĆøng duĆøng laĆø : ASCII code (Hex) SYMBOL FUNCTION 7 BEL beep 8 BS backspace 9 HT tab A LF line feed D CR carriage return 1.9 ChƶƓng trƬnh ƱaĆ u tieĆ¢n ChuĆ¹ng ta seƵ vieĆ”t moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ nhaĆØm ƱoĆÆc moƤt kyĆ¹ tƶĆÆ tƶĆø baĆøn phĆ­m vaĆø in noĆ¹ treĆ¢n ƱaĆ u doĆøng mĆ“Ć¹i . TITLE PGM1: ECHO PROGRAM
  • 12. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 12 .MODEL SMALL .STACK 100H .CODE MAIN PROC ; display daĆ”u nhaĆ©c MOV AH,2 MOV DL,ā€™?ā€™ INT 21H ; nhaƤp 1 kyĆ¹ tƶĆÆ MOV AH,1 ; haĆøm ƱoĆÆc kyĆ¹ tƶĆÆ INT 21H ; kyĆ¹ tƶĆÆ Ć±Ć¶Ć“ĆÆc Ʊƶa vaĆøo AL MOV BL,AL ; caĆ”t kyĆ¹ tƶĆÆ trong BL ; nhaĆ»y ƱeĆ”n doĆøng mĆ“Ć¹i MOV AH,2 ; haĆøm xuaĆ”t 1 kyĆ¹ tƶĆÆ MOV DL,0DH ; kyĆ¹ tƶĆÆ carriage return INT 21H , thƶĆÆc hieƤn carriage return MOV DL,0AH ; kyĆ¹ tƶĆÆ line feed INT 21H ; thƶĆÆc hieƤn line feed ; xuaĆ”t kyĆ¹ tƶĆÆ MOV DL,BL ; Ʊƶa kyĆ¹ tƶĆÆ vaĆøo DL INT 21H ; xuaĆ”t kyĆ¹ tƶĆÆ ; trĆ“Ć» veĆ  DOS MOV AH,4CH ; haĆøm thoaĆ¹t veĆ  DOS INT 21H ; exit to DOS MAIN ENDP END MAIN 1.10 TaĆÆo ra vaĆø chaĆÆy moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ CoĆ¹ 4 bĆ¶Ć“Ć¹c ƱeĆ„ taĆÆo ra vaĆø chaĆÆy moƤt chƶƓng trƬnh hĆ“ĆÆp ngƶƵ laĆø : ā€¢ DuĆøng moƤt trƬnh soaĆÆn thaĆ»o vaĆŖn baĆ»n ƱeĆ„ taĆÆo ra taƤp tin chƶƓng trƬnh nguoĆ n ( source program file ) . ā€¢ DuĆøng moƤt trƬnh bieĆ¢n dĆ²ch (Assembler ) ƱeĆ„ taĆÆo ra taƤp tin ƱoĆ”i tƶƓĆÆng (object file) ngoĆ¢n ngƶƵ maĆ¹y ā€¢ DuĆøng trƬnh LINK ƱeĆ„ lieĆ¢n keĆ”t moƤt hoaĆ«c nhieĆ u taƤp tin ƱoĆ”i tƶƓĆÆng roĆ i taĆÆo ra file thƶĆÆc thi ƱƶƓĆÆc . ā€¢ Cho thƶĆÆc hieƤn taƤp tin EXE hoaĆ«c COM . BĆ¶Ć“Ć¹c 1 : TaĆÆo ra chƶƓng trƬnh nguoĆ n
  • 13. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 13 DuĆøng moƤt trƬnh soaĆÆn thaĆ»o vaĆŖn baĆ»n (NC chaĆŗng haĆÆn) ƱeĆ„ taĆÆo ra chƶƓng trƬnh nguoĆ n .VĆ­ duĆÆ laĆ”t teĆ¢n laĆø PGM1.ASM. PhaĆ n mĆ“Ć» roƤng ASM laĆø phaĆ n mĆ“Ć» roƤng quy Ć¶Ć“Ć¹c ƱeĆ„ Assembler nhaƤn ra chƶƓng trƬnh nguoĆ n . BĆ¶Ć“Ć¹c 2 :BieĆ¢n dĆ²ch chƶƓng trƬnh ChuĆ¹ng ta seƵ duĆøng MASM ( Microsoft Macro Assembler ) ƱeĆ„ chuyeĆ„n taƤp tin nguoĆ n PGM1.ASM thaĆønh taƤp tin ƱoĆ”i tƶƓĆÆng ngoĆ¢n ngƶƵ maĆ¹y goĆ² laĆø PGM1.OBJ baĆØng leƤnh sau : MASM PGM1; Sau khi in thoĆ¢ng tin veĆ  baĆ»n quyeĆ n MASM seƵ kieĆ„m tra file nguoĆ n ƱeĆ„ tƬm loĆ£i cuĆ¹ phaĆ¹p . NeĆ”u coĆ¹ loĆ£i thƬ MASM seƵ inra soĆ” doĆøng bĆ² loĆ£i vaĆø moƤt moƤ taĆ» ngaĆ©n veĆ  loĆ£i ƱoĆ¹ . NeĆ”u khoĆ¢ng coĆ¹ loĆ£i thƬ MASM seƵ chuyeĆ„n PGM1.ASM thaĆønh taƤo tin ƱoĆ”i tƶƓĆÆng ngoĆ¢n ngƶƵ maĆ¹y goĆÆi laĆø PGM1.OBJ . DaĆ”u chaĆ”m phaĆ„y sau leƤnh MASM PGM1 coĆ¹ nghĆ³a laĆø chuĆ¹ng ta khoĆ¢ng muoĆ”n taĆÆo ra moƤt taƤp tin ƱoĆ”i tƶƓĆÆ ng coĆ¹ teĆ¢n khaĆ¹c vĆ“Ć¹i PGM1 . NeĆ”u khoĆ¢ng coĆ¹ daĆ”u chaĆ”m phaĆ„y sau leƤnh thƬ MASM seƵ yeĆ¢u caĆ u chuĆ¹ng ta goƵ vaĆøo teĆ¢n cuĆ»a moƤt soĆ” taƤp tin maĆø noĆ¹ coĆ¹ theĆ„ taĆÆo ra nhƶ hƬnh dĆ¶Ć“Ć¹i ƱaĆ¢y : Object file name [ PGM1.OBJ]: Source listing [NUL.LIST] : PGM1 Cross-reference [NUL.CRF] : PGM1 TeĆ¢n maĆ«c nhieĆ¢n laĆø NUL coĆ¹ nghĆ³a laĆø khoĆ¢ng taĆÆo ra file tƶƓng Ć¶Ć¹ng trƶĆø khi laƤp trƬnh vieĆ¢n goƵ vaĆøo teĆ¢n taƤp tin . TaƤp tin danh saĆ¹ch nguoĆ n ( source listing file) : laĆø moƤt taƤp tin Text coĆ¹ ƱaĆ¹nh soĆ” doĆøng , trong ƱoĆ¹ maƵ hĆ“ĆÆp ngƶƵ vaĆø maƵ nguoĆ n naĆØm caĆÆnh nhau . TaƤp tin naĆøy thƶƓĆøng duĆøng ƱeĆ„ gƓƵ roĆ”i chƶƓng trƬnh nguoĆ n vƬ MASM thoĆ¢ng baĆ¹o loĆ£i theo soĆ” doĆøng . TaƤp tin tham chieĆ”u cheĆ¹o ( Cross -Reference File ) : laĆø 1 taƤp tin chĆ¶Ć¹a danh saĆ¹ch caĆ¹c teĆ¢n maĆø chuĆ¹ng xuaĆ”t hieƤn trong chƶƓng trƬnh keĆøm theo soĆ” doĆøng maĆø teĆ¢n aĆ”y xuaĆ”t hieƤn . TaƤp tin naĆøy ƱƶoĆÆc duĆøng ƱeĆ„ tƬm caĆ¹c bieĆ”n vaĆø nhaƵn trong moƤt chƶƓng trƬnh lĆ“Ć¹n . BĆ¶Ć“Ć¹c 3 : LieĆ¢n keĆ”t chƶƓng trƬnh TaƤp tin ƱoĆ”i tƶƓĆÆng taĆÆo ra Ć“Ć» bĆ¶Ć“Ć¹c 2 laĆø moƤt taƤp tin ngoĆ¢n ngƶƵ maĆ¹y nhƶng noĆ¹ khoĆ¢ng chaĆÆy ƱƶƓĆÆc vƬ chƶa coĆ¹ daĆÆng thĆ­ch hĆ“ĆÆp cuĆ»a 1 file chaĆÆy . HĆ“n nƶƵa noĆ¹ chƶa bieĆ”t chƶƓng trƬnh ƱƶƓĆÆc naĆÆp vaĆøo vĆ² trĆ­ naĆøo treĆ¢n boƤ nhĆ“Ć¹ ƱeĆ„ chaĆÆy . MoƤt soĆ” Ć±Ć²a chƦ dĆ¶Ć“Ć¹i daĆÆng maƵ maĆ¹y coĆ¹ theĆ„ bĆ² thieĆ”u . TrƬnh LINK seƵ lieĆ¢n keĆ”t moƤt hoaĆ«c nhieĆ u file ƱoĆ¹i tƶƓĆÆng thaĆønh moƤt file chaĆÆy duy nhaĆ”t ( *.EXE ) .TaƤp tin naĆøy coĆ¹ theĆ„ ƱƶƓĆÆc naĆÆp vaĆøo boƤ nhĆ“Ć¹ vaĆø thi haĆønh .
  • 14. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 14 ƑeĆ„ lieĆ¢n keĆ”t chƶƓng trƬnh ta goƵ : LINK PGM1; NeĆ”u khoĆ¢ng coĆ¹ daĆ”u chaĆ”m phaĆ„y ASM seƵ yeĆ¢u caĆ¢uĆø chuĆ¹ng ta goƵ vaĆøo teĆ¢n taƤp tin thƶĆÆc thi . BĆ¶Ć“Ć¹c 4 : ChaĆÆy chƶƓng trƬnh TƶĆø daĆ”u nhaĆ©c leƤnh coĆ¹ theĆ„ chaĆÆy chƶƓng trƬnh baĆØng caĆ¹ch goƵ teĆ¢n noĆ¹ roĆ i nhaĆ”n ENTER . 1.11 XuaĆ”t moƤt chuoĆ£i kyĆ¹ tƶĆÆ Trong chƶƓng trƬnh PGM1 treĆ¢n ƱaĆ¢y chuĆ¹ng ta ƱaƵ duĆøng INT 21H haĆøm 2 vaĆø 4 ƱeĆ„ ƱoĆÆc vaĆø xuaĆ”t moƤt kyĆ¹ tƶĆÆ . HaĆøm 9 ngaĆ©t 21H coĆ¹ theĆ„ duĆøng ƱeĆ„ xuaĆ”t moƤt chuoĆ£i kyĆ¹ tƶĆÆ . INT 21H , Function 9 : Display a string Input : DX=offset address of string The string must end with a ā€˜$ā€™ character KyĆ¹ tƶĆÆ $ Ć“Ć» cuoĆ”i chuoĆ£i seƵ khoĆ¢ng ƱƶƓĆÆc in leĆ¢n maĆøn hƬnh . NeĆ”u chuoĆ£i coĆ¹ chĆ¶Ć¹a kyĆ¹ tƶĆÆ Ć±ieĆ u khieĆ„n thƬ chĆ¶Ć¹c naĆŖng ƱieĆ u khieĆ„n tƶƓng Ć¶Ć¹ng seƵ ƱƶƓĆÆc thƶĆÆc hieƤn . ChuĆ¹ng ta seƵ vieĆ”t 1 chƶƓng trƬnh in leĆ¢n maĆøn hƬnh chuoĆ£i ā€œHELLO!ā€ . ThoĆ¢ng ƱieƤp HELLO ƱƶƓĆÆc Ć±Ć²nh nghĆ³a nhƶ sau trong ƱoaĆÆn soĆ” lieƤu : MSG DB ā€˜HELLO!$ā€™ LeƤnh LEA ( Load Effective Address ) LEA destnation , source NgaĆ©t 21h , haĆøm soĆ” 9 seƵ xuaĆ”t moƤt chuoĆ£i kyĆ¹ tƶĆÆ ra maĆøn hƬnh vĆ“Ć¹i ƱieĆ u kieƤn Ć±Ć²a chƦ hieƤu duĆÆng cuĆ»a bieĆ”n chuoĆ£i phaĆ»i Ć“Ć» treĆ¢n DX . CoĆ¹ theĆ„ thƶĆÆc hieƤn ƱieĆ u naĆøy bĆ“Ć»i leƤnh : LEA DX,MSG ; Ʊƶa Ć±Ć²a chƦ offset cuĆ»a bieĆ”n MSG vaĆøo DX Program Segment Prefix ( PSP ) : PhaĆ n ƱaĆ u cuĆ»a ƱoaĆÆn chƶƓng trƬnh Khi moƤt chƶƓng trƬnh ƱƶƓĆÆc naĆÆp vaĆøo boƤ nhĆ“Ć¹ maĆ¹y tĆ­nh , DOS daĆønh ra 256 byte cho caĆ¹i goĆÆi laĆø PSP . PSP chƶaĆ¹ moƤt soĆ” thoĆ¢ng tin veĆ  chƶƓng trƬnh Ʊang ƱƶƓĆÆc naĆÆp trong boƤ nhĆ“Ć¹ . ƑeĆ„ cho caĆ¹c chƶƓng trƬnh coĆ¹ theĆ„ truy xuaĆ”t tĆ“Ć¹i PSP , DOS ƱaĆ«t soĆ” phaĆ¢n ƱoaĆÆn cuĆ»a noĆ¹ (PSP) trong caĆ» DS vaĆø ES trĆ¶Ć“Ć¹c khi thƶĆÆc thi chƶƓng trƬnh . KeĆ”t quĆ»a laĆø thanh ghi DS khoĆ¢ng chĆ¶Ć¹a soĆ” ƱoaĆÆn cuĆ»a ƱoaĆÆn soĆ” lieƤu cuĆ»a chƶƓng trƬnh . ƑeĆ„ khaĆ©c phuĆÆc ƱieĆ u naĆøy , moƤt chƶƓng trƬnh coĆ¹ chĆ¶Ć¹a ƱoaĆÆn soĆ” lieƤu phaĆ»i ƱƶƓĆÆc baĆ©t ƱaĆ u bĆ“Ć»i 2 leƤnh sau ƱaĆ¢y : MOV AX,@DATA
  • 15. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 15 MOV DS,AX Ɣƛ ƱaĆ¢y @DATA laĆø teĆ¢n cuĆ»a ƱoaĆÆn soĆ” lieƤu ƱƶƓĆÆc Ć±Ć²nh nghĆ³a bĆ“Ć»i DATA . Assembler seƵ chuyeĆ„n @DATA thaĆønh soĆ” ƱoaĆÆn . Sau ƱaĆ¢y laĆø chƶƓng trƬnh hoaĆøn chƦnh ƱeĆ„ xuaĆ”t chuoĆ£i kyĆ¹ tƶĆÆ HELLO! TITLE PGM2: PRINT STRING PROGRAM .MODEL SMALL .STACK 100H .DATA MSG DB ā€˜HELLO!$ā€™ .CODE MAIN PROC ; initialize DS MOV AX,@DATA MOV DS,AX ; display message LEA DX,MSG MOV AH,9 INT 21H ; return to DOS MOV AH,4CH INT 21H MAIN ENDP END MAIN 1.12 ChƶƓng trƬnh ƱoĆ„i chƶƵ thƶƓĆøng sang chƶƵ hoa ChuĆ¹ng ta seƵ vieĆ”t 1 chƶƓng trƬnh yeĆ¢u caĆ u ngƶƓĆøi duĆøng goƵ vaĆøo moƤt kyĆ¹ tƶĆÆ baĆØng chƶƵ thƶƓĆøng . ChƶƓng trƬnh seƵ ƱoĆ„i noĆ¹ sang daĆÆng chƶƵ hoa roĆ i in ra Ć“Ć» doĆøng tieĆ”p theo . TITLE PGM3: CASE COVERT PROGRAM .MODEL SMALL .STACK 100H .DATA CR EQU 0DH LF EQU 0AH MSG1 DB ā€˜ENTER A LOWER CASE LETTER:$ā€™ MSG2 DB 0DH,0AH,ā€™IN UPPER CASE IT IS :ā€™
  • 16. ƑeĆ  cƶƓng baĆøi giaĆ»ng HƔƏP NGƖƕ 16 CHAR DB ?,ā€™$ā€™ ; Ć±Ć²nh nghĆ³a bieĆ”n CHAR coĆ¹ giaĆ¹ trĆ² ban ƱaĆ u chƶa ;xaĆ¹c Ć±Ć²nh .CODE MAIN PROC ; INITIALIZE DS MOV AX,@DATA MOV DS,AX ;PRINT PROMPT USER LEA DX,MSG1 ; laĆ”y thoĆ¢ng ƱieƤp soĆ” 1 MOV AH,9 INT 21H ; xuaĆ”t noĆ¹ ra maĆøn hƬnh ;nhaƤp vaĆøo moƤt kyĆ¹ tƶĆÆ thƶƓĆøng vaĆø ƱoĆ„i noĆ¹ thaĆønh kyĆ¹ tƶĆÆ hoa MOV AH,1 ; nhaƤp vaĆøo 1 kyĆ¹ tƶĆÆ INT 21H ; caĆ”t noĆ¹ trong AL SUB AL,20H ; ƱoĆ„i thaĆønh chƶƵ hoa vaĆø caĆ”t noĆ¹ trong AL MOV CHAR, AL ; caĆ”t kyĆ¹ tƶĆÆ trong bieĆ”n CHAR ; xuaĆ”t kyĆ¹ tƶĆÆ treĆ¢n doĆøng tieĆ”p theo LEA DX, MSG2 ; laĆ”y thoĆ¢ng ƱieƤp thĆ¶Ć¹ 2 MOV AH,9 INT 21H ; xuaĆ”t chuoĆ£i kyĆ¹ tƶĆÆ thĆ¶Ć¹ hai , vƬ MSG2 khoĆ¢ng keĆ”t ;thuĆ¹c bĆ“Ć»i kyĆ¹ tƶĆÆ $ neĆ¢n noĆ¹ tieĆ”p tuĆÆc xuaĆ”t kyĆ¹ tƶĆÆ coĆ¹ trong bieĆ”n CHAR ;dos exit MOV AH,4CH INT 21H ; dos exit MAIN ENDP END MAIN
  • 17. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 17 ChƶƓng 2 : TraĆÆng thaĆ¹i cuĆ»a vi xƶƻ lyĆ¹ vaĆø caĆ¹c thanh ghi cĆ“Ćø Trong chƶƓng naĆøy chuĆ¹ng ta seƵ xem xeĆ¹t caĆ¹c thanh ghi cĆ“Ćø cuĆ»a vi xƶƻ lyĆ¹ vaĆø aĆ»nh hƶƓƻng cuĆ»a caĆ¹c leƤnh maĆ¹y ƱeĆ”n caĆ¹c thanh ghi cĆ“Ćø nhƶ theĆ” naĆøo . TraĆÆng thaĆ¹i cuĆ»a caĆ¹c thanh ghi laĆø caĆŖn cĆ¶Ć¹ ƱeĆ„ chƶƓng trƬnh coĆ¹ theĆ„ thƶĆÆc hieƤn leƤnh nhaĆ»y , reĆ» nhaĆ¹nh vaĆø laĆ«p . MoƤt phaĆ n cuĆ»a chƶƓng naĆøy seƵ giĆ“Ć¹i thieƤu chƶƓng trƬnh DEBUG cuĆ»a DOS . 2.1 CaĆ¹c thanh ghi cĆ“Ćø ( Flags register) ƑieĆ„m khaĆ¹c bieƤt quan troĆÆng cuĆ»a maĆ¹y tĆ­nh so vĆ“Ć¹i caĆ¹c thieĆ”t bĆ² ƱieƤn tƶƻ khaĆ¹c laĆø khaĆ» naĆŖng cho caĆ¹c quyeĆ”t Ć±Ć²nh . MoƤt maĆÆch ƱaĆ«c bieƤt trong CPU coĆ¹ theĆ„ laĆøm caĆ¹c quyeĆ”t Ć±Ć²nh naĆøy baĆØng caĆ¹ch caĆŖn cĆ¶Ć¹ vaĆøo traĆÆng thaĆ¹i hieƤn haĆønh cuĆ»a CPU . CoĆ¹ moƤt thanh ghi ƱaĆ«c bieƤt cho bieĆ”t traĆÆng thaĆ¹i cuĆ»a CPU ƱoĆ¹ laĆø thanh ghi cĆ“Ćø . BaĆ»ng 2.1 cho thaĆ”y thanh ghi cĆ“Ćø 16 bit cuĆ»a 8086 11 10 9 8 7 6 5 4 3 2 1 0 O D IF T S Z A P C F F F F F F F F BaĆ»ng 2.1 :Thanh ghi cĆ“Ćø cuĆ»a 8086
  • 18. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 18 MuĆÆc Ʊƭch cuĆ»a caĆ¹c thanh ghi cĆ“Ćø laĆø chƦ ra traĆÆng thaĆ¹i cuĆ»a CPU .CoĆ¹ hai loaĆÆi cĆ“Ćø laĆø cĆ“Ćø traĆÆng thaĆ¹i ( status flags) vaĆø cĆ“Ćø ƱieĆ u khieĆ„n (control flags) . CĆ“Ćø traĆÆng thaĆ¹i phaĆ»n aĆ¹nh caĆ¹c keĆ”t quĆ»a thƶĆÆc hieƤn leƤnh cuĆ»a CPU . BaĆ»ng 2.2 chƦ ra teĆ¢n vaĆø kyĆ¹ hieƤu caĆ¹c thanh ghi cĆ“Ćø trong 8086 . Bit Name Symbol 0 Carry flag CF 2 Parity flag PF 4 Auxiliary AF carry flag 6 Zero flag ZF 7 Sign flag SF 11 Overflow flag OF 8 Trap flag TF 9 Interrrupt flag IF 10 Direction flag DF BaĆ»ng 2.2 : CaĆ¹c cĆ“Ćø cuĆ»a 8086 MoĆ£i bit treĆ¢n thanh ghi cĆ“Ćø phaĆ»n aĆ¹nh 1 traĆÆng thaĆ¹i cuĆ»a CPU . CaĆ¹c cĆ“Ćø traĆÆng thaĆ¹i ( status flags)
  • 19. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 19 CaĆ¹c cĆ“Ćø traĆÆng thaĆ¹i phaĆ»n aĆ¹nh keĆ”t quaĆ» cuĆ»a caĆ¹c pheĆ¹p toaĆ¹n . VĆ­ duĆÆ sau khi thƶĆÆc hieƤn leƤnh SUB AX,AX cĆ“Ćø ZF =1 , nghĆ³a laĆø keĆ”t quĆ»a cuĆ»a pheĆ¹p trƶĆø laĆø zero . CĆ“Ćø nhĆ“Ć¹ ( Carry Flag - CF) : CF=1 neĆ”u xuaĆ”t hieƤn bit nhĆ“Ć¹ (carry) tƶĆø vĆ² trĆ­ MSB trong khi thƶĆÆc hieƤn pheĆ¹p coƤng hoaĆ«c coĆ¹ bit mƶƓĆÆn ( borrow ) taĆÆi MSB trong khi thƶĆÆc hieƤn pheĆ¹p trƶĆø . Trong caĆ¹c trƶƓĆøng hĆ“ĆÆp khaĆ¹c CF=0 . CĆ“Ćø CF cuƵng bĆ² aĆ»nh hƶƓƻng bĆ“Ć»i leƤnh dĆ²ch ( Shift) vaĆø quay ( Rotate) soĆ” lieƤu . CĆ“Ćø chaĆŗn leĆ» ( Parity Flag - PF) : PF=1 neĆ”u byte thaĆ”p cuĆ»a keĆ”t quĆ»a coĆ¹ toĆ„ng soĆ” con soĆ” 1 laĆø moƤt soĆ” chaĆŗn ( even parity). PF=0 neĆ”u byte thaĆ”p laĆø chaĆŗn leĆ» leĆ» (old parity ). VĆ­ duĆÆ neĆ”u keĆ”t quĆ»a laĆø FFFEh thƬ PF=0 CĆ“Ćø nhĆ“Ć¹ phuĆÆ ( Auxiliary Carry Flag - AF ) :AF =1 neĆ”u coĆ¹ nhĆ“Ć¹ ( mƶƓĆÆn) tƶĆø bit thĆ¶Ć¹ 3 trong pheĆ¹p coƤng ( trƶĆø) . CĆ“Ćø Zero ( Zero Flag -ZF) : ZF=1 neĆ”u keĆ”t quĆ»a laĆø soĆ” 0 . CĆ“Ćø daĆ”u ( Sign Flag - SF ) : SF=1 neĆ”u MSB cuĆ»a keĆ”t quĆ»a laĆø 1 ( keĆ”t quĆ»a laĆø soĆ” aĆ¢m ) . SF=0 neĆ”u MSB=0 CĆ“Ćø traĆøn ( Overflow Flag - OF ) : OF=1 neĆ”u xaĆ»y ra traĆøn soĆ” trong khi thƶĆÆc hieƤn caĆ¹c pheĆ¹p toaĆ¹n . Sau ƱaĆ¢y chuĆ¹ng ta seƵ phaĆ¢n tĆ­ch caĆ¹c trƶƓĆøng hĆ“ĆÆp xaĆ»y ra traĆøn trong khi thƶĆÆc hieƤn tĆ­nh toaĆ¹n . HieƤn tƶƓĆÆng traĆøn soĆ” lieĆ¢n quan ƱeĆ”n vieƤc bieĆ£u dieĆ£n soĆ” trong maĆ¹y tĆ­nh vĆ“Ć¹i moƤt soĆ” hƶƵu haĆÆn caĆ¹c bit . CaĆ¹c soĆ” thaƤp phaĆ¢n coĆ¹ daĆ”u bieĆ£u dieĆ£n bĆ“Ć»i 1 byte laĆø - 128 ƱeĆ”n +127 . NeĆ”u bieĆ£u dieĆ£n baĆØng 1 tƶĆø (16 bit) thƬ caĆ¹c soĆ” thaƤp phaĆ¢n coĆ¹ theĆ„ bieĆ£u dieĆ£n laĆø -32768 ƱeĆ”n +32767 . ƑoĆ”i vĆ“Ć¹i caĆ¹c soĆ” khoĆ¢ng daĆ”u , daĆ»i caĆ¹c soĆ” coĆ¹ theĆ„ bieĆ£u dieĆ£n trong
  • 20. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 20 moƤt tƶĆø laĆø 0 ƱeĆ”n 65535 , trong moƤt byte laĆø 0 ƱeĆ”n 255 . NeĆ”u keĆ”t quĆ»a cuĆ»a moƤt pheĆ¹p toaĆ¹n vƶƓĆÆt ra ngoaĆøi daƵi soĆ” coĆ¹ theĆ„ bieĆ£u dieĆ£n thƬ xaĆ»y ra sƶĆÆ traĆøn soĆ” . Khi coĆ¹ sƶĆÆ traĆøn soĆ” keĆ”t quĆ»a thu ƱƶƓĆÆc seƵ bĆ² sai . 2.2 TraĆøn ( overflow) CoĆ¹ 2 loaĆÆi traĆøn soĆ” : TraĆøn coĆ¹ daĆ”u ( signed overflow) vaĆø traĆøn khoĆ¢ng daĆ”u ( unsigned overflow) . Khi thƶĆÆc hieƤn pheĆ¹p coƤng soĆ” hoĆÆc chaĆŗng haĆÆn pheĆ¹p coƤng , seƵ xaĆ»y ra 4 khaĆ» naĆŖng sau ƱaĆ¢y : 1) khoĆ¢ng traĆøn 2) chƦ traĆøn daĆ”u 3) chƦ traĆøn khoĆ¢ng daĆ”u 4) traĆøn caĆ» daĆ”u vaĆø khoĆ¢ng daĆ”u VĆ­ duĆÆ cuĆ»a traĆøn khoĆ¢ng daĆ”u laĆø pheĆ¹p coƤng ADD AX,BX vĆ“Ć¹i AX=0FFFFh , BX=0001h .KeĆ”t quĆ»a dĆ¶Ć“Ć¹i daĆÆng nhĆ² phaĆ¢n laĆø : 1111 1111 1111 1111 0000 0000 0000 0001 10000 0000 0000 0000 NeĆ”u dieĆ£n giaĆ»i keĆ”t quĆ»a dĆ¶Ć“Ć¹i daĆÆng khoĆ¢ng daĆ”u thƬ keĆ”t quĆ»a laĆø ƱuĆ¹ng ( 10000h=65536) . Nhƶng keĆ”t quĆ»a ƱaƵ vƶƓĆÆt quaĆ¹ ƱoƤ lĆ“Ć¹n cuĆ»a tƶĆø nhĆ“Ć¹ . Bit 1 ( bit nhĆ“Ć¹ tƶĆø vĆ² trĆ­
  • 21. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 21 MSB ) ƱaƵ xaĆ»y ra vaĆø keĆ”t quĆ»a treĆ¢n AX =0000h laĆø sai . SƶĆÆ traĆøn nhƶ theĆ” laĆø traĆøn khoĆ¢ng daĆ”u . NeĆ”u xem raĆØng pheĆ¹p coƤng treĆ¢n ƱaĆ¢y laĆø pheĆ¹p coƤng hai soĆ” coĆ¹ daĆ”u thƬ keĆ”t quĆ»a treĆ¢n AX = 0000h laĆø ƱuĆ¹ng , vƬ FFFFh = -1 , coĆøn 0001h = +1 , do ƱoĆ¹ keĆ”t quĆ»a pheĆ¹p coƤng laĆø 0 . VaƤy trong trƶƓĆøng hĆ“ĆÆp naĆøy sƶĆÆ traĆøn daĆ”u khoĆ¢ng xaĆ»y ra . VĆ­ duĆÆ veĆ  sƶĆÆ traĆøn daĆ”u : giaĆ» sƶƻ AX = BX = 7FFFh , leƤnh ADD AX,BX seƵ cho keĆ”t quĆ»a nhƶ sau : 0111 1111 1111 1111 0111 1111 1111 1111 1111 1111 1111 1110 = FFFE h BieĆ£u dieĆ£n coĆ¹ daĆ”u vaĆø khoĆ¢ng daĆ”u cuĆ»a 7FFFh laĆø 3276710 . Nhƶ vaƤy laĆø ƱoĆ”i vĆ“Ć¹i pheĆ¹p coƤng coĆ¹ daĆ”u cuƵng nhƶ khoĆ¢ng daĆ”u thƬ keĆ”t quĆ»a vaĆ£n laĆø 32767 + 32767 = 65534 . SoĆ” naĆøy(65534) ƱaƵ vƶƓĆÆt ngoaĆøi daƵi giaĆ¹ trĆ² maĆø 1 soĆ” 16 bit coĆ¹ daĆ”u coĆ¹ theĆ„ bieĆ£u dieĆ£n . HĆ“n nƶƻa FFFEh = -2 . Do vaƤy sƶĆÆ traĆøn daĆ”u ƱaƵ xaĆ»y ra . Trong trƶƓĆøng hĆ“ĆÆp xaĆ»y ra traĆøn , CPU seƵ bieĆ„u thĆ² sƶĆÆ traĆøn nhƶ sau : ā€¢ CPU seƵ set OF =1 neĆ”u xaĆ»y ra traĆøn daĆ”u ā€¢ CPU seƵ set CF = 1 neĆ”u xaĆ»y ra traĆøn khoĆ¢ng daĆ”u Sau khi coĆ¹ traĆøn , moƤt chƶƓng trƬnh hĆ“ĆÆp lyĆ¹ seƵ ƱƶƓĆÆc thƶĆÆc hieƤn ƱeĆ„ sƶƻa sai keĆ”t quĆ»a ngay laƤp tĆ¶Ć¹c . CaĆ¹c laƤp trƬnh vieĆ¢n seƵ chƦ phaĆ»i quan taĆ¢m tĆ“Ć¹i cĆ“Ćø OF hoaĆ«c CF neĆ”u bieĆ£u
  • 22. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 22 dieĆ£n soĆ” cuĆ»a hoĆÆ laĆø coĆ¹ daĆ”u hay khoĆ¢ng daĆ”u moƤt caĆ¹ch tƶƓng Ć¶Ć¹ng . VaƤy thƬ laĆøm theĆ” naĆøo ƱeĆ„ CPU bieĆ”t ƱƶƓĆÆc coĆ¹ traĆøn ? ā€¢ TraĆøn khoĆ¢ng daĆ”u seƵ xaĆ»y ra khi coĆ¹ moƤt bit nhĆ“Ć¹ ( hoaĆ«c mƶƓĆÆn ) tƶĆø MSB ā€¢ TraĆøn daĆ”u seƵ xaĆ»y ra trong caĆ¹c trƶƓĆøng hĆ“ĆÆp sau : a) Khi coƤng hai soĆ” cuĆøng daĆ”u , sƶĆÆ traĆøn daĆ”u xaĆ»y ra khi toĆ„ng coĆ¹ daĆ”u khaĆ¹c vĆ“Ć¹i hai toaĆ¹n haĆÆng ban ƱaĆ u . Trong vĆ­ duĆÆ 2 , coƤng hai soĆ” 7FFFh +7FFFh ( hai soĆ” dƶƓng ) nhƶng keĆ”t quĆ»a laĆø FFFFh ( soĆ” aĆ¢m) b) Khi trƶĆø hai soĆ” khaĆ¹c daĆ”u ( gioĆ”ng nhƶ coƤng hai soĆ” cuĆøng daĆ”u) keĆ”t quĆ»a phaĆ»i coĆ¹ daĆ”u hĆ“ĆÆp lyĆ¹ .NeĆ”u keĆ”t quĆ»a cho daĆ”u khoĆ¢ng nhƶ mong ƱƓĆÆi thƬ coĆ¹ nghĆ³a laĆø ƱaƵ xaĆ»y ra sƶĆÆ traĆøn daĆ”u . VĆ­ duĆÆ 8000h - 0001h = 7FFFh ( soĆ” dƶƓng ) . Do ƱoĆ¹ OF=1 . VaƤy laĆøm theĆ” naĆøo ƱeĆ„ CPU chƦ ra raĆØng coĆ¹ traĆøn ? ā€¢ OF=1 neĆ”u traĆøn daĆ”u ā€¢ CF=1 neĆ”u traĆøn khoĆ¢ng daĆ”u LaĆøm theĆ” naĆøo ƱeĆ„ CPU bieĆ”t laĆø coĆ¹ traĆøn ? ā€¢ TraĆøn khoĆ¢ng daĆ”u xaĆ»y ra khi coĆ¹ soĆ” nhĆ“Ć¹ ( carry) hoaĆ«c mƶƓĆÆn ( borrow) tƶĆø MSB ā€¢ TraĆøn daĆ”u xaĆ»y ra khi coƤng hai soĆ” cuĆøng daĆ”u ( hoaĆ«c trƶĆø 2 soĆ” khaĆ¹c daĆ”u ) maĆø keĆ”t quĆ»a vĆ“Ć¹i daĆ”u khaĆ¹c vĆ“Ć¹i daĆ”u mong ƱƓĆÆi . PheĆ¹p coƤng hai soĆ” coĆ¹ daĆ”u khaĆ¹c nhau khoĆ¢ng theĆ„ xaĆ»y ra sƶĆÆ traĆøn . TreĆ¢n thƶĆÆc teĆ” CPU duĆøng phƶƓng phaĆ¹p sau : cĆ“Ćø OF=1 neĆ”u soĆ” nhĆ“Ć¹ vaĆøo vaĆø soĆ” nhĆ“Ć¹ ra tƶĆø MSB laĆø khoĆ¢ng phuĆø hĆ“ĆÆp :
  • 23. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 23 nghĆ³a laĆø coĆ¹ nhĆ“Ć¹ vaĆøo nhƶng khoĆ¢ng coĆ¹ nhĆ“Ć¹ ra hoaĆ«c coĆ¹ nhĆ“Ć¹ ra nhƶng khoĆ¢ng coĆ¹ nhĆ“Ć¹ vaĆøo . CĆ“Ćø ƱieĆ u khieĆ„n ( control flags) CoĆ¹ 3 cĆ“Ć» ƱieĆ u khieĆ„n trong CPU , ƱoĆ¹ laĆø : ā€¢ CĆ“Ćø hĆ¶Ć“Ć¹ng ( Direction Flag = DF) ā€¢ CĆ“Ćø baĆ£y ( Trap flag = TF) ā€¢ CĆ“Ćø ngaĆ©t ( Interrupt Flag = IF) CaĆ¹c cĆ“Ćø ƱieĆ u khieĆ„n ƱƶƓĆÆc duĆøng ƱeĆ„ ƱieĆ u khieĆ„n hoaĆÆt ƱoƤng cuĆ»a CPU CĆ“Ćø hĆ¶Ć“Ć¹ng (DF) ƱƶƓĆÆc duĆøng trong caĆ¹c leƤnh xƶƻ lyĆ¹ chuoĆ£i cuĆ»a CPU . MuĆÆc Ʊƭch cuĆ»a DF laĆø duĆøng ƱeĆ„ ƱieĆ u khieĆ„n hĆ¶Ć“Ć¹ng maĆø moƤt chuoĆ£i ƱƶƓĆÆc xƶƻ lyĆ¹ . Trong caĆ¹c leƤnh xƶƻ lyĆ¹ chuoĆ£i hai thanh ghi DI vaĆø SI ƱƶƓĆÆc duĆøng ƱeĆ„ Ć±Ć²a chƦ boƤ nhĆ“Ć¹ chĆ¶Ć¹a chuoĆ£i . NeĆ”u DF=0 thƬ leƤnh xƶƻ lyĆ¹ chuoĆ£i seƵ taĆŖng Ć±Ć²a chƦ boƤ nhĆ“Ć¹ sao cho chuoĆ£i ƱƶƓĆÆc xƶƻ lyĆ¹ tƶĆø traĆ¹i sang phaĆ»i NeĆ”u DF=1 thƬ Ć±Ć²a chƦ boƤ nhĆ“Ć¹ seƵ ƱƶƓĆÆc xƶƻ lyĆ¹ theo hĆ¶Ć“Ć¹ng tƶĆø phaĆ»i sang traĆ¹i . 2.3 CaĆ¹c leƤnh aĆ»nh hƶƓƻng ƱeĆ” cĆ“Ćø nhƶ theĆ” naĆøo TaĆÆi moƤt thĆ“Ćøi ƱieĆ„m , CPU thƶĆÆc hieƤn 1 leƤnh , caĆ¹c cĆ“Ćø laĆ n lƶƓĆÆt phaĆ»n aĆ¹nh keĆ”t quĆ»a thƶĆÆc hieƤn leƤnh . DĆ³ nhieĆ¢n coĆ¹ moƤt soĆ” leƤnh khoĆ¢ng laĆøm thay ƱoĆ„i moƤt cĆ“Ćø naĆøo caĆ» hoaĆ«c thay ƱoĆ„i chƦ 1 vaĆøi cĆ“Ćø hoaĆ«c laĆøm cho moƤt vaĆøi cĆ“Ćø coĆ¹ traĆÆng thaĆ¹i
  • 24. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 24 khoĆ¢ng xaĆ¹c Ć±Ć²nh . Trong phaĆ n naĆøy chuĆ¹ng ta chƦ xeĆ¹t aĆ»nh hƶƓƻng cuĆ»a caĆ¹c leƤnh ( ƱaƵ nghieĆ¢n cĆ¶Ć¹u Ć“Ć» chƶƓng trĆ¶Ć“Ć¹c ) leĆ¢n caĆ¹c cĆ“Ćø nhƶ theĆ” naĆøo . BaĆ»ng sau ƱaĆ¢y cho thaĆ”y aĆ»nh hƶƓƻng cuĆ»a caĆ¹c leƤnh ƱeĆ”n caĆ¹c cĆ“Ćø : INSTRUCTION AFFECTS FLAGS MOV/XCHG NONE ADD/SUB ALL INC/DEC ALL trƶĆø CF NEG ALL (CF=1 trƶĆø khi keĆ”t quĆ»a baĆØng 0 , OF=1 neĆ”u keĆ”t quĆ»a laĆø 8000H ) ƑeĆ„ thaĆ”y roĆ» aĆ»nh hƶƓƻng cuĆ»a caĆ¹c leƤnh leĆ¢n caĆ¹c cĆ“Ćø chuĆ¹ng ta seƵ laĆ”y vaĆøi vĆ­ duĆÆ . VĆ­ duĆÆ 1 : ADD AX,AX trong ƱoĆ¹ AX=BX=FFFFh FFFFh + FFFFh 1FFFEh KeĆ”t quĆ»a chĆ¶Ć¹a treĆ¢n AX laĆø FFFEh = 1111 1111 1111 1110
  • 25. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 25 SF=1 vƬ MSB=1 PF=0 vƬ coĆ¹ 7 ( leĆ») soĆ” 1 trong byte thaĆ”p cuĆ»a keĆ”t quĆ»a ZF=0 vƬ keĆ”t quĆ»a khaĆ¹c 0 CF=1 vƬ coĆ¹ nhĆ“Ć¹ 1 tƶĆø MSB OF=0 vƬ daĆ”u cuĆ»a keĆ”t quĆ»a gioĆ”ng nhƶ daĆ”u cuĆ»a 2 soĆ” haĆÆng ban ƱaĆ u . VĆ­ duĆÆ 2 : ADD AL,BL trong ƱoĆ¹ AL= BL= 80h 80h + 80h 100h KeĆ”t quĆ»a treĆ¢n AL = 00h SF=0 vƬ MSB=0 PF=1 vƬ taĆ”t caĆ» caĆ¹c bit ƱeĆ u baĆØng 0 ZF=1 vƬ keĆ”t quĆ»a baĆØng 0 CF=1 vƬ coĆ¹ nhĆ“Ć¹ 1 tƶĆø MSB OF=1 vƬ caĆ» 2 toaĆ¹n haĆÆng laĆø soĆ” aĆ¢m nhƶng keĆ”t quĆ»a laĆø soĆ” dƶƓng ( coĆ¹ nhĆ“Ć¹ ra tƶĆø MSB nhƶng khoĆ¢ng coĆ¹ nhĆ“Ć¹ vaĆøo ) . VĆ­ duĆÆ 3 : SUB AX,BX trong ƱoĆ¹ AX=8000h vaĆø BX= 0001h 8000h - 0001h
  • 26. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 26 7FFFFh = 0111 1111 1111 1111 SF=0 vƬ MSB=0 PF=1 vƬ coĆ¹ 8 ( chaĆŗn ) soĆ” 1 trong byte thaĆ”p cuĆ»a keĆ”t quĆ»a ZF=0 vƬ keĆ”t quĆ»a khaĆ¹c 0 CF=0 vƬ khoĆ¢ng coĆ¹ mƶƓĆÆn OF=1 vƬ trƶĆø moƤt soĆ” aĆ¢m cho 1 soĆ” dƶƓng ( tĆ¶Ć¹c laĆø coƤng 2 soĆ” aĆ¢m ) maĆø keĆ”t quĆ»a laĆø moƤt soĆ” dƶƓng . VĆ­ duĆÆ 4 : INC AL trong ƱoĆ¹ AL=FFh KeĆ”t quĆ»a treĆ¢n AL=00h = 0000 0000 SF=0 vƬ MSB=0 PF=1 ZF=1 vƬ keĆ”t quĆ»a baĆØng 0 CF khoĆ¢ng bĆ² aĆ»nh hƶƓƻng bĆ“Ć»i leƤnh INC maĆ«c duĆø coĆ¹ nhĆ“Ć¹ 1 tƶĆø MSB OF=0 vƬ hai soĆ” khaĆ¹c daĆ”u ƱƶƓĆÆc coƤng vĆ“Ć¹i nhau ( coĆ¹ soĆ” nhĆ“Ć¹ vaĆøo MSB vaĆø cuƵng coĆ¹ soĆ” nhĆ“Ć¹ ra tƶĆø MSB) VĆ­ duĆÆ 5: MOV AX,-5 KeĆ”t quaĆ» treĆ¢n BX = -5 = FFFBh KhoĆ¢ng coĆ¹ cĆ“Ćø naĆøo aĆ»nh hƶƓƻng bĆ“Ć»i leƤnh MOV
  • 27. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 27 VĆ­ duĆÆ 6: NEG AX trong ƱoĆ¹ AX=8000h 8000h =1000 0000 0000 0000 buĆø 1 =0111 1111 1111 1111 +1 1000 0000 0000 0000 = 8000h KeĆ”t quĆ»a treĆ¢n AX=8000h SF=1 vƬ MSB=1 PF=1 vƬ coĆ¹ soĆ” chaĆŗn con soĆ” 1 trong byte thaĆ”p cuĆ»a keĆ”t quĆ»a ZF=0 vƬ keĆ”t quĆ»a khaĆ¹c 0 CF=1 vƬ leƤnh NEG laĆøm cho CF=1 trƶĆø khi keĆ”t quĆ»a baĆØng 0 OF=1 vƬ daĆ”u cuĆ»a keĆ”t quĆ»a gioĆ”ng vĆ“Ć¹i daĆ”u cuĆ»a toaĆ¹n haĆÆng nguoĆ n . 2.4 ChƶƓng trƬnh DEBUG.EXE Debug laĆø moƤt chƶƓng trƬnh cuĆ»a DOS cho pheĆ¹p chaĆÆy thƶƻ caĆ¹c chƶƓng trƬnh hĆ“ĆÆp ngƶƵ . NgƶƓĆøi duĆøng coĆ¹ theĆ„ cho chaĆÆy chƶƓng trƬnh tƶĆøng leƤnh 1 tƶĆø ƱaĆ u ƱeĆ”n cuoĆ”i ,trong quaĆ¹ trƬnh ƱoĆ¹ coĆ¹ theĆ„ thaĆ”y noƤi dung caĆ¹c thanh ghi thay ƱoĆ„i nhƶ theĆ” naĆøo . Debug cho pheĆ¹p nhaƤp vaĆøo moƤt maƵ hĆ“ĆÆp ngƶƵ trƶĆÆc tieĆ”p sau ƱoĆ¹ DEBUG seƵ chuyeĆ„n thaĆønh maƵ maĆ¹y vaĆø lƶu trƶƵ trong boƤ nhĆ“Ć¹ . DEBUG cung caĆ”p khaĆ» naĆŖng xem noƤi dung cuĆ»a taĆ”t caĆ» caĆ¹c thanh ghi coĆ¹ trong CPU.
  • 28. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 28 Sau ƱaĆ¢y chuĆ¹ng ta seƵ duĆøng DEBUG ƱeĆ„ moĆ¢ taĆ» caĆ¹ch thĆ¶Ć¹c maĆø caĆ¹c leƤnh aĆ»nh hƶƓƻng ƱeĆ”n caĆ¹c cĆ“Ćø nhƶ theĆ” naĆøo . GiaĆ» sƶƻ chuĆ¹ng ta coĆ¹ chƶƓng trƬnh hĆ“ĆÆp ngƶƵ sau : TITLE PGM2_1: CHECK - FLAGS ; duĆøng DEBUG ƱeĆ„ kieĆ„m tra caĆ¹c cĆ“Ćø .MODEL SMALL .STACK 100H .CODE MOV AX,4000H ; AX=4000H ADD AX,AX ; AX=8000H SUB AX,0FFFFH ;AX=8001H NEG AX ; AX=7FFFH INC AX ; AX=8000H MOV AH,4CH ; HAƘM THOAƙT VEƀ DOS INT 21H ; EXIT TO DOS END MAIN ENDP END MAIN Sau khi dĆ²ch chƶƓng trƬnh , giaĆ» sƶƻ file chaĆÆy laĆø CHECK- FL.EXE treĆ¢n ƱƶƓĆøng daĆ£n C:ASM . ƑeĆ„ chaĆÆy debug chuĆ¹ng ta goƵ leƤnh sau : C:> DEBUG C:ASMCHECK-FL.EXE
  • 29. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 29 tƶĆø luĆ¹c naĆøy trĆ“Ć» Ʊi daĆ”u nhaĆ©c laĆøcuĆ»a debug ( daĆ”u ā€œ_ā€) , ngƶƓĆøi sƶƻ duĆÆng coĆ¹ theĆ„ Ʊƶa vaĆøo caĆ¹c leƤnh debug tƶĆø daĆ”u nhaĆ©c naĆøy . TrĆ¶Ć“Ć¹c heĆ”t coĆ¹ theĆ„ xem noƤi dung caĆ¹c thanh ghi baĆØng leƤnh R(Register) , maĆøn hƬnh seƵ coĆ¹ noƤi dung nhƶ sau : -R AX=0000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000 DS=0ED5 ES=0ED5 SS=0EE5 CS=0EE6 IP=0000 NV UP DI PL NZ NA PO NC 0EE6:0000 B80040 MOV AX,4000 ChuĆ¹ng ta thaĆ”y teĆ¢n caĆ¹c thanh ghi vaĆø noƤi dung cuĆ»a chuĆ¹ng ( dĆ¶Ć“Ć¹i daĆÆng HEX) treĆ¢n 3 doĆøng ƱaĆ u . DoĆøng thĆ¶Ć¹ 4 laĆø traĆÆng thaĆ¹i caĆ¹c thanh ghi theo caĆ¹ch bieĆ„u thĆ² cuĆ»a debug. BaĆ»ng 2-3 laĆø caĆ¹ch maĆø Debug bieĆ„u thĆ² traĆÆng thaĆ¹i cuĆ»a caĆ¹c thanh ghi cĆ“Ćø cuĆ»a CPU . Flag Set (1) Symbol Clear (0) Symbol s CF CY (carry) NC ( no carry) PF PE (even parity) PO ( odd parity) AF AC ( auxiliary NA ( no auxiliary carry) carry) ZF ZR ( zero) NZ ( non zero) SF NG ( negative) PL ( plus) OF OV ( overflow) NV ( no overflow) DF DN ( down) UP ( up) IF EI ( enable DI ( disable
  • 30. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 30 interrupts) interrupts) BaĆ»ng 2.3 : BieĆ„u thĆ² traĆÆng traĆÆng caĆ¹c cĆ“Ćø cuĆ»a DEBUG DoĆøng cuoĆ”i cuĆøng cho bieĆ”t giaĆ¹ trĆ² hieƤn haĆønh cuĆ»a PC (Ć±Ć²a chƦ cuĆ»a leƤnh seƵ ƱƶƓĆÆc thƶĆÆc hieƤn dĆ¶Ć“Ć¹i daĆÆng Ć±Ć²a chƦ logic ) maƵ maĆ¹y cuĆ»a leƤnh vaĆø noƤi dung cuĆ»a leƤnh tƶƓng Ć¶Ć¹ng . Khi chaĆÆy chƶƓng trƬnh naĆøy treĆ¢n 1 maĆ¹y tĆ­nh khaĆ¹c coĆ¹ theĆ„ seƵ thaĆ”y moƤt ƱiaĆÆ chƦ ƱoaĆÆn khaĆ¹c . ChuĆ¹ng ta seƵ duĆøng leƤnh T(Trace) ƱeĆ„ thi haĆønh tƶĆøng leƤnh cuĆ»a chƶƓng trƬnh baĆ©t ƱaĆ u tƶĆø leƤnh MOV AX,4000h -T AX=4000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000 DS=0ED5 ES=0ED5 SS=0EE5 CS=0EE6 IP=0003 NV UP DI PL NZ NA PO NC 0EE6:0003 03C0 ADD AX,AX Sau khi thƶĆÆc hieƤn leƤnh MOV AX,4000 caĆ¹c cĆ“Ćø khoĆ¢ng bĆ² thay ƱoĆ„i , chƦ coĆ¹ AX=4000h . BaĆ¢y giĆ“Ćø chuĆ¹ng ta thƶĆÆc hieƤn leƤnh ADD AX,AX -T AX=8000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000 DS=0ED5 ES=0ED5 SS=0EE5 CS=0EE6 IP=0005 OV UP DI NG NZ NA PE NC 0EE6:0005 2DFFFF SUB AX,FFFF
  • 31. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 31 KeĆ”t quĆ»a cuĆ»a pheĆ¹p coƤng laĆø 8000h , do ƱoĆ¹ SF=1(NG) , OF=1(OV) vaĆø PF=1(PE) BaĆ¢y giĆ“Ćø chuĆ¹ng ta thƶĆÆc hieƤn leƤnh SUB AX,0FFFh -T AX=8001 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000 DS=0ED5 ES=0ED5 SS=0EE5 CS=0EE6 IP=0008 NV UP DI NG NZ AC PO CY 0EE6:0008 F7D8 NEG AX AX=8000H-FFFFH=8001H CĆ“Ćø OF=0(NV) nhƶng CF=1(CY) vƬ coĆ¹ mƶƓĆÆn tƶĆø MSB CĆ“Ćø PF=0(PO) vƬ byte thaĆ”p chƦ coĆ¹ 1 con soĆ” 1. LeƤnh tieĆ”p theo seƵ laĆø leƤnh NEG AX -T AX=7FFF BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000 DS=0ED5 ES=0ED5 SS=0EE5 CS=0EE6 IP=000A NV UP DI PL NZ AC PE CY 0EE6:000A 40 INC AX AX laĆ”y buĆø 2 cuĆ»a 8001h laĆø 7FFFh . CF=1(CY) vƬ leƤnh NEG cho keĆ”t quĆ»a khaĆ¹c 0. OF=0(NV) vƬ keĆ”t quaĆ» khaĆ¹c 8000h CuoĆ”i cuĆøng chuĆ¹ng ta thƶĆÆc hieƤn leƤnh INC AX
  • 32. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 32 -T AX=8000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000 DS=0ED5 ES=0ED5 SS=0EE5 CS=0EE6 IP=000B OV UP DI NG NZ AC PE CY 0EE6:000B B44C MOV AH,4CH OF=1(OV) vƬ coƤng 2 soĆ” dƶƓng maĆø keĆ”t quaĆ» laĆø 1 soĆ” aĆ¢m CF=1(CY) vƬ leƤnh INC khoĆ¢ng aĆ»nh hƶƓƻng tĆ“Ć¹i cĆ“Ćø naĆøy . ƑeĆ„ thƶĆÆc hieƤn toaĆøn boƤ chƶƓng trƬnh chuĆ¹ng ta goƵ G(Go) -G Program terminated normally ƑeĆ„ thoaĆ¹t khoƦ debug goƵ Q(Quit) -Q C:> BaĆ»ng sau ƱaĆ¢y cho bieĆ”t moƤt soĆ” leƤnh debug thƶƓĆøng duĆøng , caĆ¹c tham soĆ” ƱeĆ„ trong ngoaĆ«c laĆø tuyĆø choĆÆn COMMAND ACTION D(start (end) LieƤt keĆ¢ noƤi dung caĆ¹c byte dĆ¶Ć“Ć¹i daĆÆng HEX (range)) D 100 LieƤt keĆ¢ 80h bytes baĆ©t ƱaĆ u tƶĆø DS:100h D CS:100 120 LieƤt keĆ¢ caĆ¹c bytes tƶĆø DS:100h ƱeĆ”n DS:120 D( DUMP) LieƤt keĆ¢ 80h bytes tƶĆø byte cuoĆ”i cuĆøng ƱaƵ
  • 33. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 33 ƱƶƓĆÆc hieĆ„n thĆ² G(=start ) (addr1 ChaĆÆy ( go) leƤnh tƶĆø vĆ² trĆ­ Start vĆ“Ć¹i caĆ¹c ƱieĆ„m addr2...addrn) dƶĆøng taĆÆi addr1,addr2,addrn G ThƶĆÆc thi leƤnh tƶĆø CS:IP ƱeĆ”n heĆ”t G=100 ThƶĆÆc thi leƤnh tƶĆø CS:100h ƱeĆ”n heĆ”t G=100 150 ThƶĆÆc thi leƤnh taĆÆi CS:100h dƶĆøng taĆÆi CS:150h Q Quit debug and return to DOS R(register) Xem/ thay ƱoĆ„i noƤi dung cuĆ»a thanh ghi R Xem noƤi dung taĆ”t caĆ» caĆ¹c thnah ghi vaĆø cĆ“Ćø R AX Xem vaĆø thay ƱoĆ„i noƤi dung cuĆ»a thanh ghi AX T(=start)(value) QueĆ¹t ā€œvalueā€ leƤnh tƶĆø vĆ² trĆ­ start T Trace leƤnh taĆÆi CS:IP T=100 Trace leƤnh taĆÆi CS:100h T=100 5 Trace 5 leƤnh baĆ©t ƱaĆ u tƶĆø CS:100h T4 Trace 4 leƤnh baĆ©t ƱaĆ u tƶĆø CS:IP U(start)(value) Unassemble vuĆøng Ć±Ć²a chƦ thaĆønh leƤnh asm U CS:100 110 Unassemble tƶĆø CS:100h ƱeĆ”n CS:110h U 200 L 20 Unassemble 20 leƤnh tƶĆø CS:200h U Unassemble 32 bytes tƶĆø bytes cuoĆ”i cuĆøng ƱƶƓĆÆc hieĆ„n thĆ² A(start) Ƒƶa vaĆøo maƵ hĆ“ĆÆp ngƶƵ cho 1 Ć±Ć²a chƦ hoaĆ«c 1
  • 34. ƑeĆ  cƶƓng baĆø i giaĆ» n g HĆ“ĆÆ p ngƶƵ 34 vuĆøng ƱiaĆÆ chƦ A A CS:100h Ƒƶa vaĆøo maƵ hĆ“ĆÆp ngƶƵ taĆÆi CS:IP Ƒƶa vaĆøo maƵ hĆ“ĆÆp ngƶƵ taĆÆi CS:100h
  • 35. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 28 ChƶƓng 3 : CAƙC LEƄNH ƑIEƀU KHIEƅN MoƤt chƶƓng trƬnh thoĆ¢ng thƶƓĆøng seƵ thƶĆÆc hieƤn laĆ n lƶƓĆÆt caĆ¹c leƤnh theo thĆ¶Ć¹ thƶĆÆ maĆø chuĆ¹ng ƱƶƓĆÆc vieĆ”t ra . Tuy nhieĆ¢n trong moƤt vaĆøi trƶƓĆøng hĆ“ĆÆp caĆ n phaĆ»i chuyeĆ„n ƱieĆ u khieĆ„n ƱeĆ”n 1 phaĆ n khaĆ¹c cuĆ»a chƶƓng trƬnh . Trong phaĆ n naĆøy chuĆ¹ng ta seƵ nghieĆ¢n cĆ¶Ć¹u caĆ¹c leƤnh nhaĆ»y vaĆø leƤnh laĆ«p coĆ¹ tĆ­nh ƱeĆ”n caĆ”u truĆ¹c cuĆ»a caĆ¹c leƤnh naĆøy trong caĆ¹c ngoĆ¢n ngƶƵ caĆ”p cao . 3.1 VĆ­ duĆÆ veĆ  leƤnh nhaĆ»y ƑeĆ„ hƬnh dung ƱƶƓĆÆc leƤnh nhaĆ»y laĆøm vieƤc nhƶ theĆ” naĆøo chuĆ¹ng ta haƵy vieĆ”t chƶƓng trƬnh in ra toaĆøn boƤ taƤp caĆ¹c kyĆ¹ tƶĆÆ IBM . TITLE PGR3-1:IBM CHARACTER DISPLAY .MODEL SMALL .STACK 100H .CODE MAIN PROC MOV AH,2 ; haĆøm xuaĆ”t kyĆ¹ tƶĆÆ MOV CX,256 ; soĆ” kyĆ¹ tƶĆÆ caĆ n xuaĆ”t MOV DL,0 ; DL giƶƵ maƵ ASCII cuĆ»a kyĆ¹ tƶĆÆ NUL ; PRINT_LOOP : INT 21H ;display character INC DL DEC CX JNZ PRINT_LOOP ;nhaĆ»y ƱeĆ”n print_loop neĆ”u CX# 0 ;DOS EXIT MOV AH,4CH INT 21H MAIN ENDP END MAIN Trong chƶƓng trƬnh chuĆ¹ng ta ƱaƵ duĆøng leƤnh ƱieĆ u khieĆ„n Jump if not zero (JNZ) ƱeĆ„ quay trĆ“Ć» laĆÆi ƱoaĆÆn chƶƓng trƬnh xuaĆ”t kyĆ¹ tƶĆÆ coĆ¹ nhaƵn Ć±Ć²a chƦ boƤ nhĆ“Ć¹ laĆøPRINT_LOOP
  • 36. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 29 3.2 NhaĆ»y coĆ¹ ƱieĆ u kieƤn LeƤnh JNZ laĆø moƤt leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn .CuĆ¹ phaĆ¹p cuĆ»a moƤt leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn laĆø : Jxxx destination-label NeĆ”u ƱieĆ u kieƤn cuĆ»a leƤnh ƱƶƓĆÆc thoĆ»a maƵn thƬ leƤnh taĆÆi Destination-label seƵ ƱƶƓĆÆc thƶĆÆc hieƤn , neĆ”u ƱieĆ u kieƤn khoĆ¢ng thoĆ»a thƬ leƤnh tieĆ”p theo leƤnh nhaĆ»y seƵ ƱƶƓĆÆc thƶĆÆc hieƤn. ƑoĆ”i vĆ“Ć¹i leƤnh JNZ thƬ ƱieĆ u kieƤn laĆø keĆ”t quĆ»a cuĆ»a leƤnh trĆ¶Ć“Ć¹c noĆ¹ phaĆ»i baĆØng 0 . PhaĆÆm vi cuĆ»a leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn . CaĆ”u truĆ¹c maƵ maĆ¹y cuĆ»a leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn yeĆ¢u caĆ u destination-label ƱeĆ”n ( precede) leƤnh nhaĆ»y phaĆ»i khoĆ¢ng quaĆ¹ 126 bytes . LaĆøm theĆ” naĆøo ƱeĆ„ CPU thƶĆÆc hieƤn moƤt leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn ? ƑeĆ„ thƶĆÆc hieƤn moƤt leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn CPU phaĆ»i theo doƵi thanh ghi cĆ“Ćø. NeĆ”u ƱieĆ u kieƤn cho leƤnh nhaĆ»y ( ƱƶƓĆÆc bieĆ„u dieĆ£n bĆ“Ć»i moƤt toĆ„ hĆ“ĆÆp traĆÆng thaĆ¹i caĆ¹c cĆ“Ćø ) laĆø ƱuĆ¹ng thƬ CPU seƵ ƱieĆ u chƦnh IP ƱeĆ”n destination-label sao cho leƤnh taĆÆi ƱiaĆÆ chƦ destination-label ƱƶƓĆÆc thƶĆÆc hieƤn .NeĆ”u ƱieĆ u kieƤn nhaĆ»y khoĆ¢ng thoĆ»a thƬ IP seƵ khoĆ¢ng thay ƱoĆ„i , nghĆ³a laĆø leƤnh tieĆ”p theo leƤnh nhaĆ»y seƵ ƱƶƓĆÆc thƶĆÆc hieƤn . Trong chƶƓng trƬnh treĆ¢n ƱaĆ¢y , CPU thƶĆÆc hieƤn leƤnh JNZ PRINT_LOOP baĆØng caĆ¹ch khaĆ¹m xeĆ¹t caĆ¹c cĆ“Ćø ZF . NeĆ”u ZF=0 ƱieĆ u khieĆ„n ƱƶƓĆÆc chuyeĆ„n tĆ“Ć¹i PRINT_LOOP. NeĆ”u ZF=1 leƤnh MOV AH,4CH seƵ ƱƶƓĆÆc thƶc hieƤn . BaĆ»ng 3-1 cho thaĆ”y caĆ¹c leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn . CaĆ¹c leƤnh nhaĆ»y ƱƶƓĆÆc chia thaĆønh 3 loaĆÆi : ā€¢ nhaĆ»y coĆ¹ daĆ”u ( duĆøng cho caĆ¹c dieĆ£n dĆ²ch coĆ¹ daĆ”u ƱoĆ”i vĆ“Ć¹i keĆ”t quaĆ») ā€¢ nhaĆ»y khoĆ¢ng daĆ”u (duĆøng cho caĆ¹c dieĆ£n dĆ²ch khoĆ¢ng daĆ”u ƱoĆ”i vĆ“Ć¹i keĆ”t quaĆ») ā€¢ nhaĆ»y moƤt cĆ“Ćø ( duĆøng cho caĆ¹c thao taĆ¹c chƦ aĆ»nh hƶƓƻng leĆ¢n 1 cĆ“Ćø ) MoƤt soĆ”Ć¹ leƤnh nhaĆ»y coĆ¹ 2 Opcode . ChuĆ¹ng ta coĆ¹ theĆ„ duĆøng moƤt trong 2 Opcode , nhƶng keĆ”t quaĆ» thƶĆÆc hieƤn leƤnh laĆø nhƶ nhau . NhaĆ»y coĆ¹ daĆ”u SYMBOL DESCRITION CONDITION FOR JUMPS JG/JNLE jump if greater than ZF=0 and SF=OF jump if not less than or equal to JGE/JNL jump if greater than or equal to SF=OF jupm if not less or equal to JL/JNGE jump if lees than jump if not greater or equal SF<>OF
  • 37. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 30 JLE/JNG jump if less than or equal ZF=1 or SF<>OF jump if not greater NhaĆ»y coĆ¹ ƱieĆ u kieƤn khoĆ¢ng daĆ”u SYMBOL DESCRITION CONDITION FOR JUMPS JA/JNBE jump if above CF=0 and ZF=0 jump if not below or equal JAE/JNB jump if above or equal CF=0 jump if not below JB/JNA jump if below Cf=1 jump if not above or equal JBE/JNA jump if below or equal CF=1 or ZF=1 jump if not above NhaĆ»y 1 cĆ“Ćø SYMBOL DESCRITION CONDITION FOR JUMPS JE/JZ jump if equal ZF=1 jump if equal to zero JNE/JNZ jump if not equal ZF=0 jump if not zero JC jump if carry CF=1 JNC jump if no carry CF=0 JO jump if overflow OF=1 JNO jump if not overflow OF=0 JS jump if sign negative SF=1 SYMBOL DESCRITION CONDITION FOR JUMPS
  • 38. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 31 JNS jump if nonnegative sign SF=0 JP/JPE jump if parity even PF=1 JNP/JPO jump if parity odd PF=0 LeƤnh CMP ( Compare) CaĆ¹c leƤnh nhaĆ»y thƶƓĆøng laĆ”y keĆ”t quĆ»a cuĆ»a leƤnh Compare nhƶ laĆø ƱieĆ u kieƤn . CuĆ¹ phaĆ¹p cuĆ»a leƤnh CMP laĆø : CMP destination, source LeƤnh naĆøy so saĆ¹nh toaĆ¹n haĆÆng nguoĆ n vaĆø toaĆ¹n haĆÆng Ʊƭch baĆØng caĆ¹ch tĆ­nh hieƤu Destinaition - Source . KeĆ”t quĆ»a seƵ khoĆ¢ng ƱƶƓĆÆc caĆ”t giƶƵ . Nhƶ vaƤy laĆø leƤnh CMP gioĆ”ng nhƶ leƤnh SUB , chƦ khaĆ¹c laĆø trong leƤnh CMP toaĆ¹n haĆÆng Ʊƭch khoĆ¢ng thay ƱoĆ„i . GiaĆ» sƶƻ chƶƓng trƬnh chƶaĆ¹ caĆ¹c leƤnh sau : CMP AX,BX ;trong ƱoĆ¹ AX=7FFF vaĆø BX=0001h JG BELOW KeĆ”t quĆ»a cuĆ»a leƤnh CMP AX,BX laĆø 7FFEh . LeƤnh JG ƱƶƓĆÆc thoĆ»a maƵn vƬ ZF=0=SF=OF do ƱoĆ¹ ƱieĆ u khieĆ„n ƱƶƓĆÆc chuyeĆ„n ƱeĆ”n nhaƵn BELOW. DieĆ£n dĆ²ch leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn VĆ­ duĆÆ treĆ¢n ƱaĆ¢y veĆ  leƤnh CMP cho pheĆ¹p leƤnh nhaĆ»y sau noĆ¹ chuyeĆ„n ƱieĆ u khieĆ„n ƱeĆ”n nhaƵn BELOW . ƑaĆ¢y laĆø vĆ­ duĆÆ cho thaĆ”y CPU thƶĆÆc hieƤn leƤnh nhaĆ»y nhƶ theĆ” naĆøo . ChuĆ¹ng thƶĆÆc hieƤn baĆØng caĆ¹ch khaĆ¹m xeĆ¹t traĆÆng thaĆ­ caĆ¹c cĆ“Ćø .LaƤp trƬnh vieĆ¢n khoĆ¢ng caĆ n quan taĆ¢m ƱeĆ”n caĆ¹c cĆ“Ćø , maĆø coĆ¹ theĆ„ duĆøng teĆ¢n cuĆ»a caĆ¹c leƤnh nhaĆ»y ƱeĆ„ chuyeĆ„n ƱieĆ u khieĆ„n ƱeĆ”n moƤt nhaƵn naĆøo ƱoĆ¹ . CaĆ¹c leƤnh CMP AX,BX JG BELOW coĆ¹ nghĆ³a laĆø neĆ”u AX>BX thƬ nhaĆ»y ƱeĆ”n nhaƵn BELOW MaĆ«c duĆø leƤnh CMP ƱƶƓĆÆc thieĆ”t keĆ” cho caĆ¹c leƤnh nhaĆ»y . Nhƶng leƤnh nhaĆ»y coĆ¹ theĆ„ Ć±Ć¶Ć¹ng trĆ¶Ć“Ć¹c 1 leƤnh khaĆ¹c , chaĆŗng haĆÆn : DEC AX JL THERE coĆ¹ nghĆ³a laĆø neĆ”u AX trong dieĆ£n dĆ²ch coĆ¹ daĆ”u < 0 thƬ ƱieĆ u khieĆ„n ƱƶƓĆÆc chuyeĆ„n cho THERE . NhaĆ»y coĆ¹ daĆ”u so vĆ“Ć¹i nhaĆ»y khoĆ¢ng daĆ”u
  • 39. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 32 MoƤt leƤnh nhaĆ»y coĆ¹ daĆ”u tƶƓng Ć¶Ć¹ng vĆ“Ć¹i 1 nhaĆ»y khoĆ¢ng daĆ”u . VĆ­ duĆÆ leƤnh nhaĆ»y coĆ¹ daĆ”u JG vaĆø leƤnh nhaĆ»y khoĆ¢ng daĆ”u JA . VieƤc sƶƻ duĆÆng JG hay JA laĆø tuyĆø thuoƤc vaĆøo dieĆ£n dĆ²ch coĆ¹ daĆ”u hay khoĆ¢ng daĆ”u . BaĆ»ng 3-1 cho thaĆ”y caĆ¹c leƤnh nhaĆ»y coĆ¹ daĆ”u phuĆÆ thuoƤc vaĆøo traĆÆng thaĆ¹i cuĆ»a caĆ¹c cĆ“Ćø ZF,SF,OF .CaĆ¹c leƤnh nhaĆ»y khoĆ¢ng daĆ”u phuĆÆ thuoƤc vaĆøo traĆÆng thaĆ¹i cuĆ»a caĆ¹c cĆ“Ćø ZF vaĆø CF . Sƶƻ duĆÆnh leƤnh nhaĆ»y khoĆ¢ng hĆ“ĆÆp lyĆ¹ seƵ taĆÆo ra keĆ”t quaĆ» sai . GiaĆ» sƶƻ raĆØng chuĆ¹ng ta dieĆ£n dĆ²ch coĆ¹ daĆ”u .NeĆ”u AX=7FFFh vaĆø BX=8000h , caĆ¹c leƤnh : CMP AX,BX JA below seƵ cho keĆ”t quĆ»a sai maĆ«c duĆø 7FFFh > 8000h ( leƤnh JA khoĆ¢ng thƶĆÆc hieƤn ƱƶƓĆÆc vƬ 7FFFFh < 8000h trong dieĆ£n dĆ²ch khoĆ¢ng daĆ”u ) Sau ƱaĆ¢y chuĆ¹ng ta seƵ laĆ”y vĆ­ duĆÆ Ć±eĆ„ minh hoĆÆa vieƤc sƶƻ duĆÆng caĆ¹c leƤnh nhaĆ»y VĆ­ duĆÆ : GiaĆ» sƶƻ raĆØng AX vaĆø BX chƶaĆ¹ caĆ¹c soĆ” coĆ¹ daĆ”u . VieĆ”t ƱoaĆÆn ct ƱeĆ„ ƱaĆ«t soĆ” lĆ“Ć¹n nhaĆ”t vaĆøo CX . GiaĆ»i : MOV CX,AX ; ƱaĆ«t AX vaĆøo CX CMP BX,CX ;BX lĆ“Ć¹n hĆ“n CX? JLE NEXT ; khoĆ¢ng thƬ tieĆ”p tuĆÆc MOV CX,BX ; yes , ƱaĆ«t BX vaĆøo CX NEXT: 3.3 LeƤnh JMP LeƤnh JMP ( jump) laĆø leƤnh nhaĆ»y khoĆ¢ng ƱieĆ u kieƤn . CuĆ¹ phaĆ¹p cuĆ»a JMP laĆø JMP destination Trong ƱoĆ¹ destination laĆø moƤt nhaƵn Ć“Ć» trong cuĆøng 1 ƱoĆÆan vĆ“Ć¹i leƤnh JMP . LeƤnh JMP duĆøng ƱeĆ„ khaĆ©c phuĆÆc haĆÆn cheĆ” cuĆ»a caĆ¹c leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn ( khoĆ¢ng quaĆ¹ 126 bytes keĆ„ tƶĆø vĆ² trĆ­ cuĆ»a leƤnh nhaĆ»y coĆ¹ ƱieĆ u kieƤn ) VĆ­ duĆÆ chuĆ¹ng ta coĆ¹ ƱoaĆÆn chƶƓng trƬnh sau : TOP: ; thaĆ¢n voĆøng laĆ«p DEC CX JNZ TOP ; neĆ”u CX>0 tieĆ”p tuĆÆc laĆ«p MOV AX,BX giaĆ» sƶƻ thaĆ¢n voĆøng laĆ«p chĆ¶Ć¹a nhieĆ u leƤnh maĆø noĆ¹ vƶƓĆÆt khoĆ»i 126 bytes trĆ¶Ć“Ć¹c leƤnh JNZ TOP . CoĆ¹ theĆ„ giaĆ»i quyeĆ”t tƬnh traĆÆng naĆøy baĆØng caĆ¹c leƤnh sau : TOP:
  • 40. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 33 ; thaĆ¢n voĆøng laĆ«p DEC CX JNZ BOTTOM ; neĆ”u CX>0 tieĆ”p tuĆÆc laĆ«p JMP EXIT BOTTOM: JMP TOP EXIT: MOV AX,BX 3.4 CaĆ”u truĆ¹c cuĆ»a ngoĆ¢n ngƶƵ caĆ”p cao ChuĆ¹ng ta seƵ duĆøng caĆ¹c leƤnh nhaĆ»y ƱeĆ„ thƶĆÆc hieƤn caĆ¹c caĆ”u truĆ¹c tƶƓng tƶĆÆ nhƶ trong ngoĆ¢n ngƶƵ caĆ”p cao 3.4.1 CaĆ”u truĆ¹c reƵ nhaĆ¹nh Trong ngoĆ¢n ngƶƵ caĆ”p cao caĆ”u truĆ¹c reƵ nhaĆ¹nh cho pheĆ¹p moƤt chƶƓng trƬnh reƵ nhaĆ¹nh ƱeĆ”n nhƶƵng ƱoaĆÆn khaĆ¹c nhau tuyĆø thuoƤc vaĆøo caĆ¹c ƱieĆ u kieƤn . Trong phaĆ n naĆøy chuĆ¹ng ta seƵ xem xeĆ¹t 3 caĆ”u truĆ¹c a) IF-THEN CaĆ”u truĆ¹c IF-THEN coĆ¹ theĆ„ dieĆ£n ƱaĆÆt nhƶ sau : IF condition is true THEN execute true branch statements END IF VĆ­ duĆÆ : Thay theĆ” giaĆ¹ trĆ² treĆ¢n AX baĆØng giaĆ¹ trĆ² tuyeĆ”t ƱoĆ”i cuĆ»a noĆ¹ ThuaƤt toaĆ¹n nhƶ sau : IF AX<0 THEN replace AX by -AX END-IF CoĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau :
  • 41. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 34 ; if AX<0 CMP AX,0 JNL END_IF ; no , exit ;then NEG AX , yes , change sign END_IF : b) IF_THEN_ELSE IF condition is true THEN execute true branch statements ELSE execute false branch statements END_IF VĆ­ duĆÆ : giaĆ» sƶƻ AL vaĆø BL chĆ¶Ć¹a ASCII code cuĆ»a 1 kyĆ¹ tƶĆÆ .HaƵy xuaĆ”t ra maĆøn hƬnh kyĆ¹ tƶĆÆ trĆ¶Ć“Ć¹c ( theo thĆ¶Ć¹ tƶĆÆ kyĆ¹ tƶĆÆ ) ThuaƤt toaĆ¹n IF AL<= BL THEN display AL ELSE display character in BL END_IF CoĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau : MOV AH,2 ; chuaĆ„n bĆ² xuaĆ”t kyĆ¹ tƶĆÆ ;if AL<=BL CMP AL,BL ;AL<=BL? JNBE ELSE_ ; no, display character in BL ;then MOV DL,AL JMP DISPLAY ELSE_: MOV DL,BL DISPLAY: INT 21H END_IF :
  • 42. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 35 c) CASE Case laĆø moƤt caĆ”u truĆ¹c reƵ nhaĆ¹nh nhieĆ u hĆ¶Ć“Ć¹ng . CoĆ¹ theĆ„ duĆøng ƱeĆ„ test moƤt thanh ghi hay , bieĆ”n naĆøo Ʊo Ć¹hay moƤt bieĆ„u thĆ¶Ć¹c maĆø giaĆ¹ trĆ² cuĆÆ theĆ„ naĆØn trong 1 vuĆøng caĆ¹c giaĆ¹ trĆ² CaĆ”u truĆ¹c cuĆ»a CASE nhƶ sau : CASE expression value_1 : Statements_1 value_2 : Statements_2 . . value_n : Statements_n VĆ­ duĆÆ : NeĆ”u AX aĆ¢m thƬ ƱaĆ«t -1 vaĆøo BX NeĆ”u AX baĆØng 0 thƬ ƱaĆ«t 0 vaĆøo BX NeĆ”u AX dƶƓng thƬ ƱaĆ«t 1 vaĆøo BX ThuaƤt toaĆ¹n : CASE AX < 0 put -1 in BX = 0 put 0 in BX > 0 put 1 in BX CoĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau : ; case AX CMP AX,0 ;test AX JL NEGATIVE ;AX<0 JE ZERO ;AX=0 JG positive ;AX>0 NEGATIVE: MOV BX,-1 JMP END_CASE ZERO: MOV BX,0 JMP END_CASE POSITIVE: MOV BX,1 JMP END_CASE END_CASE : ReĆ» nhaĆ¹nh vĆ“Ć¹i moƤt toĆ„ hĆ“ĆÆp caĆ¹c ƱieĆ u kieƤn ƑoĆ¢i khi tƬnh traĆÆng reĆ» nhaĆ¹nh trong caĆ¹c leƤnh IF ,CASE caĆ n moƤt toĆ„ hĆ“ĆÆp caĆ¹c ƱieĆ u kieƤn dĆ¶Ć“Ć¹i daĆÆng :
  • 43. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 36 Condition_1 AND Condition_2 Condition_1 OR Condition_2 VĆ­ duĆÆ veĆ  ƱieĆ u kieƤn AND : ƑoĆÆc moƤt kyĆ¹ tƶĆÆ vaĆø neĆ”u noĆ¹ laĆø kyĆ¹ tƶĆÆ hoa thƬ in noĆ¹ ra maĆøn hƬnh ThuaƤt toaĆ¹n : Read a character ( into AL) IF ( ā€˜Aā€™<= character ) AND ( charater <= ā€˜Zā€™) THEN display character END_IF Sau ƱaĆ¢y laĆø code ;read a character MOV AH,2 INT 21H ; character in AL ; IF ( ā€˜Aā€™<= character ) AND ( charater <= ā€˜Zā€™) CMP AL,ā€™Aā€™ ; char >=ā€˜Aā€™? JNGE END_IF ;no, exit CMP AL,ā€™Z ; char <=ā€˜Zā€™? JNLE END_IF ; no exit ; then display it MOV DL,AL MOV AH,2 INT 21H END_IF : VĆ­ duĆÆ veĆ  ƱieĆ u kieƤn OR : ƑoĆÆc moƤt kyĆ¹ tƶĆÆ , neĆ”u kyĆ¹ tƶĆÆ Ć±oĆ¹ laĆø ā€˜Yā€™ hoaĆ«c ā€˜yā€™ thƬ in noĆ¹ leĆ¢n maĆøn hƬnh , ngƶƓĆÆc laĆÆi thƬ keĆ”t thuĆ¹c chƶƓng trƬnh . ThuaƤt toaĆ¹n Read a charcter ( into AL) IF ( character =ā€˜Yā€™) OR ( character=ā€˜yā€™) THEN dispplay it ELSE terminate the program END_IF Code
  • 44. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 37 ;read a character MOV AH,2 INT 21H ; character in AL ; IF ( character =ā€˜yā€™ ) OR ( charater = ā€˜Yā€™) CMP AL,ā€™yā€™ ; char =ā€˜yā€™? JE THEN ;yes , goto display it CMP AL,ā€™Yā€™ ; char =ā€˜Yā€™? JE THEN ; yes , goto display it JMP ELSE_ ;no , terminate THEN : MOV DL,AL MOV AH,2 INT 21H JMP END_IF ELSE_: MOV AH,4CH INT 21h END_IF : 4.3.2 CaĆ”u truĆ¹c laĆ«p MoƤt voĆøng laĆ«p goĆ m nhieĆ u leƤnh ƱƶƓĆÆc laĆ«p laĆÆi , soĆ” laĆ n laĆ«p phuĆÆ thuoƤc ƱieĆ u kieƤn . a) VoĆøng FOR LeƤnh LOOP coĆ¹ theĆ„ duĆøng ƱeĆ„ thƶĆÆc hieƤn voĆøng FOR .CuĆ¹ phaĆ¹p cuĆ»a leƤnh LOOP nhƶ sau : LOOP destination_label SoĆ” ƱeĆ”m cho voĆøng laĆ«p laĆø thanh ghi CX maĆø ban ƱaĆ u noĆ¹ ƱƶƓĆÆc gaĆ¹n 1 giaĆ¹ trĆ² naĆøo ƱoĆ¹ . Khi leƤnh LOOP ƱƶƓĆÆc thƶĆÆc hieƤn CX seƵ tƶĆÆ Ć±oƤng giaĆ»m Ʊi 1 . NeĆ”u CX chƶa baĆØng 0 thƬ voĆøng laĆ«p ƱƶƓĆÆc thƶĆÆc hieƤn tieĆ”p tuĆÆc . NeĆ”u CX=0 leƤnh sau leƤnh LOOP ƱƶƓĆÆc thƶĆÆc hieƤn DuĆøng leƤnh LOOP , voĆøng FOR coĆ¹ theĆ„ thƶĆÆc hieƤn nhƶ sau : ; gaĆ¹n cho cho CX soĆ” laĆ n laĆ«p TOP: ; thaĆ¢n cuĆ»a voĆøng laĆ«p LOOP TOP VĆ­ duĆÆ : DuĆøng voĆøng laĆ«p in ra 1 haĆøng 80 daĆ”u ā€˜*ā€™ MOV CX,80 ; CX chƶaĆ¹ soĆ” laĆ n laĆ«p MOV AH,2 ; haĆøm xuaĆ”t kyĆ¹ tƶĆÆ
  • 45. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 38 MOV DL,ā€™*ā€™ ;DL chƶaĆ¹ kyĆ¹ tƶĆÆ ā€˜*ā€™ TOP: INT 21h ; in daĆ”u ā€˜*ā€™ LOOP TOP ; laĆ«p 80 laĆ n Lƶu yĆ¹ raĆØng voĆøng FOR cuƵng nhƶ leƤnh LOOP thƶĆÆc hieƤn Ć­t nhaĆ”t laĆø 1 laĆ n . Do Ʊo neĆ”u ban ƱaĆ u CX=0 thƬ voĆøng laĆ«p seƵ laĆøm cho CX=FFFH ,tĆ¶Ć¹c laĆø thƶĆÆc hieƤn laĆ«p ƱeĆ”n 65535 laĆ n . ƑeĆ„ traĆ¹nh tƬnh traĆÆng naĆøy , leƤnh JCXZ ( Jump if CX is zero) phaĆ»i ƱƶƓĆÆc duĆøng trĆ¶Ć“Ć¹c voĆøng laĆ«p . LeƤnh JXCZ coĆ¹ cuĆ¹ phaĆ¹p nhƶ sau : JCXZ destination_label NeĆ”u CX=0 ƱieĆ u khieĆ„n ƱƶƓĆÆc chuyeĆ„n cho destination_label . CaĆ¹c leƤnh sau ƱaĆ¢y seƵ ƱaĆ»m baĆ»o voĆøng laĆ«p khoĆ¢ng thƶĆÆc hieƤn neĆ”u CX=0 JCXZ SKIP TOP : ; thaĆ¢n voĆøng laĆ«p LOOP TOP SKIP : b) VoĆøng WHILE VoĆøng WHILE phuĆÆ thuoƤc vaĆøo 1 ƱieĆ u kieƤn .NeĆ”u ƱieĆ u kieƤn ƱuĆ¹ng thƬ thƶĆÆc hieƤn voĆøng WHILE . VƬ vaƤy neĆ”u ƱieĆ u kieƤn sai thƬ voĆøng WHILE khoĆ¢ng thƶĆÆc hieƤn gƬ caĆ» . VĆ­ duĆÆ : VieĆ”t ƱoaĆÆn maƵ ƱeĆ„ ƱeĆ”m soĆ” kyĆ¹ tƶĆÆ Ć±Ć¶Ć“ĆÆc nhaƤp vaĆøo treĆ¢n cuĆøng moƤt haĆøng . MOV DX,0 ; DX ƱeĆ„ ƱeĆ”m soĆ” kyĆ¹ tƶĆÆ MOV AH,1 ;haĆøm ƱoĆÆc 1 kyĆ¹ tƶĆÆ INT 21h ; ƱoĆÆc kyĆ¹ tƶĆÆ vaĆøo AL WHILE_: CMP AL,0DH ; coĆ¹ phaĆ»i laĆø kyĆ¹ tƶĆÆ CR? JE END_WHILE ; ƱuĆ¹ng , thoaĆ¹t INC DX ;taĆŖng DX leĆ¢n 1 INT 21h ; ƱoĆÆc kyĆ¹ tƶĆÆ JMP WHILE_ ; laĆ«p END_WHILE : c) VoĆøng REPEAT CaĆ”u truĆ¹c cuĆ»a REPEAT laĆø repeat statements until condition Trong caĆ”u truĆ¹c repeat meƤnh ƱeĆ  ƱƶƓĆÆc thi haĆønh ƱoĆ ng thĆ“Ćøi ƱieĆ u kieƤn ƱƶƓĆÆc kieĆ„m tra. NeĆ”u ƱieĆ u kieƤn ƱuĆ¹ng thƬ voĆøng laĆ«p keĆ”t thuĆ¹c .
  • 46. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 39 VĆ­ duĆÆ : vieĆ”t ƱoaĆÆn maƵ ƱeĆ„ ƱoĆÆc vaĆøo caĆ¹c kyĆ¹ tƶĆÆ cho ƱeĆ”n khi gaĆ«p kyĆ¹ tƶĆÆ troĆ”ng . MOV AH,1 ; ƱoĆÆc kyĆ¹ tƶĆÆ REPEAT: INT 21h ; kyĆ¹ tƶĆÆ treĆ¢n AL ;until CMP AL,ā€™ ā€˜ ; AL=ā€˜ ā€˜? JNE REPEAT Lƶu yĆ¹ : vieƤc sƶƻ duĆÆng REPEAT hay WHILE laĆø tuyĆø theo chuĆ» quan cuĆ»a moĆ£i ngƶƓĆøi . Tuy nhieĆ¢n coĆ¹ theĆ„ thaĆ”y raĆØng REPEAT phaĆ»i tieĆ”n haĆønh Ć­t nhaĆ”tĆ¹ laĆ n , trong khi ƱoĆ¹ WHILE coĆ¹ theĆ„ khoĆ¢ng tieĆ”n haĆønh laĆ n naĆøo caĆ» neĆ”u ngay tƶĆø ƱaĆ u ƱieĆ u kieƤn ƱaƵ bĆ² sai . 3.5 LaƤp trƬnh vĆ“Ć¹i caĆ”u truĆ¹c caĆ”p cao BaĆøi toaĆ¹n : VieĆ”t chƶƓng trƬnh nhaĆ©c ngƶƓĆøi duĆøng goƵ vaĆøo moƤt doĆøng vaĆŖn baĆ»n . TreĆ¢n 2 doĆøng tieĆ”p theo in ra kyĆ¹ tƶĆÆ vieĆ”t hoa ƱaĆ u tieĆ¢n vaĆø kyĆ¹ tƶĆÆ vieĆ”t hoa cuoĆ”i cuĆøng theo thĆ¶Ć¹ tƶĆÆ alphabetical . NeĆ”u ngƶƓĆøi duĆøng goƵ vaĆøo moƤt kyĆ¹ tƶĆÆ thƶƓĆøng , maĆ¹y seƵ thoĆ¢ng baĆ¹o ā€˜No capitalsā€™ KeĆ”t quĆ»a chaĆÆy chƶƓng trƬnh seƵ nhƶ sau : Type a line of text : TRUONG DAi HOC DALAT First capital = A Last capital = U ƑeĆ„ giaĆ»i baĆøi toaĆ¹n naĆøy ta duĆøng kyƵ thuaƤt laƤp trƬnh TOP-DOWN , nghĆ³a laĆø chia nhoĆ» baĆøi toaĆ¹n thaĆønh nhieĆ u baĆøi toaĆ¹n con . CoĆ¹ theĆ„ chia baĆøi toaĆ¹n thaĆønh 3 baĆøi toaĆ¹n con nhƶ sau : 1. XuaĆ”t 1 chuoĆ£i kyĆ¹ tƶĆÆ ( lĆ“Ćøi nhaĆ©c) 2. ƑoĆÆc vaĆø xƶƻ lyĆ¹ 1 doĆøng vaĆŖn baĆ»n 3. In keĆ”t quĆ»a BĆ¶Ć“Ć¹c 1: HieƤn daĆ”u nhaĆ©c . BĆ¶Ć“Ć¹c naĆøy coĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau : MOV AH,9 ; haĆøm xuaĆ”t chuoĆ£i LEA DX,PRMOPT ;laĆ”y Ć±Ć²a chƦ chuoĆ£i vaĆøo DX INT 21H ; xuaĆ”t chuoĆ£i DaĆ”u nhaĆ©c coĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau trong ƱoaĆÆn soĆ” lieƤu .
  • 47. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 40 PROMPT DB ā€˜Type a line of text :ā€™,0DH,0AH,ā€™$ā€™ BĆ¶Ć“Ć¹c 2 : ƑoĆÆc vaĆø xƶƻ lyĆ¹ moƤt doĆøng vaĆŖn baĆ»n BĆ¶Ć“Ć¹c naĆøy thƶĆÆc hieƤn haĆ u heĆ”t caĆ¹c coĆ¢ng vieƤc cuĆ»a chƶƓng trƬnh : ƱoĆÆc caĆ¹c kyĆ¹ tƶĆÆ tƶĆø baĆøn phĆ­m , tƬm ra kyĆ¹ tƶĆÆ Ć±aĆ u vaĆø kyĆ¹ tƶĆÆ cuoĆ”i , nhaĆ©c nhĆ“Ć» ngƶƓĆøi duĆøng neĆ”u kyĆ¹ tƶĆÆ goƵ vaĆøo khoĆ¢ng phaĆ»i laĆø kyĆ¹ tƶĆÆ hoa . CoĆ¹ theĆ„ bieĆ£u dieĆ£n bĆ¶Ć“Ć¹c naĆøy bĆ“Ć»i thuaƤt toaĆ¹n sau : Read a character WHILE character is not a carrige return DO IF character is a capital (*) THEN IF character precedes first capital Then first capital= character End_if IF character follows last character Then last character = character End_if END_IF Read a character END_WHILE Trong ƱoĆ¹ doĆøng (*) coĆ¹ nghĆ³a laĆø ƱieĆ u kieƤn ƱeĆ„ kyĆ¹ tƶĆÆ laĆø hoa laĆø ƱieĆ u kieƤn AND IF ( ā€˜Aā€™<= character ) AND ( character <= ā€˜Zā€™) BĆ¶Ć“Ć¹c 2 coĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau : MOV AH,1 ; ƱoĆÆc kyĆ¹ tƶĆÆ INT 21H ; kyĆ¹ tƶĆÆ treĆ¢n AL WHILE : ;trong khi kyĆ¹ tƶĆÆ goƵ vaĆøo khoĆ¢ng phaĆ»i laĆø CR thƬ thƶĆÆc hieƤn CMP AL,0DH ; CR? JE END_WHILE ;yes, thoaĆ¹t ; neĆ”u kyĆ¹ tƶĆÆ laĆø hoa CMP AL,ā€™Aā€™ ; char >=ā€˜Aā€™? JNGE END_IF ;khoĆ¢ng phaĆ»i kyĆ¹ tƶĆÆ hoa thƬ nhaĆ»y ƱeĆ”n END_IF CMP AL,ā€™Zā€™ ; char <= ā€˜Zā€™? JNLE END_IF ; khoĆ¢ng phaĆ»i kyĆ¹ tƶĆÆ hoa thƬ nhaĆ»y ƱeĆ”n END_IF ; thƬ
  • 48. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 41 ; neĆ”u kyĆ¹ tƶĆÆ naĆØm trĆ¶Ć“Ć¹c bieĆ”n FIRST ( giaĆ¹ trĆ² ban ƱaĆ u laĆøā€˜[ā€˜ : kyĆ¹ tƶĆÆ sau Z ) CMP AL,FISRT ; char < FIRST ? JNL CHECK_LAST; >= ; thƬ kyĆ¹ tƶĆÆ vieĆ”t hoa ƱaĆ u tieĆ¢n = kyĆ¹ tƶĆÆ MOV FIRST,AL ; FIRST=character ;end_if CHECK_LAST: ; neĆ”u kyĆ¹ tƶĆÆ laĆø sau bieĆ”n LAST ( giaĆ¹ trĆ² ban ƱaĆ u laĆø ā€˜@ā€™: kyĆ¹ tƶĆÆ trĆ¶Ć“Ć¹c A) CMP AL,LAST ; char > LAST ? JNG END_IF ; <= ;thƬ kyĆ¹ tƶĆÆ cuoĆ”i cuĆøng = kyĆ¹ tƶĆÆ MOV LAST, AL ;LAST = character ;end_if END_IF : ; ƱoĆÆc moƤt kyĆ¹ tƶĆÆ INT 21H ; kyĆ¹ tƶĆÆ treĆ¢n AL JMP WHILE_ ; laĆ«p END_WHILE: CaĆ¹c bieĆ”n FIRST vaĆø LAST ƱƶƓĆÆc Ć±Ć²nh nghĆ³a nhƶ sau trong ƱoaĆÆn soĆ” lieƤu : FIRST DB ā€˜[ $ā€˜ ; ā€˜[ā€˜ laĆø kyĆ¹ tƶĆÆ sau Z LAST DB ā€˜@ $ ā€™ ; ā€˜@ā€™ laĆø kyĆ¹ tƶĆÆ trĆ¶Ć“Ć¹c A BĆ¶Ć“Ć¹c 3 : In keĆ”t quĆ»a ThuaƤt toaĆ¹n IF no capital were typed THEN display ā€˜No capitalā€™ ELSE display first capital and last capital END_IF BĆ¶Ć“Ć¹c 3 seƵ phaĆ»i in ra caĆ¹c thoĆ¢ng baĆ¹o : ā€¢ NOCAP_MSG neĆ”u khoĆ¢ng phaĆ»i chƶƵ in ā€¢ CAP1_MSG chƶƵ in ƱaĆ u tieĆ¢n ā€¢ CAP2_MSG chƶƵ in cuoĆ”i cuĆøng ChuĆ¹ng ƱƶƓĆÆc Ć±Ć²nh nghĆ³a nhƶ sau trong ƱoaĆÆn soĆ” lieƤu . NOCAP_MSG DB 0DH,0AH,ā€˜No capitals $ā€™ CAP1_MSG DB 0DH,0AH, ā€˜First capital= ā€™ FIRST DB ā€˜[ $ ā€™ CAP2_MSG DB 0DH,0AH,ā€˜Last capital=ā€™
  • 49. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 42 LAST DB ā€˜@ $ā€™ BĆ¶Ć“Ć¹c 3 coĆ¹ theĆ„ maƵ hoaĆ¹ nhƶ sau : ;in keĆ”t quaĆ» MOV AH,9 ; haĆøm xuaĆ”t kyĆ¹ tƶĆÆ ; IF khoĆ¢ng coĆ¹ chƶƵ hoa naĆøo ƱƶƓĆÆc nhaƤp thƬ FIRST =ā€˜[ā€™ CMP FIRST,ā€™[ā€™ ; FIRST=ā€˜[ā€™ ? JNE CAPS ; khoĆ¢ng , in keĆ”t quĆ»a ;THEN LEA DX,NOCAP_MSG INT 21H CAPS: LEA DX,CAP1_MSG INT 21H LEA DX,CAP2_MSG INT 21H ; end_if ChƶƓng trƬnh coĆ¹ theĆ„ vieĆ”t nhƶ sau : TITLE PGM3-1 : FIRST AND LAST CAPITALS .MODEL SMALL .STACK 100h .DATA PROMPT DB ā€˜Type a line of textā€™, 0DH, AH, ā€˜$ā€™ NOCAP_MSG DB 0DH,0AH, ā€˜No capitals $ā€™ CAP1_MSG DB 0DH,0AH, ā€˜First capital=ā€™ FIRST DB ā€˜[ $ā€™ CAP2_MSG DB ā€˜Last capital = ā€™ LAST DB ā€˜@ $ā€™ .CODE MAIN PROC ; khĆ“Ć»i taĆÆo DS MOV AX,@DATA MOV DS,AX ; in daĆ”u nhaĆ©c MOV AH,9 ; haĆøm xuaĆ”t chuoĆ£i LEA DX,PROMPT ;laĆ”y Ć±Ć²a chƦ chuoĆ£i vaĆøo DX INT 21H ; xuaĆ”t chuoĆ£i
  • 50. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 43 ;ƱoĆÆc vaĆø xƶƻ lyĆ¹ 1 doĆøng vaĆŖn baĆ»n MOV AH,1 ; ƱoĆÆc kyĆ¹ tƶĆÆ INT 21H ; kyĆ¹ tƶĆÆ treĆ¢n AL WHILE : ;trong khi kyĆ¹ tƶĆÆ goƵ vaĆøo khoĆ¢ng phaĆ»i laĆø CR thƬ thƶĆÆc hieƤn CMP AL,0DH ; CR? JE END_WHILE ;yes, thoaĆ¹t ; neĆ”u kyĆ¹ tƶĆÆ laĆø hoa CMP AL,ā€™Aā€™ ; char >=ā€˜Aā€™? JNGE END_IF ;khoĆ¢ng phaĆ»i kyĆ¹ tƶĆÆ hoa thƬ nhaĆ»y ƱeĆ”n END_IF CMP AL,ā€™Zā€™ ; char <= ā€˜Zā€™? JNLE END_IF ; khoĆ¢ng phaĆ»i kyĆ¹ tƶĆÆ hoa thƬ nhaĆ»y ƱeĆ”n END_IF ; thƬ ; neĆ”u kyĆ¹ tƶĆÆ naĆØm trĆ¶Ć“Ć¹c bieĆ”n FIRST CMP AL,FISRT ; char < FIRST ? JNL CHECK_LAST; >= ; thƬ kyĆ¹ tƶĆÆ vieĆ”t hoa ƱaĆ u tieĆ¢n = kyĆ¹ tƶĆÆ MOV FIRST,AL ; FIRST=character ;end_if CHECK_LAST: ; neĆ”u kyĆ¹ tƶĆÆ laĆø sau bieĆ”n LAST CMP AL,LAST ; char > LAST ? JNG END_IF ; <= ;thƬ kyĆ¹ tƶĆÆ cuoĆ”i cuĆøng = kyĆ¹ tƶĆÆ MOV LAST, AL ;LAST = character ;end_if END_IF : ; ƱoĆÆc moƤt kyĆ¹ tƶĆÆ INT 21H ; kyĆ¹ tƶĆÆ treĆ¢n AL JMP WHILE_ ; laĆ«p END_WHILE: ;in keĆ”t quaĆ» MOV AH,9 ; haĆøm xuaĆ”t kyĆ¹ tƶĆÆ ; IF khoĆ¢ng coĆ¹ chƶƵ hoa naĆøo ƱƶƓĆÆc nhaƤp thƬ FIRST =ā€˜[ā€˜ CMP FIRST,ā€™[ā€˜ ; FIRST=ā€˜[ā€˜ ? JNE CAPS ; khoĆ¢ng , in keĆ”t quĆ»a ;Then LEA DX,NOCAP_MSG INT 21H CAPS: LEA DX,CAP1_MSG
  • 51. ChƶƓng 3 : CaĆ¹c leƤnh laĆ«p vaĆø reƵ nhaĆ¹nh 44 INT 21H LEA DX,CAP2_MSG INT 21H ; end_if ; dos exit MOV AH,4CH INT 21h MAIN ENDP END MAIN
  • 52. ChƶƓng 4 : CaĆ¹ c leƤ n h dĆ²ch vaĆø quay 45 ChƶƓng 4 : CAƙC LEƄNH LOGIC , DƒCH VAƘ QUAY Trong chƶƓng naĆøy chuĆ¹ng ta seƵ xem xeĆ¹t caĆ¹c leƤnh maĆø chuĆ¹ng coĆ¹ theĆ„ duĆøng ƱeĆ„ thay ƱoĆ„i tƶĆøng bit treĆ¢n moƤt byte hoaĆ«c moƤt tƶĆø soĆ” lieƤu . KhaĆ» naĆŖng quaĆ»n lyĆ¹ ƱeĆ”n tƶĆøng bit thƶƓĆøng laĆø khoĆ¢ng coĆ¹ trong caĆ¹c ngoĆ¢n ngƶƵ caĆ”p cao ( trƶĆø C ) vaĆø ƱaĆ¢y laĆø lyĆ¹ do giaĆ»i thĆ­ch taĆÆi sao hĆ“ĆÆp ngƶƵ vaĆ£n ƱoĆ¹ng vai troĆø quan troĆÆng trong khi laƤp trƬnh . 4.1 CaĆ¹c leƤnh logic ChuĆ¹ng ta coĆ¹ theĆ„ duĆøng caĆ¹c leƤnh logic ƱeĆ„ thay ƱoĆ„i tƶĆøng bit treĆ¢n byte hoaĆ«c treĆ¢n moƤt tƶĆø soĆ” lieƤu . Khi moƤt pheĆ¹p toaĆ¹n logic ƱƶƓĆÆc aĆ¹p duĆÆng cho toaĆ¹n haĆÆng 8 hoaĆ«c 16 bit thƬ coĆ¹ theĆ„ aĆ¹p duĆÆng pheĆ¹p toaĆ¹n logic ƱoĆ¹ treĆ¢n tƶĆøng bit ƱeĆ„ thu ƱƶƓĆÆc keĆ”t quĆ»a cuoĆ”i cuĆøng . VĆ­ duĆÆ : ThƶĆÆc hieƤn caĆ¹c pheĆ¹p toaĆ¹n sau : 1. 10101010 AND 1111 0000 2. 10101010 OR 1111 0000 3. 10101010 XOR 1111 0000 4. NOT 10101010 GiaĆ»i : 1. 10101010 AND 1111 0000 = 1010 0000 2. 10101010 OR 1111 0000 = 1111 1010 3. 1010 1010 XOR 1111 0000 0101 1010 4. NOT 10101010 = 01010101
  • 53. ChƶƓng 4 : CaĆ¹ c leƤ n h dĆ²ch vaĆø quay 46 4.1.1 LeƤnh AND,OR vaĆø XOR LeƤnh AND,OR vaĆø XOR thƶĆÆc hieƤn caĆ¹c chĆ¶Ć¹c naĆŖng ƱuĆ¹ng nhƶ teĆ¢n goĆÆi cuĆ»a noĆ¹ . CuĆ¹ phaĆ¹p cuĆ»a chuĆ¹ng laĆø : AND destination , source OR destination , source XOR destination , source KeĆ”t quĆ»a cuĆ»a leƤnh ƱƶƓĆÆc lƶu trƶƵ trong toaĆ¹n haĆÆng Ʊƭch do ƱoĆ¹ chuĆ¹ng phaĆ»i laĆø thanh ghi hoaĆ«c vĆ² trĆ­ nhĆ“Ć¹ . ToaĆ¹n haĆÆng nguoĆ n laĆø coĆ¹ theĆ„ laĆø haĆØng soĆ” , thanh ghi hoaĆ«c vĆ² trĆ­ nhĆ“Ć¹ . DĆ³ nhieĆ¢n hai toaĆ¹n haĆÆng ƱeĆ u laĆø vĆ² trĆ­ nhĆ“Ć¹ laĆø khoĆ¢ng ƱƶƓĆÆc pheĆ¹p . AĆ»nh hƶƓƻng ƱeĆ”n caĆ¹c cĆ“Ćø : CaĆ¹c cĆ“Ćø SF,ZF vaĆø PF phaĆ»n aĆ¹nh keĆ”t quĆ»a AF khoĆ¢ng xaĆ¹c Ć±Ć²nh CF=OF=0 ƑeĆ„ thay ƱoĆ„i tƶĆøng bit theo yĆ¹ muoĆ”n chuĆ¹ng ta xaĆ¢y dƶĆÆng toaĆ¹n haĆÆng nguoĆ n theo kieĆ„u maĆ«t naĆÆ ( mask) . ƑeĆ„ xaĆ¢y dƶĆÆng maĆ«t naĆÆ chuĆ¹ng ta sƶƻ duĆÆng caĆ¹c tĆ­nh chaĆ”t sau ƱaĆ¢y cuĆ»a caĆ¹c pheĆ¹p toaĆ¹n AND ,OR vaĆø XOR : b AND 1 = b b OR 0 = b b XOR 0 = b b AND 0 = 0 b OR 1 = 1 b XOR 1 = not b ā€¢ LeƤnh AND coĆ¹ theĆ„ duĆøng ƱeĆ„ xoĆ¹a ( clear) toaĆ¹n haĆÆng Ʊƭch neĆ”u maĆ«t naĆÆ baĆØng 0 ā€¢ LeƤnh OR coĆ¹ theĆ„ duĆøng ƱeĆ„ ƱaĆ«t ( set) 1 cho toaĆ¹n haĆÆng Ʊƭch neĆ”u maĆ«t naĆÆ baĆØng 1 ā€¢ LeƤnh XOR coĆ¹ theĆ„ duĆøng ƱeĆ„ laĆ”y ƱaĆ»o toaĆ¹n haĆÆng Ʊƭch neĆ”u maĆ«t naĆÆ baĆØng 1 . LeƤnh XOR cuƵng coĆ¹ theĆ„ duĆøng ƱeĆ„ xoĆ¹a noƤi dung moƤt thanh ghi ( XOR vĆ“Ć¹i chĆ­nh noĆ¹ ) VĆ­ duĆÆ : XoaĆ¹ bit daĆ”u cuĆ»a AL trong khi caĆ¹c bit khaĆ¹c khoĆ¢ng thay ƱoĆ„i GiaĆ»i : DuĆøng leƤnh AND vĆ“Ć¹i maĆ«t naĆÆ 0111111=7Fh AND AL,7Fh ; xoĆ¹a bit daĆ”u ( daĆ”u + ) cuĆ»a AL VĆ­ duĆÆ : Set 1 cho caĆ¹c bit MSB vaĆø LSB cuĆ»a AL , caĆ¹c bit khaĆ¹c khoĆ¢ng thay ƱoĆ„i . GiaĆ»i : DuĆøng leƤnh OR vĆ“Ć¹i maĆ«t naĆÆ 10000001 =81h OR AL,81h ; set 1 cho LSB vaĆø MSB cuĆ»a AL VĆ­ duĆÆ : Thay ƱoĆ„i bit daĆ”u cuĆ»a DX GiaĆ»i : DuĆøng leƤnh XOR vĆ“Ć¹i maĆ«t naĆÆ 1000000000000000=8000h XOR DX,8000h CaĆ¹c leƤnh logic laĆø ƱaĆ«c bieƤt coĆ¹ Ć­ch khi thƶĆÆc hieƤn caĆ¹c nhieƤm vuĆÆ sau : ƑoĆ„i moƤt soĆ” dĆ¶Ć“Ć¹i daĆÆng ASCII thaĆønh moƤt soĆ” GiaĆ» sƶƻ raĆØng chuĆ¹ng ta ƱoĆÆc moƤt kyĆ¹ tƶĆÆ tƶĆø baĆøn phĆ­m baĆØng haĆøm 1 ngaĆ©t 21h . Khi ƱoĆ¹ AL chĆ¶Ć¹a maƵ ASCII cuĆ»a kyĆ¹ tƶĆÆ . ƑieĆ u naĆøy cuƵng ƱuĆ¹ng neĆ”u kyĆ¹ tƶĆÆ Ć±oĆ¹ laĆø moƤt soĆ” ( digital character) . VĆ­ duĆÆ neĆ”u chuĆ¹ng ta goĆ» soĆ” 5 thƬ AL = 35h ( ASCII code for 5)
  • 54. ChƶƓng 4 : CaĆ¹ c leƤ n h dĆ²ch vaĆø quay 47 ƑeĆ„ chĆ¶Ć¹a 5 treĆ¢n AL chuĆ¹ng ta duĆøng leƤnh : SUB AL,30h CoĆ¹ moƤt caĆ¹ch khaĆ¹c ƱeĆ„ laĆøm vieƤc naĆøy laĆø duĆøng leƤnh AND ƱeĆ„ xoĆ¹a nƶƻa byte cao (high nibble = 4 bit cao ) cuĆ»a AL : AND AL,0Fh VƬ caĆ¹c soĆ” tƶĆø 0-9 coĆ¹ maƵ ASCII tƶĆø 30h-39h , neĆ¢n caĆ¹ch naĆøy duĆøng ƱeĆ„ ƱoĆ„i moĆÆi soĆ” ASCII ra thaƤp phaĆ¢n . ChƶƓng trƬnh hĆ“ĆÆp ngƶƵ ƱoĆ„i moƤt soĆ” thaƤp phaĆ¢n thaĆønh maƵ ASCII cuĆ»a chuĆ¹ng ƱƶƓĆÆc xem nhƶ baĆøi taƤp . ƑoĆ„i chƶƵ thƶƓĆøng thaĆønh chƶƵ hoa MaƵ ASCII cuĆ»a caĆ¹c kyĆ¹ tƶĆÆ thƶƓĆøng tƶĆø a-z laĆø 61h-7Ah vaĆø maƵ ASCII cuĆ»a caĆ¹c kyĆ¹ tƶĆÆ hoa tƶĆø A-Z laĆø 41h -5Ah . GiaĆ» sƶƻ DL chƶaĆ¹ kyĆ¹ tƶĆÆ thƶƓĆøng , ƱeĆ„ ƱoĆ„i noĆ¹ thaĆønh chƶƵ hoa ta duĆø ng leƤnh : SUB DL,20h NeĆ”u chuĆ¹ng ta so saĆ¹nh maƵ nhĆ² phaĆ¢n tƶƓng Ć¶Ć¹ng cuĆ»a kyĆ¹ tƶĆÆ thƶƓĆøng vaĆø kyĆ¹ tƶĆÆ hoa thƬ thaĆ”y raĆØng chƦ caĆ n xoĆ¹a bit thĆ¶Ć¹ 5 thƬ seƵ ƱoĆ„i kyĆ¹ tƶĆÆ thƶƓĆøng sang kyĆ¹ tƶĆÆ hoa . Character Code Character Code a(61h) 01100001 A (41h) 01000001 b (62h) 01100010 B ( 42h) 01000010 . . z ( 7Ah) 01111010 Z ( 5Ah) 01011010 CoĆ¹ theĆ„ xoĆ¹a bit thĆ¶Ć¹ 5 cuĆ»a DL baĆØng caĆ¹ch duĆøng leƤnh AND vĆ“Ć¹i maĆ«t naĆÆ 11011111= DF h AND DL,0DFh ; ƱoĆ„i kyĆ¹ tƶĆÆ thƶƓĆøng trong DL sang kyĆ¹ tƶĆÆ hoa XoĆ¹a moƤt thanh ghi ChuĆ¹ng ta coĆ¹ theĆ„ duĆøng leƤnh sau ƱeĆ„ xoĆ¹a thanh ghi AX : MOV AX,0 hoaĆ«c SUB AX,AX XOR AX,AX LeƤnh thĆ¶Ć¹ nhaĆ”t caĆ n 3 bytes trong khi ƱoĆ¹ 2 leƤnh sau chƦ caĆ n 2 bytes . Nhƶng leƤnh MOV phaĆ»i ƱƶƓĆÆc duĆøng ƱeĆ„ xoaĆ¹ 1 vĆ² trĆ­ nhĆ“Ć¹ . KieĆ„m tra moƤt thanh ghi coĆ¹ baĆØng 0 ?
  • 55. ChƶƓng 4 : CaĆ¹ c leƤ n h dĆ²ch vaĆø quay 48 Thay cho leƤnh CMP AX,0 NgƶƓĆøi ta duĆøng leƤnh OR CX,CX ƱeĆ„ kieĆ„m tra xem CX coĆ¹ baĆØng 0 hay khoĆ¢ng vƬ noĆ¹ laĆøm thay ƱoĆ„i cĆ“Ćø ZF ( ZF=0 neĆ”u CX=0 ) 4.1.2 LeƤnh NOT LeƤnh NOT duĆøng ƱeĆ„ laĆ”y buĆø 1 ( ƱaĆ»o) toaĆ¹n haĆÆng Ʊƭch . CuĆ¹ phaĆ¹p laĆø : NOT destination KhoĆ¢ng coĆ¹ cĆ“Ćø naĆøo bĆ² aĆ»nh hƶƓƻng bĆ“Ć»i leƤnh NOT VĆ­ duĆÆ : LaĆ”y buĆø 1 AX NOT AX 4.1.3 LeƤnh TEST LeƤnh TEST thƶĆÆc hieƤn pheĆ¹p AND giƶƵa toaĆ¹n haĆÆng Ʊƭch vaĆø toaĆ¹n haĆÆng nguoĆ n nhƶng khoĆ¢ng laĆøm thay ƱoĆ„i toaĆ¹n haĆÆng Ʊƭch . MuĆÆc Ʊƭch cuĆ»a leƤnh TEST laĆø ƱeĆ„ set caĆ¹c cĆ“Ćø traĆÆng thaĆ¹i . CuĆ¹ phaĆ¹p cuĆ»a leƤnh test laĆø : TEST destination,source CaĆ¹c cĆ“Ćø bĆ² aĆ»nh hƶƓƻng cuĆ»a leƤnh TEST : SF,ZF vaĆø PF phaĆ»n aĆ¹nh keĆ”t quĆ»a AF khoĆ¢ng xaĆ¹c Ć±Ć²nh CF=OF=0 LeƤnh TEST coĆ¹ theĆ„ duĆøng ƱeĆ„ khaĆ¹m 1 bit treĆ¢n toaĆ¹n haĆÆng . MaĆ«t naĆÆ phaĆ»i chĆ¶Ć¹a bit 1 taĆÆi vĆ² trĆ­ caĆ n khaĆ¹m , caĆ¹c bit khaĆ¹c thƬ baĆØng 0 . KeĆ”t quaĆ» cuĆ»a leƤnh : TEST destination,mask seƵ laĆø 1 taĆÆi bit caĆ n test neĆ”u nhƶ toaĆ¹n haĆÆng Ʊƭch chĆ¶Ć¹a 1 taĆÆi bit test . NeĆ”u toaĆ¹n haĆÆng Ʊƭch chĆ¶Ć¹a 0 taĆÆi bit test thƬ keĆ”t quaĆ» seƵ baĆØng 0 vaĆø do ƱoĆ¹ ZF=1 . VĆ­ duĆÆ : NhaĆ»y tĆ“Ć¹i nhaƵn BELOW neĆ”u AL laĆø moƤt soĆ” chaĆŗn GiaĆ»i : SoĆ” chaĆŗn coĆ¹ bit thĆ¶Ć¹ 0 baĆØng 0 , leƤnh TEST AL,1 ; AL chaĆŗn ? JZ BELOW ; ƱuĆ¹ng , nhaĆ»y ƱeĆ”n BELOW 4.2 LeƤnh SHIFT