Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
CEN 226: Computer Organization & Assembly Language :CSC 225 (Lec#6) By Dr. Syed Noman 2 Subprograms/Procedures • A subprogram allows us to give a name to a group of instructions and to use that name when we wish to execute those instructions, instead of having to write the instructions again. • For example, the instructions to display a character could be given the name putc (or whatever you choose). Then to display a character you can use the name putc which will cause the appropriate instructions to be executed. 3 Call Instruction • This is referred to as calling the subprogram. In 8086 assembly language, the instruction call is used to invoke a subprogram, so for example, a putc subprogram would be called as follows: ▫ Call putc ; Display character in dl • The process of giving a group of instructions a name is referred to as defining a subprogram. This is only done once. 4 Ret instruction • The ret instruction terminates the subprogram and arranges for execution to resume at the instruction following the call instruction. 5 Procedures for character and string output puts: ; display a string terminated by $ ; ax contains address of string mov dx, ax ; copy address to dx for ms-dos mov ah, 9h int 21h ; call ms-dos to output string ret putc: mov dl, al mov ah, 2h int 21h ret ; display character in al ; copy al to dl for ms-dos 6 Procedure for character input getc: ;read character into al mov ah, 1h int 21h ret 7 Important point about sub-programs • We usually refer to that part of a program where execution begins as the main program . • In practice, programs consist of a main program and a number of subprograms. It is important to note that subprograms make our programs easier to read, write and maintain even if we only use them once in a program. • Note : Subprograms are defined after the code to terminate the program, but before the end directive. • If we placed the subprograms earlier in the code, they would be executed without being called (execution would fall through into them). This should not be allowed to happen. 8 Printing string using procedure • The following program, displays the message ‘Hello World’, and uses the equ directive. .model small .stack 100h .data CR equ 13d LF equ 10d message db ‘Hello World’, CR, LF, ‘$’ .code start: mov ax, @data mov ds, ax mov dx, offset message call puts ; display message mov ax, 4c00h int 21h ; User defined subprograms puts: ; display a string terminated by $ ; dx contains address of string mov ah, 9h int 21h ; output string ret end start 9 Symbolic constants • A symbolic constant is created by associating an identifier with an integer expression or some text. Symbols do not reserve storage. They are used only by the assembler when scanning a program, and they cannot change at run time. • The EQU directive associates a symbolic name with an integer expression or some arbitrary text. 10 Character Conversion: Uppercase to Lowercase & vice-versa • To convert an uppercase letter to lowercase, we note that ASCII codes for the uppercase letters ‘A’ to ‘Z’ form a sequence from 65 to 90. • The corresponding lowercase letters ‘a‘ to ‘z’ have codes in sequence from 97 to 122. • We say that ASCII codes form a collating sequence and we use this fact to sort textual information into alphabetical order. • To convert from an uppercase character to its lowercase equivalent, we add 32 to the ASCII code of the uppercase letter to obtain the ASCII code of the lowercase equivalent. • To convert from lowercase to uppercase, we subtract 32 from the ASCII code of the lowercase letter to obtain the ASCII code of the corresponding uppercase letter. • The number 32 is obtained by subtracting the ASCII code for ‘A’ from the ASCII code for ‘a’ i.e. (‘A’ - ‘a’ = 97 - 65 = 32). 11 Character conversion program with procedures 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ; char4.asm: character conversion: ;upper to lowercase .model small .stack 100h CR equ 13d LF equ 10d .data reply db ‘y’ msg0 db CR, LF, ‘Enter y to continue: $’ msg1 db CR, LF, ‘Enter an uppercase letter: $’ result db CR, LF, ‘The lowercase equivalent is: $’ .code ; main program start: mov ax, @data mov ds, ax readloop: cmp reply, ‘y’ ; while (reply == ‘y‘) 18. jne finish ; do loop body 19. mov ax, offset msg1 20. call puts ; prompt for letter 21. call getc ; read character 22. mov bl, al ; save character in bl 23. add bl, 32d ; convert to lowercase 24. mov ax, offset result 25. call puts ; display result message 26. mov al, bl 27. call putc ; display lowercase letter 28. mov ax, offset msg0 29. call puts ; prompt to continue 30. call getc ; read reply 31. mov reply, al ; save character in reply 32. jmp readloop ; repeat loop test 33. finish: 34. mov ax, 4c00h 35. int 21h ; return to ms-dos 36. ; user defined subprograms should be ;defined here 37. end start 12 Program (char4.asm) output • Executing this program produces as output: Enter an uppercase letter: G The lowercase equivalent is: g • The string result is defined to begin with the “Return” and “Line-feed” characters so that it will be displayed on a new line. An alternative would have been to include the two characters at the end of the string msg1, before the ‘$’ character, e.g. ▫ msg1 db ‘Enter an uppercase letter: ’,CR, LF, ‘$’ • After displaying msg1, as defined above, the next item to be displayed will appear on a new line. 13 Assignment 2b • Write a program that takes a character from the keyboard and converts it to the opposite case (lowercase to uppercase or vice versa) if it is an English alphabet; otherwise the program prints the message “The character is not an English alphabet!” 14 Guessing Game Program • Write a code fragment to read a character entered by the user and compare it to the character ‘A’. Display an appropriate message if the user enters an ‘A’. This code fragment is the basis of a guessing game program. 15 Guessing Game Program: C code fragment • C version: printf(“Guessing game: Enter a letter (A to Z): “); c = getchar() ; if ( c == ‘A’ ) printf(“You guessed correctly !! “); else printf(“Sorry incorrect guess “) ; 16 Guessing Game Program : Assembly code fragment mov ax, offset prompt call puts call getc cmp al, ‘A’ jne is_not_an_a mov ax, offset yes_msg call puts jmp end_else is_not_an_A: mov ax, offset no_msg call puts end_else: ; prompt user ; read character ; compare it to ‘A’ ; jump if not ‘A’ ; if action ; display correct guess ; skip else action ; else action ; display wrong guess 17 Guessing Game Program (complete) .model small .stack 100h CR equ 13d LF equ 10d .data prompt db “Guessing game: Enter a letter (A to Z): $” yes_msg db CR, LF,“You guessed correctly !! $“ no_msg db CR, LF,“Sorry incorrect guess $” .code start: mov ax, @data mov ds, ax mov ax, offset prompt call puts ; prompt for input call getc ; read character cmp al, ‘A’ jne is_not_an_a ; if (al != ‘A’) skip action mov ax, offset yes_msg ; if action call puts ; display correct guess jmp end_else1 ; skip else action is_not_an_A: ; else action mov ax, offset no_msg call puts ; display wrong guess end_else1: finish: mov ax, 4c00h int 21h ; User defined subprograms ; < puts getc defined here> end start 18 Assignment 2c • Write an assembly language program that prints the previous and the forward character for a digit entered within the range of 0-9. use messages for -1 and 10. 19 Assignment 2d • Write an assembly language program that input two digits within the range of 0 to 9 and print the sum if the sum is within the range of 1 to 9, otherwise prints the message “Out of range!”. The program should ask the user for the repetition of the same process.