b) IF_THEN_ELSE IF condition is true
3.5 Laơp trình với câu trúc câp cao
Bài toán : Viêt chương trình nhaĩc người dùng gõ vào moơt dòng vaín 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 moơt 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 toán này ta dùng kỹ thuaơt laơp trình TOP-DOWN , nghĩa là chia nhỏ bài toán thành nhieău bài toán con . Có theơ chia bài toán thành 3 bài toán con như sau :
1. Xuât 1 chuoêi 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: Hieơn dâu nhaĩc .
Bước này có theơ mã hoá như sau : MOV AH,9 ; hàm xuât chuoêi
LEA DX,PRMOPT ;lây địa chư chuoêi vào DX INT 21H ; xuât chuoêi
Chương 3 : Các leơnh laịp và rẽ nhánh 40 PROMPT DB ‘Type a line of text :’,0DH,0AH,’$’
Bước 2 : Đĩc và xử lý moơt dòng vaín bạn
Bước này thựchieơn haău hêt các cođng vieơc 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ơ bieêu dieên bước này bởi thuaơt toá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 kieơn đeơ ký tự là hoa là đieău kieơn AND IF ( ‘A’<= character ) AND ( character <= ‘Z’)
Bước 2 có theơ mã hoá 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 leơnh 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 moơt 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ô lieơu : FIRST DB ‘[ $‘ ; ‘[‘ là ký tự sau Z
LAST DB ‘@ $ ’ ; ‘@’ là ký tự trước A
Bước 3 : In kêt qụa Thuaơt toá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 leơnh laịp và rẽ nhánh 42 LAST DB ‘@ $’
Bước 3 có theơ mã hoá như sau : ;in kêt quạ
MOV AH,9 ; hàm xuât ký tự
; IF khođng có chữ hoa nào được nhaơp 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 chuoêi
LEA DX,PROMPT ;lây địa chư chuoêi vào DX INT 21H ; xuât chuoêi
Chương 3 : Các leơnh laịp và rẽ nhánh 43
;đĩc và xử lý 1 dòng vaín 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 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ì
; 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 moơt 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 nhaơp 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 leơnh 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 leơnh dịch và quay 45
Chương 4 : CÁC LEƠNH LOGIC , DỊCH VAØ QUAY Trong chương này chúng ta sẽ xem xét các leơnh mà chúng có theơ dùng đeơ thay đoơi từng bit tređn moơt byte hoaịc moơt từ sô lieơu . Khạ naíng quạn lý đên từng bit thường là khođng có trong các ngođn ngữ câp cao ( trừ C ) và đađy là lý do giại thích tái sao hợp ngữ văn đóng vai trò quan trĩng trong khi laơp trình .