Assembly 使用masm显示输入字符串中计数的字母
使用masm(VisualStudio2010),编写一个程序,将整行文本(最多132个字符)输入缓冲区。然后让我的程序确定字母表中每个字母出现的次数。你只能数一数所有字母a-z、a-z和0-9。屏幕应该显示a-4次,b-2次,c-9次。我用编译器EMU8086英特尔语法制作了你的程序(只需复制粘贴运行)。它很大,但有完整的注释以帮助您理解,它就是这样做的:为用户显示消息,从键盘捕获字符串(最大132),计算数字和字母(其他被忽略),显示计数器。如下(代码后面有更多说明):Assembly 使用masm显示输入字符串中计数的字母,assembly,masm,counting,Assembly,Masm,Counting,使用masm(VisualStudio2010),编写一个程序,将整行文本(最多132个字符)输入缓冲区。然后让我的程序确定字母表中每个字母出现的次数。你只能数一数所有字母a-z、a-z和0-9。屏幕应该显示a-4次,b-2次,c-9次。我用编译器EMU8086英特尔语法制作了你的程序(只需复制粘贴运行)。它很大,但有完整的注释以帮助您理解,它就是这样做的:为用户显示消息,从键盘捕获字符串(最大132),计算数字和字母(其他被忽略),显示计数器。如下(代码后面有更多说明): .stack 100
.stack 100h
数据
msj1 db“输入一行文本(最大132):$”
文本数据库133;最大长度132,加上1表示结束字符(13)。
db;用户输入的长度。
db133重复(?);绳子。
数字dw 10重复(0);数字的10个计数器的数组。
大写dw 26 dup(0);26个大写字母计数器的数组。
小写dw 26 dup(0);26个小写字母计数器的数组。
str db 6 dup(“$”);存储转换为字符串的数字。
char db'=$'
空间数据库“$”
密码
;初始化数据段。
mov-ax,@data
mov-ds,ax
;显示消息以捕获文本行。
莫夫啊,9
mov dx,偏移量msj1
int 21h
;捕获文本行。
mov啊,0AH
偏移文本
int 21h
;计算文本行的字符数。
mov si,偏移文本+2;SI指向字符串的开头。第一
;2个字节用于控制(最大长度、长度)。
重复:
;检查当前字符是数字、大写还是小写。
mov-bl,[si];获取当前角色。
呼叫检查数字
呼叫检查(大写)
调用check_小写
;下一个角色。
国际公司
mov bl,[si]
《基本法》第13条
jne重复;如果下一个字符不是13,请重复。
;显示计数器。
呼叫清除屏幕
呼叫显示数字计数器
呼叫显示\u大写\u计数器
呼叫显示\u小写\u计数器
;等钥匙。
mov啊,7
int 21h
;完成程序。
mov-ax,4c00h
int 21h
;------------------------------------------
;此过程显示了系统的10个计数器
;数字计数器数组。
过程显示数字计数器
mov di,偏移数字;DI指向数组。
mov-bp,10;数组长度。
显示数字:
;显示空间。
莫夫啊,9
偏移空间
int 21h
;转换字符串中的当前计数器。
美元
移动ax,[di]
呼叫号码2字符串;字符串返回变量“STR”。
;将当前计数器转换为相应的数字。对于
;例如,如果当前计数器为3,则在“3”中转换3。
mov ax,di;获取当前计数器偏移量。
子ax,偏移数字;转换为0..9。
shr-ax,1;除以偏移量,因为计数器是DW。
加al,48;转换为“0”…“9”。
mov-char,al;以字符串形式存储要显示的数字。
;当前计数器的显示数字属于。
莫夫啊,9
偏移量字符
int 21h
;显示当前计数器。
莫夫啊,9
mov-dx,偏移量str
int 21h
;下一个要显示的计数器。
增加di,2;每个计数器都是DW(两个字节)。
十二月英国石油公司
jnz显示数字;如果(BP>0)跳转。
ret
endp
;------------------------------------------
;此过程显示了系统的26个计数器
;大写字母的计数器数组。
进程显示\大写\计数器
mov di,偏移大写;DI指向数组。
mov-bp,26;数组长度。
显示大写字母:
;显示空间。
莫夫啊,9
偏移空间
int 21h
;转换字符串中的当前计数器。
美元
移动ax,[di]
呼叫号码2字符串;字符串返回变量“STR”。
;将当前计数器转换为相应的字母。对于
;例如,如果当前计数器为3,则在“D”中转换3。
mov ax,di;获取当前计数器偏移量。
副轴,偏移大写;转换为0..25。
shr-ax,1;除以偏移量,因为计数器是DW。
添加al,65;转换为“A”…“Z”。
mov-char,al;以字符串形式存储要显示的字母。
;当前计数器的显示字母属于。
莫夫啊,9
偏移量字符
int 21h
;显示当前计数器。
莫夫啊,9
mov-dx,偏移量str
int 21h
;下一个要显示的计数器。
增加di,2;每个计数器都是DW(两个字节)。
十二月英国石油公司
jnz显示大写字母;如果(BP>0)跳转。
ret
endp
;------------------------------------------
;此过程显示了系统的26个计数器
;小写字母的计数器数组。
proc显示\u小写\u计数器
mov di,offset小写;DI指向数组。
mov-bp,26;数组长度。
显示小写字母:
;显示空间。
莫夫啊,9
偏移空间
int 21h
;转换字符串中的当前计数器。
美元
移动ax,[di]
呼叫号码2字符串;字符串返回变量“STR”。
;将当前计数器转换为相应的字母。对于
;例如,如果当前计数器为3,则在“d”中转换3。
mov ax,di;获取当前计数器偏移量。
sub-ax,offset小写;转换为0..25。
shr-ax,1;除以偏移量,因为计数器是DW。
添加al,97;转换为“a”…“z”。
mov-char,al;以字符串形式存储要显示的字母。
;当前计数器的显示字母属于。
莫夫啊,9
偏移量字符
int 21h
;显示当前计数器。
莫夫啊,9
mov-dx,偏移量str
int 21h
;下一个要显示的计数器。
增加di,2;每个计数器都是DW(两个字节)。
十二月英国石油公司
jnz显示小写字母;如果(BP>0)跳转。
ret
endp
;------------------------------------------
;此过程检查BL中的字符
;是一个数字('0'..'9')。如果是,则增加
;数组“数字”中的相应计数器。
过程校验位
cmp bl,“0”
jb不是一个数字;如果AL<'0'完成。
《基本法》第9条
ja不是一个数字;如果AL>'9'完成。
;如果没有跳转,AL是一个数字
.stack 100h
.data
msj1 db 'Enter a line of text (132 max) : $'
text db 133 ;MAX LENGTH 132, PLUS 1 FOR ENDING CHR(13).
db ? ;LENGTH ENTERED BY USER.
db 133 dup(?) ;THE STRING.
digits dw 10 dup(0) ;ARRAY OF 10 COUNTERS FOR DIGITS.
uppercase dw 26 dup(0) ;ARRAY OF 26 COUNTERS FOR UPPERCASE LETTERS.
lowercase dw 26 dup(0) ;ARRAY OF 26 COUNTERS FOR LOWERCASE LETTERS.
str db 6 dup('$') ;TO STORE NUMBER CONVERTED TO STRING.
char db ' =$'
space db ' $'
.code
;INITIALIZE DATA SEGMENT.
mov ax,@data
mov ds,ax
;DISPLAY MESSAGE TO CAPTURE LINE OF TEXT.
mov ah, 9
mov dx, offset msj1
int 21h
;CAPTURE LINE OF TEXT.
mov ah, 0AH
mov dx, offset text
int 21h
;COUNT CHARACTERS OF THE LINE OF TEXT.
mov si, offset text + 2 ;SI POINTS TO BEGINNING OF STRING. THE FIRST
;2 BYTES ARE FOR CONTROL (MAX LENGTH, LENGTH).
repeat:
;CHECK IF CURRENT CHARACTER IS DIGIT, UPPERCASE OR LOWERCASE.
mov bl, [ si ] ;GET CURRENT CHARACTER.
call check_digit
call check_uppercase
call check_lowercase
;NEXT CHARACTER.
inc si
mov bl, [ si ]
cmp bl, 13
jne repeat ;IF NEXT CHARACTER IS NOT 13, REPEAT.
;DISPLAY COUNTERS.
call clear_screen
call display_digit_counters
call display_uppercase_counters
call display_lowercase_counters
;WAIT FOR A KEY.
mov ah,7
int 21h
;FINISH PROGRAM.
mov ax,4c00h
int 21h
;------------------------------------------
;THIS PROCEDURE DISPLAYS THE 10 COUNTERS OF THE
;ARRAY OF COUNTERS FOR DIGITS.
proc display_digit_counters
mov di, offset digits ;DI POINTS TO ARRAY.
mov bp, 10 ;ARRAY LENGTH.
display_digits:
;DISPLAY SPACE.
mov ah, 9
mov dx, offset space
int 21h
;CONVERT CURRENT COUNTER IN STRING.
call dollars
mov ax, [ di ]
call number2string ;STRING RETURNS IN VARIABLE "STR".
;CONVERT CURRENT COUNTER IN CORRESPONDING DIGIT. FOR
;EXAMPLE, IF CURRENT COUNTER IS 3, CONVERT 3 IN '3'.
mov ax, di ;GET CURRENT COUNTER OFFSET.
sub ax, offset digits ;CONVERT TO 0..9.
shr ax, 1 ;DIVIDE OFFSET BECAUSE COUNTERS ARE DW.
add al, 48 ;CONVERT TO '0'..'9'.
mov char, al ;STORE DIGIT IN STRING TO DISPLAY.
;DISPLAY DIGIT FOR CURRENT COUNTER BELONGS TO.
mov ah, 9
mov dx, offset char
int 21h
;DISPLAY CURRENT COUNTER.
mov ah, 9
mov dx, offset str
int 21h
;NEXT COUNTER TO DISPLAY.
add di, 2 ;EVERY COUNTER IS DW (TWO BYTES).
dec bp
jnz display_digits ;IF ( BP > 0 ) JUMP.
ret
endp
;------------------------------------------
;THIS PROCEDURE DISPLAYS THE 26 COUNTERS OF THE
;ARRAY OF COUNTERS FOR UPPERCASE LETTERS.
proc display_uppercase_counters
mov di, offset uppercase ;DI POINTS TO ARRAY.
mov bp, 26 ;ARRAY LENGTH.
display_uppercase:
;DISPLAY SPACE.
mov ah, 9
mov dx, offset space
int 21h
;CONVERT CURRENT COUNTER IN STRING.
call dollars
mov ax, [ di ]
call number2string ;STRING RETURNS IN VARIABLE "STR".
;CONVERT CURRENT COUNTER IN CORRESPONDING LETTER. FOR
;EXAMPLE, IF CURRENT COUNTER IS 3, CONVERT 3 IN 'D'.
mov ax, di ;GET CURRENT COUNTER OFFSET.
sub ax, offset uppercase ;CONVERT TO 0..25.
shr ax, 1 ;DIVIDE OFFSET BECAUSE COUNTERS ARE DW.
add al, 65 ;CONVERT TO 'A'..'Z'.
mov char, al ;STORE LETTER IN STRING TO DISPLAY.
;DISPLAY LETTER FOR CURRENT COUNTER BELONGS TO.
mov ah, 9
mov dx, offset char
int 21h
;DISPLAY CURRENT COUNTER.
mov ah, 9
mov dx, offset str
int 21h
;NEXT COUNTER TO DISPLAY.
add di, 2 ;EVERY COUNTER IS DW (TWO BYTES).
dec bp
jnz display_uppercase ;IF ( BP > 0 ) JUMP.
ret
endp
;------------------------------------------
;THIS PROCEDURE DISPLAYS THE 26 COUNTERS OF THE
;ARRAY OF COUNTERS FOR LOWERCASE LETTERS.
proc display_lowercase_counters
mov di, offset lowercase ;DI POINTS TO ARRAY.
mov bp, 26 ;ARRAY LENGTH.
display_lowercase:
;DISPLAY SPACE.
mov ah, 9
mov dx, offset space
int 21h
;CONVERT CURRENT COUNTER IN STRING.
call dollars
mov ax, [ di ]
call number2string ;STRING RETURNS IN VARIABLE "STR".
;CONVERT CURRENT COUNTER IN CORRESPONDING LETTER. FOR
;EXAMPLE, IF CURRENT COUNTER IS 3, CONVERT 3 IN 'd'.
mov ax, di ;GET CURRENT COUNTER OFFSET.
sub ax, offset lowercase ;CONVERT TO 0..25.
shr ax, 1 ;DIVIDE OFFSET BECAUSE COUNTERS ARE DW.
add al, 97 ;CONVERT TO 'a'..'z'.
mov char, al ;STORE LETTER IN STRING TO DISPLAY.
;DISPLAY LETTER FOR CURRENT COUNTER BELONGS TO.
mov ah, 9
mov dx, offset char
int 21h
;DISPLAY CURRENT COUNTER.
mov ah, 9
mov dx, offset str
int 21h
;NEXT COUNTER TO DISPLAY.
add di, 2 ;EVERY COUNTER IS DW (TWO BYTES).
dec bp
jnz display_lowercase ;IF ( BP > 0 ) JUMP.
ret
endp
;------------------------------------------
;THIS PROCEDURE CHECK IF THE CHARACTER IN BL
;IS A DIGIT ('0'..'9'). IF IT IS, INCREASES
;THE APPROPIATE COUNTER IN ARRAY "DIGITS".
proc check_digit
cmp bl, '0'
jb not_a_digit ;IF AL < '0' FINISH.
cmp bl, '9'
ja not_a_digit ;IF AL > '9' FINISH.
;IF NO JUMP, AL IS A DIGIT. INCREASE COUNTER USING
;THE DIGIT AS OFFSET INSIDE THE ARRAY OF COUNTERS,
;FOR EXAMPLE, THE COUNTER FOR DIGIT '3' IS THE THIRD
;POSITION IN THE ARRAY.
sub bl, 48 ;CONVERT DIGIT IN NUMBER ('0'..'9'->0..9).
mov bh, 0 ;CLEAR BH TO USE BX.
shl bx, 1 ;MULTIPLY BY 2 BECASE EVERY COUNTER IS DW (2 BYTES).
add bx, offset digits ;BX POINTS TO THE APPROPIATE COUNTER.
inc [ bx ] ;INCREASE COUNTER OF DIGIT.
not_a_digit:
ret
endp
;------------------------------------------
;THIS PROCEDURE CHECK IF THE CHARACTER IN BL IS
;AN UPPERCASE LETTER ('A'..'Z'). IF IT IS, INCREASE
;THE APPROPIATE COUNTER IN ARRAY "UPPERCASE'.
proc check_uppercase
cmp bl, 'A'
jb not_uppercase ;IF AL < 'A' FINISH.
cmp bl, 'Z'
ja not_uppercase ;IF AL > 'Z' FINISH.
;IF NO JUMP, AL IS AN UPPERCASE LETTER. INCREASE COUNTER
;USING THE LETTER AS OFFSET INSIDE THE ARRAY OF COUNTERS,
;FOR EXAMPLE, THE COUNTER FOR LETTER 'C' IS THE THIRD
;POSITION IN THE ARRAY.
sub bl, 65 ;CONVERT DIGIT IN NUMBER ('A'..'Z'->0..25).
mov bh, 0 ;CLEAR BH TO USE BX.
shl bx, 1 ;MULTIPLY BY 2 BECASE EVERY COUNTER IS DW (2 BYTES).
add bx, offset uppercase ;BX POINTS TO THE APPROPIATE COUNTER.
inc [ bx ] ;INCREASE COUNTER OF UPPERCASE LETTER.
not_uppercase:
ret
endp
;------------------------------------------
;THIS PROCEDURE CHECK IF THE CHARACTER IN BL IS
;A LOWERCASE LETTER ('a'..'z'). IF IT IS, INCREASE
;THE APPROPIATE COUNTER IN ARRAY "LOWERCASE".
proc check_lowercase
cmp bl, 'a'
jb not_lowercase ;IF AL < 'a' FINISH.
cmp bl, 'z'
ja not_lowercase ;IF AL > 'z' FINISH.
;IF NO JUMP, AL IS A LOWERCASE LETTER. INCREASE COUNTER
;USING THE LETTER AS OFFSET INSIDE THE ARRAY OF COUNTERS,
;FOR EXAMPLE, THE COUNTER FOR LETTER 'c' IS THE THIRD
;POSITION IN THE ARRAY.
sub bl, 97 ;CONVERT LETTER IN NUMBER ('a'..'z'->0..25).
mov bh, 0 ;CLEAR BH TO USE BX.
shl bx, 1 ;MULTIPLY BY 2 BECASE EVERY COUNTER IS DW (2 BYTES).
add bx, offset lowercase ;BX POINTS TO THE APPROPIATE COUNTER.
inc [ bx ] ;INCREASE COUNTER OF LOWERCASE LETTER.
not_lowercase:
ret
endp
;------------------------------------------
;NUMBER TO CONVERT MUST ENTER IN AX.
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
;ORDER TO CONSTRUCT STRING.
proc number2string
mov bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10.
mov cx, 0 ;COUNTER FOR EXTRACTED DIGITS.
cycle1:
mov dx, 0 ;NECESSARY TO DIVIDE BY BX.
div bx ;DX:AX / 10 = AX:QUOTIENT DX:REMAINDER.
push dx ;PRESERVE DIGIT EXTRACTED FOR LATER.
inc cx ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED.
cmp ax, 0 ;IF NUMBER IS
jne cycle1 ;NOT ZERO, LOOP.
;NOW RETRIEVE PUSHED DIGITS.
mov si, offset str
cycle2:
pop dx
add dl, 48 ;CONVERT DIGIT TO CHARACTER.
mov [ si ], dl
inc si
loop cycle2
ret
endp
;------------------------------------------
;FILLS VARIABLE STR WITH '$'.
;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE
;THESE STRINGS WILL BE DISPLAYED.
proc dollars
mov si, offset str
mov cx, 6
six_dollars:
mov al, '$'
mov [ si ], al
inc si
loop six_dollars
ret
endp
;------------------------------------------
proc clear_screen
mov ah,0
mov al,3
int 10H
ret
endp
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include <string>
using namespace std;
char msj1[50];
char text[135];
int arr_digits[ 10 ];
int arr_lowercase[ 26 ];
int arr_uppercase[ 26 ];
char str[6];
char charr;
char char_equal;
char space[4];
int idx,i,tmp;
void printspace () {
printf( space );
}
void printstr () {
printf( str );
}
void print_char_equal () {
printf( "%c",char_equal );
}
void print_digit_counter () {
printf( "%d",arr_digits[ i ] );
}
// THIS PROCEDURE DISPLAYS THE 10 COUNTERS OF THE
// ARRAY OF COUNTERS FOR DIGITS.
void printcharr_digit () {
printf( "%c",i+48 );
}
void display_digit_counters () {
__asm {
mov i, 0
display_digits:
call printspace
call printcharr_digit
call print_char_equal
call print_digit_counter
;NEXT COUNTER TO DISPLAY.
inc i
cmp i, 10
jne display_digits ;IF ( I != 10 ) JUMP.
}
}
//;THIS PROCEDURE DISPLAYS THE 26 COUNTERS OF THE
//;ARRAY OF COUNTERS FOR UPPERCASE LETTERS.
void printcharr_uppercase () {
printf( "%c",i+65 );
}
void print_uppercase_counter () {
printf( "%d",arr_uppercase[ i ] );
}
void display_uppercase_counters () {
__asm {
mov i, 0
display_uppercase:
call printspace
call printcharr_uppercase
call print_char_equal
call print_uppercase_counter
;NEXT COUNTER TO DISPLAY.
inc i
cmp i, 26
jne display_uppercase ;IF ( I != 26 ) JUMP.
}
}
//;THIS PROCEDURE DISPLAYS THE 26 COUNTERS OF THE
//;ARRAY OF COUNTERS FOR LOWERCASE LETTERS.
void printcharr_lowercase () {
printf( "%c",i+97 );
}
void print_lowercase_counter () {
printf( "%d",arr_lowercase[ i ] );
}
void display_lowercase_counters () {
__asm {
mov i, 0
display_lowercase:
call printspace
call printcharr_lowercase
call print_char_equal
call print_lowercase_counter
;NEXT COUNTER TO DISPLAY.
inc i
cmp i, 26
jne display_lowercase ;IF ( I != 10 ) JUMP.
}
}
//;THIS PROCEDURE CHECK IF THE CHARACTER IN BL
//;IS A DIGIT ('0'..'9'). IF IT IS, INCREASES
//;THE APPROPIATE COUNTER IN ARRAY "DIGITS".
void inc_digit () {
arr_digits[ idx ]++;
}
void check_digit () {
__asm {
and ebx, 0ffh
cmp bl, '0'
jb not_a_digit ;IF AL < '0' FINISH.
cmp bl, '9'
ja not_a_digit ;IF AL > '9' FINISH.
;IF NO JUMP, AL IS A DIGIT. INCREASE COUNTER USING
;THE DIGIT AS OFFSET INSIDE THE ARRAY OF COUNTERS,
;FOR EXAMPLE, THE COUNTER FOR DIGIT '3' IS THE THIRD
;POSITION IN THE ARRAY.
sub bl, 48 ;CONVERT DIGIT IN NUMBER ('0'..'9'->0..9).
mov idx, ebx
call inc_digit
not_a_digit:
}
}
//;THIS PROCEDURE CHECK IF THE CHARACTER IN BL IS
//;AN UPPERCASE LETTER ('A'..'Z'). IF IT IS, INCREASE
//;THE APPROPIATE COUNTER IN ARRAY "UPPERCASE'.
void inc_uppercase () {
arr_uppercase[ idx ]++;
}
void check_uppercase () {
__asm {
and ebx, 0ffh
cmp bl, 'A'
jb not_uppercase ;IF AL < 'A' FINISH.
cmp bl, 'Z'
ja not_uppercase ;IF AL > 'Z' FINISH.
;IF NO JUMP, AL IS AN UPPERCASE LETTER. INCREASE COUNTER
;USING THE LETTER AS OFFSET INSIDE THE ARRAY OF COUNTERS,
;FOR EXAMPLE, THE COUNTER FOR LETTER 'C' IS THE THIRD
;POSITION IN THE ARRAY.
sub bl, 65 ;CONVERT DIGIT IN NUMBER ('A'..'Z'->0..25).
mov idx, ebx
call inc_uppercase
not_uppercase:
}
}
//;THIS PROCEDURE CHECK IF THE CHARACTER IN BL IS
//;A LOWERCASE LETTER ('a'..'z'). IF IT IS, INCREASE
//;THE APPROPIATE COUNTER IN ARRAY "LOWERCASE".
void inc_lowercase () {
arr_lowercase[ idx ]++;
}
void check_lowercase () {
__asm {
and ebx, 0ffh
cmp bl, 'a'
jb not_lowercase ;IF AL < 'a' FINISH.
cmp bl, 'z'
ja not_lowercase ;IF AL > 'z' FINISH.
;IF NO JUMP, AL IS A LOWERCASE LETTER. INCREASE COUNTER
;USING THE LETTER AS OFFSET INSIDE THE ARRAY OF COUNTERS,
;FOR EXAMPLE, THE COUNTER FOR LETTER 'c' IS THE THIRD
;POSITION IN THE ARRAY.
sub bl, 97 ;CONVERT LETTER IN NUMBER ('a'..'z'->0..25).
mov idx, ebx
call inc_lowercase
not_lowercase:
}
}
int _tmain(int argc, _TCHAR* argv[])
{
strcpy( msj1,"Enter a line of text (132 max) : " );
char_equal = '=';
strcpy( space," " );
printf( msj1 );
scanf( "%s",text );
__asm {
;COUNT CHARACTERS OF THE LINE OF TEXT.
lea esi, text ;SI POINTS TO BEGINNING OF STRING. THE FIRST
;2 BYTES ARE FOR CONTROL (MAX LENGTH, LENGTH).
repeat:
;CHECK IF CURRENT CHARACTER IS DIGIT, UPPERCASE OR LOWERCASE.
mov tmp, esi
mov bl, [ esi ] ;GET CURRENT CHARACTER.
call check_digit
mov esi, tmp
mov bl, [ esi ] ;GET CURRENT CHARACTER.
call check_uppercase
mov esi, tmp
mov bl, [ esi ] ;GET CURRENT CHARACTER.
call check_lowercase
mov esi, tmp
;NEXT CHARACTER.
inc esi
mov bl, [ esi ]
cmp bl, 0
jne repeat ;IF NEXT CHARACTER IS NOT 13, REPEAT.
;DISPLAY COUNTERS.
call display_digit_counters
call display_uppercase_counters
call display_lowercase_counters
}
scanf( "%s",text );
return 0;
}