Urgente~Urgente~Urgente~Preguntas sobre programación en lenguaje ensamblador
; Categoría de pregunta: convierta letras mayúsculas y minúsculas en un artículo en inglés a mayúsculas y minúsculas; cuente el número de apariciones de cada letra, muéstrela en la pantalla y emita un pitido por cada letra mostrada.
p>; Fuente de la pregunta: /question/127760427.html
; Instrucciones del programa:
1. Solicite ingresar un artículo en inglés de no más de 254 caracteres; /p >
; 2. Cuente el número de apariciones de cada letra, trate las letras mayúsculas y minúsculas de manera diferente como letras diferentes (los caracteres no alfabéticos no se cuentan) y, al mismo tiempo, convierta las letras mayúsculas y minúsculas en entre sí
; 3. Muestra diferentes letras y el número de veces que aparecen, y suena una vez
; 4. Muestra el artículo en inglés convertido
; Este programa está compilado en el entorno integrado MASMPlus 1.2. 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 un carácter /p>
; Entrada: dl=Carácter a mostrar
Output_Chr proc Cerca
empujar hacha
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
--- --------- ----------------------------
Función: Salida de retorno de carro; y avance de línea
Output_CTLF proc Near
empujar hacha
empujar dx
mov ah,02h
mov dl,0dh
int 21h
p>mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
-----------------------; -------- p>
Función: Convertir el número binario sin signo en AX en código ASCII decimal explícito y enviarlo a la pantalla para su visualización
; =número binario
; Salir: muestra el número de código ASCII convertido en la posición actual del cursor
Dec_ASCII Proc Near
push ds
empujar cs
pop ds
empujar cs
pop es
empujar dx
empujar bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov BYTE ptr [di],'$'
dec di
cld
@@Dividir: xor dx,dx
div bx
o dl ,30h
mov [di],dl
dec di
prueba ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
pop ds
ret
@@Temp_Save db 7 dup(?)
Dec_ASCII EndP
---------------------------------; - -----
Función: Encuentra si aparece la letra especificada y cuenta el número de apariciones
Parámetro de entrada: AL=letra especificada
; Statics_Letter proc Near
push cx
push bx
mov bx,Letter_Table ;Direcciones de letras que han aparecido y su número de veces
mov cx,Cartas ;Apariencia Número de letras diferentes pasadas
jcxz @@First_Time
@@Find_Letter: cmp al,[bx]
jnz $+ 7
inc BYTE ptr [bx][1] ;Cuenta 1 vez
jmp @@Finded ;Ocurre, regresa después de contar 1 vez
inc bx
inc bx
loop @@Find_Letter
@@First_Time: mov [bx],al ;primera aparición, agregar a la tabla de estadísticas
mov BYTE ptr [bx][1],1 ;Contar 1 vez
inc Letras ;Número de letras diferentes que han aparecido +1
@@Encontrado: pop bx p>
pop cx
ret
Statics_Letter Endp
------------------; -- -----------------
Función: Retrasar el número especificado de tics de reloj
;
; Didas = número de tics del reloj (aproximadamente 18,2 tics en 1 segundo, 182 tics en 10 segundos).
Si el retraso no es 10 veces segundos, el error es ligeramente mayor)
Delay Proc Near
push dx
push cx
xor ax,ax
int 1ah
mov cs:@@Times,dx
mov cs:@@Times[2],cx
Read_Time: xor ax,ax
int 1ah
sub dx,cs:@@Times
sbb cx,cs:@@Times[ 2]
cmp dx,Didas
jb Read_Time
pop cx
pop dx
ret p> p>
@@Times dw 0,0
Retraso finalP
-------------------; --------------------
Didas = 3; Número de ticks del reloj
Letter_Table dw?; y su número de veces Dirección
Letras dw 0 ;El número de letras diferentes que han aparecido
Prompt_Str db 'Por favor ingrese una cadena:',13,10,'$'
Press_Key db 7,13,10,13,10,'El archivo completo presiona cualquier tecla para salir...$'
-------- -- -------------------
Inicio: push cs
pop ds
push cs p>
pop es
Salida Prompt_Str ;Solicitar artículo en inglés
lea dx,Buffer ;Dirección del búfer de cadena de artículo en inglés
mov ah, 0ah
int 21h
call Output_CTLF ;Emite un retorno de carro y un salto de línea
lea si,Buffer[1] ;Dirección del número de carácter de entrada real
cld
lodsb ;Lee este número
mov di,si
mov cl,al
xor ch, ch p>
add di,cx
inc di ;Dirección de las letras que han aparecido y su número de veces
mov Letter_Table,di ;Guardar esta dirección
Traducir: lodsb ;Leer un carácter
mov ah,al
o ah,20h ;Procesarlo como letras minúsculas
cmp ah,'a'
jb Next_One ;No es una letra, no convertir
cmp ah,'z'
ja Next_One ;No es una letra, no convertir
llame a Statics_Letter; busque si aparece la letra especificada y cuente el número de apariciones
xor al,20h; instrucciones clave: convierta minúsculas a mayúsculas, convierta mayúsculas a minúsculas
mov [si-1],al
;Vuelve a escribir en la posición original
Next_One: bucle Traducir
mov BYTE ptr [si],'$' ;Reemplaza el retorno de carro con '$'
mov cx,Letras;El número de letras diferentes que han aparecido
mov si,Letter_Table;Las direcciones de las letras y sus tiempos
Disp_Letter: lodsw;Leer una palabra
mov dl,al ;letras aparecidas
llamar a Output_Chr ;mostrar un carácter
mov dl,':'
llamar a Output_Chr
mov dl,7 ;código de carácter de timbre
llamada Output_Chr
xor al,al
xchg al,ah ;AX= donde aparecen las letras Número de veces
call Dec_ASCII; convierte el número binario sin signo en AX en código ASCII decimal explícito y lo envía a la pantalla de visualización
call Delay un sexto de segundo
call Output_CTLF
loop Disp_Letter
call Output_CTLF
Output Buffer[2]; genera el artículo convertido
;--- ----------------------------------------- of of Press_Key ;Solicita que la operación sea completado, presione cualquier tecla para finalizar el programa
mov ah,1
int 21h
mov ah,4ch ;Finalizar el programa
int 21h
Buffer db 255;String buffer
Código FINALIZA
FIN Inicio;La compilación termina aquí