Laơp trình với câu trúc câp cao

Một phần của tài liệu Giáo trình hợp ngữ (Trang 46 - 52)

b) IF_THEN_ELSE IF condition is true

3.5Laơ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 ) (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 VÀ 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 .

Một phần của tài liệu Giáo trình hợp ngữ (Trang 46 - 52)