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