Programación en ensamblaje: ingrese una cadena de caracteres desde el teclado y cuente las letras (sin distinguir entre mayúsculas y minúsculas), caracteres numéricos y otros caracteres que contiene.
; Nombre de la pregunta: Caracteres estadísticos clasificados
; Fuente de la pregunta: /question/131013276.html
; Después de la depuración, se ejecuta correctamente.
Segmento de código
Supongamos CS:Code,DS:Code
-------- ----------; -----------
; Función: Mostrar la cadena de la dirección especificada (Str_Addr)
; Entrada:
p>;
; Str_Addr=Dirección de cadena (debe estar en el segmento de datos)
Uso: Salida Str_Addr
; Ejemplo de uso: Salida PromptStr
Salida MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
- -------------------------------------------------- ----------------- de la posición actual del cursor
Entrada: dl=Carácter a mostrar
Output_Chr. proc Cerca
empujar hacha
mov ah,02h
int 21h
pop hacha
ret p>
Output_Chr Endp
-------- --------------------------- ----------------------------------
; Función: mostrar, generar un carro retorno, avance de línea
Output_CTLF proc Near
empujar hacha
empujar dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop hacha
ret
Output_CTLF Endp
------------------------; ---------- ------
; Función: convierte el número binario sin signo en AX en código decimal explícito ASCII y lo envía a la pantalla para su visualización
; Entrada: AX= Número binario
; Salir: Muestra el número de código ASCII convertido en la posición actual del cursor
Unsi_Dec_ASCII Proc Near
push dx
empujar bx
empujar di
mov bx,10
lea di,@@Temp_Save[5]
mov BYTE PTR [di] ,'$'
dec di
cld
@@Dividir: xor dx,dx
div bx
o dl,30h
mov [di],dl
dec di
prueba ax,ax p>
jnz @@Divide
inc di
push di
pop dx
mov ah,9
> int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 6 dup(?)
Unsi_Dec_ASCII EndP
------------------------- ---- ------
; Función: Ingrese un carácter en el teclado Si la entrada es 'y' o 'n' (no distingue entre mayúsculas y minúsculas), se mostrará y se devolverá.
; Entrada: Ninguna
; Salida: Si la entrada es 'y', se establece el indicador de acarreo; si la entrada es 'n', el indicador de acarreo se restablece.
Yes_or_No proc Near
push dx
push ax
@@Input_Chr: mov ah,7 no devuelve lo mostrado. entrada de teclado
int 21h
mov dl,al
and al,0dfh
cmp al,'Y'
jnz $+5
stc
jmp $+7
cmp al,'N'
jnz @@Input_Chr
clc
mov ah,2
int 21h
pop ax
pop dx
ret
Sí_o_No Endp
-------------------------- --- ----
Letras dw ;Número de letras
Dights dw ;Número de dígitos
Otros dw ;Número de otros caracteres
Letras_sum db 13,10,'Letras: $'
Dights_sum db 13,10,'Dígitos : $'
Otros_sum db 13,10,' Otros: $ '
Prompt_Str db 'Ingrese una cadena:$'
Prompt_Con db 13,10,13,10,'Continuar(Y/N)?$' p>
Press_Key db 7,13,10,13,10,'El compilado presiona cualquier tecla para salir...$'
Inicio: push cs
pop ds p>
push cs
pop es
-------------------- ------ -----------
; Ingrese una cadena de caracteres continuamente desde el teclado (el número de caracteres no excede los 80 y la cadena termina con un carácter de retorno de carro)
; p>
Input_Str: Salida Prompt_Str; Solicitud para ingresar una cadena de caracteres
lea dx,Buffer Ingrese la dirección del búfer de cadena
mov ah; ,0ah; Recibe una cadena del teclado
int 21h
call Output_CTLF ; Genera un retorno de carro y un avance de línea
------- ---------- ----------------------
; Clasificar estadísticas por letras, números y otros caracteres.
lea si,Buffer[ 1] ;Dirección del número real de caracteres ingresados
lodsb ;Leer el número de caracteres realmente ingresados
xor ah,ah
mov cx,ax ;Entrada real El número de caracteres se envía al contador
jcxz Continuar
mov Letters,0; /p>
mov Dights,0; Borrar la unidad de conteo de números
p>mov Otros,0 ;Borrar otras unidades de conteo de caracteres
Clasificar: lod
sb ;Carácter actual→AL
cmp al,'0' ;Carácter actual<'0'?
jb Other_Chr ;Menos que, transferir a otros personajes
cmp al,'9' ;Carácter actual>'9'?
ja $+8 ;Mayor que, ve para determinar si es una letra o no
inc Dights ; Recuento de números
jmp Other_Chr[4]
mov ah,al ; al→ah, usado para determinar si es una letra o no
y ah, 0dfh ; protege el quinto dígito, presiona letras mayúsculas Procesando
cmp ah,'A' ;¿Carácter actual<'A'?
jb Other_Chr ;Si es menor que, transfiere a otros caracteres para procesar
cmp ah, 'Z' ;¿Carácter actual>'Z'?
ja Other_Chr ;Si es mayor que eso, procesarlo como otros caracteres
inc Letras ;Recuento de letras
jmp $ +6
Other_Chr: inc Otros ;Otro recuento de caracteres
bucle Clasificar
; -------------- -----------------------
;
Salida Letters_sum
mov ax,Letters ;El número de letras
call Unsi_Dec_ASCII ;Convierte el número binario sin signo en AX en código decimal explícito ASCII y envíalo a la pantalla de visualización
Salida Dights_sum p>
mov ax,Dights ;Número de dígitos
llamar a Unsi_Dec_ASCII
Salida Others_sum
mov ax,Otros ;Número de otros caracteres
llamar a Unsi_Dec_ASCII
Continuar: Salida Prompt_Con
llamar Yes_or_No
jnc Exit_Proc
llamar a Output_CTLF
llamar a Output_CTLF
jmp Input_Str
--------------- --------- -------
Exit_Proc: Salida Press_Key Indica que la operación se ha completado, presione cualquier tecla para finalizar el programa
mov ah,1
int 21h
p>mov ah,4ch ;Finalizar programa
int 21h
Buffer db 80 ;Buffer de cadena
Fin del código
END Start ;La compilación termina aquí
Respuesta adicional: Esto lo inventé yo mismo, ¿por qué desconfío tanto de la gente? ¿Sobre qué base juzgas que no lo inventé yo mismo?