; Jade Yu Cheng ; ICS 312 ; Assignment 5 Exercise 2 ; March 17, 2009 ; The program prompt the user to enter 10 numbers between 0 and 9 (both ; included). The program prints an error message and re-prompt the user for ; another number if the number entered is invalid. These numbers are stored in ; memory as 1-byte values. The program computes a tally for each possible ; number. For instance, if the user has entered the number "3" 4 times, then ; the tally for number "3" is 4. Instead of merely printing the entered number, ; the program prints the tallies in order, with an appropriately readable format. %include "asm_io.inc" segment .data prompt db "Enter a number between 0 and 9: ", 0 ; prompt msg tally db "The tally for ", 0 ; tally msg 1 is db " is: ", 0 ; tally msg 2 invalid db "Invalid number!", 0 ; invalid msg t db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; counters segment .bss n resb 10 ; reserve space for the numbers segment .text global asm_main asm_main: enter 0,0 ; setup pusha ; setup ; This block of code prompts the user input in a loop and store them in n. mov edx, 0 ; initialize edx = 0 mov ebx, n ; initialize ebx to point to the starting of n loop_input_start: cmp edx, 9 ; compare edx with 9 jg loop_input_end ; terminate the loop if 10 iterations are done mov eax, prompt ; print out the message to prompt user input call print_string call read_int ; read a number and store it in eax cmp eax, 0 ; compare the input with 0 jnge near else_block ; branch if the input is a negative number cmp eax, 9 ; compare the input with 9 jnbe near else_block ; branch if the input is larger than 9 mov [ebx], al ; store the number as one byte quantity in ebx inc edx ; increment loop count edx inc ebx ; increment ebx to point to the next position jmp loop_input_start loop_input_end: ; This block of code counts the occurences of inputs and store them in t. mov dl, 0 ; initialize edx = 0 mov ebx, n ; initialize ebx to point to the starting of n loop_count_start: cmp dl, 9 ; compare dl with 9 jg near loop_count_end mov ecx, t ; let ecx points to the beginning of t movzx eax, byte [ebx] ; extend item as a byte into eax add ecx, eax ; move ecx ptr to a corresponding position in t inc byte [ecx] ; increment the corresponding counter in t inc ebx ; increment ebx to point ot the next position inc edx ; increment edx jmp loop_count_start loop_count_end: ; This block of code prints out the contents of t in a formatted fashion. mov edx, 0 ; initialize edx to be 0 mov ebx, t ; initialize ebx to point to t loop_print_start: cmp edx, 9 ; compare edx with 9 jg end ; terminate the loop if 10 iterations are done mov eax, tally ; print out the first half of the message call print_string mov eax, edx ; print out the current iterations number call print_int mov eax, is ; print out the second half of the message call print_string mov al, [ebx] ; put the value in the address of ebx into al movzx eax, al ; unsigned extend al to eax call print_int ; print out the value call print_nl inc edx ; increment edx inc ebx ; increment ebx to the next value in t jmp loop_print_start ; This block of code prints out invalid input message and jump back to the ; user input loop for more inputs. else_block: mov eax, invalid ; print out the number invalid message call print_string call print_nl jmp loop_input_start; go back to the loop for more inputs end: popa ; cleanup mov eax, 0 ; cleanup leave ; cleanup ret ; cleanup