Assembly 使用masm显示输入字符串中计数的字母

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

使用masm(VisualStudio2010),编写一个程序,将整行文本(最多132个字符)输入缓冲区。然后让我的程序确定字母表中每个字母出现的次数。你只能数一数所有字母a-z、a-z和0-9。屏幕应该显示a-4次,b-2次,c-9次。

我用编译器EMU8086英特尔语法制作了你的程序(只需复制粘贴运行)。它很大,但有完整的注释以帮助您理解,它就是这样做的:为用户显示消息,从键盘捕获字符串(最大132),计算数字和字母(其他被忽略),显示计数器。如下(代码后面有更多说明):

.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;
}