Red de conocimiento informático - Conocimiento sistemático - 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.

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

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

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)?$'

Press_Key db 7,13,10,13,10,'El compilado presiona cualquier tecla para salir...$'

Inicio: push cs

pop ds

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

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?