execute true branch statements END IF
3.5 Lp trình với câu trúc câp cao
Bài tốn : Viêt chương trình nhaĩc người dùng gõ vào mt dịng vn bạn . Tređn 2 dòng tiêp theo in ra ký tự viêt hoa đaău tieđn và ký tự viêt hoa cuơi cùng theo thứ tự alphabetical . Nêu người dùng gõ vào mt ký tự thường , máy sẽ thođng báo ‘No capitals’
Kêt qụa cháy chương trình sẽ như sau :
Type a line of text :
TRUONG DAi HOC DALAT
First capital = A Last capital = U
Đeơ giại bài tốn này ta dùng kỹ thut lp trình TOP-DOWN , nghĩa là chia nhỏ bài tốn thành nhieău bài tốn con . Cĩ theơ chia bài tốn thành 3 bài tốn con như sau :
1. Xuât 1 chui ký tự ( lời nhaĩc) 2. Đĩc và xử lý 1 dịng vaín bạn 3. In kêt qụa
Bước 1: Hin dâu nhaĩc .
Bước này cĩ theơ mã hố như sau : MOV AH,9 ; hàm xuât chui
LEA DX,PRMOPT ;lây địa chư chui vào DX INT 21H ; xuât chuoêi
Chương 3 : Các lnh laịp và rẽ nhánh 40 PROMPT DB ‘Type a line of text :’,0DH,0AH,’$’
Bước 2 : Đĩc và xử lý mt dịng vn bạn
Bước này thực hieơn haău hêt các cođng vic cụa chương trình : đĩc các ký tự từ bàn phím , tìm ra ký tự đaău và ký tự cuơi , nhaĩc nhở người dùng nêu ký tự gõ vào khođng phại là ký tự hoa .
Cĩ theơ biu din bước này bởi thut tố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 đĩ dịng (*) cĩ nghĩa là đieău kin đeơ ký tự là hoa là đieău kin AND IF ( ‘A’<= character ) AND ( character <= ‘Z’)
Bước 2 cĩ theơ mã hố như sau :
MOV AH,1 ; đĩc ký tự INT 21H ; ký tự tređn AL WHILE :
;trong khi ký tự gõ vào khođng phại là CR thì thực hieơn CMP AL,0DH ; CR?
JE END_WHILE ;yes, thoát ; nêu ký tự là hoa
CMP AL,’A’ ; char >=‘A’?
JNGE END_IF ;khođng phại ký tự hoa thì nhạy đên END_IF CMP AL,’Z’ ; char <= ‘Z’?
JNLE END_IF ; khođng phại ký tự hoa thì nhạy đên END_IF ; thì
Chương 3 : Các lnh laịp và rẽ nhánh 41 ; nêu ký tự naỉm trước biên FIRST ( giá trị ban đaău là‘[‘ : ký tự sau Z )
CMP AL,FISRT ; char < FIRST ? JNL CHECK_LAST; >=
; thì ký tự viêt hoa đaău tieđn = ký tự
MOV FIRST,AL ; FIRST=character ;end_if
CHECK_LAST:
; nêu ký tự là sau biên LAST ( giá trị ban đaău là ‘@’: ký tự trước A) CMP AL,LAST ; char > LAST ?
JNG END_IF ; <= ;thì ký tự cuơi cùng = ký tự
MOV LAST, AL ;LAST = character ;end_if END_IF : ; đĩc mt ký tự INT 21H ; ký tự tređn AL JMP WHILE_ ; laịp END_WHILE:
Các biên FIRST và LAST được định nghĩa như sau trong đốn sơ liu : FIRST DB ‘[ $‘ ; ‘[‘ là ký tự sau Z
LAST DB ‘@ $ ’ ; ‘@’ là ký tự trước A
Bước 3 : In kêt qụa
Thut tốn
IF no capital were typed THEN
display ‘No capital’ ELSE
display first capital and last capital END_IF
Bước 3 sẽ phại in ra các thođng báo :
• NOCAP_MSG nêu khođng phại chữ in
• CAP1_MSG chữ in đaău tieđn
• CAP2_MSG chữ in cuơi cùng
Chúng được định nghĩa như sau trong đốn sơ lieơu .
NOCAP_MSG DB 0DH,0AH,‘No capitals $’ CAP1_MSG DB 0DH,0AH, ‘First capital= ’ FIRST DB ‘[ $ ’
Chương 3 : Các lnh laịp và rẽ nhánh 42 LAST DB ‘@ $’
Bước 3 cĩ theơ mã hố như sau : ;in kêt quạ
MOV AH,9 ; hàm xuât ký tự
; IF khođng cĩ chữ hoa nào được nhp thì FIRST =‘[’ CMP FIRST,’[’ ; FIRST=‘[’ ?
JNE CAPS ; khođng , in kêt qụ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 cĩ theơ viê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 táo DS MOV AX,@DATA MOV DS,AX ; in dâu nhaĩc
MOV AH,9 ; hàm xuât chui
LEA DX,PROMPT ;lây địa chư chui vào DX INT 21H ; xuât chuoêi
Chương 3 : Các lnh laịp và rẽ nhánh 43
;đĩc và xử lý 1 dịng vn bạn
MOV AH,1 ; đĩc ký tự INT 21H ; ký tự tređn AL WHILE :
;trong khi ký tự gõ vào khođng phại là CR thì thực hin CMP AL,0DH ; CR?
JE END_WHILE ;yes, thốt ; nêu ký tự là hoa
CMP AL,’A’ ; char >=‘A’?
JNGE END_IF ;khođng phại ký tự hoa thì nhạy đên END_IF CMP AL,’Z’ ; char <= ‘Z’?
JNLE END_IF ; khođng phại ký tự hoa thì nhạy đên END_IF ; thì
; nêu ký tự naỉm trước biên FIRST
CMP AL,FISRT ; char < FIRST ? JNL CHECK_LAST; >=
; thì ký tự viêt hoa đaău tieđn = ký tự
MOV FIRST,AL ; FIRST=character ;end_if
CHECK_LAST:
; nêu ký tự là sau biên LAST
CMP AL,LAST ; char > LAST ? JNG END_IF ; <=
;thì ký tự cuơi cùng = ký tự
MOV LAST, AL ;LAST = character ;end_if END_IF : ; đĩc mt ký tự INT 21H ; ký tự tređn AL JMP WHILE_ ; laịp END_WHILE:
;in kêt quạ
MOV AH,9 ; hàm xuât ký tự
; IF khođng cĩ chữ hoa nào được nhp thì FIRST =‘[‘ CMP FIRST,’[‘ ; FIRST=‘[‘ ?
JNE CAPS ; khođng , in kêt qụa ;Then
LEA DX,NOCAP_MSG INT 21H
CAPS:
Chương 3 : Các lnh laịp và rẽ nhá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 : Các lnh dịch và quay 45