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 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: Código, DS: Código
-----------------; - ---------------------
Función: Mostrar la cadena de la dirección especificada (Str_Addr)
; Entrada:
p>
; Str_Addr = dirección de cadena (se requiere que esté en el segmento de datos)
; Uso: Salida Str_Addr
; : Salida PromptStr
Salida MACRO Str_Addr
lea dx, Str_Addr
mov ah, 9
int 21h
FinM
; - --------------------------------------- --------
; Función: Generar un carácter
Entrada: dl=Carácter a mostrar
Output_Chr proc Cerca de
empujar hacha
mov ah, 02h
int 21h
pop hacha
ret
Output_Chr endp
; ------------ ---------------------------- -
Función: Salida de retorno de carro y avance de línea
Output_CTLF proc Near
push ax
push dx
mov ah, 02h
mov dl, 0dh
int 21h
p>mov dl, 0ah
int 21h p>
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 de visualización 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
Dec_ASCII Proc Cerca de
push ds
push cs
pop ds
push cs
pop es p>
empujar dx
empujar bx
empujar di
mov bx, 10
lea di, @@Temp_Save[ 6]
mov BYTE ptr [di], '$'
dec di
cld
@@Divide: xor dx, dx
div bx
o dl, 30h
p>
mov [di], dl
dec di
test ax, 0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah, 9
int 21h
pop di p>
p>
pop bx
pop dx
pop ds
ret
@@Temp_Save db 7 dup(?)
Dec_ASCII EndP
----------------------- ----
; Función: busca si aparece la letra especificada y cuenta el número de apariciones
Parámetro de entrada: AL=letra especificada
Statics_Letter proc; Near
Statics_Letter proc Near
p>
push cx
push bx
mov bx, Letter_Table; han aparecido y su número de veces
mov cx, Letras han aparecido El número de letras diferentes
jcxz @@First_Time
@@Find_Letter: cmp al , [bx]
jnz $ 7
inc BYTE ptr [bx][1] ; Cuenta 1 vez
jmp @@Finded Aparece antes; 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 número de letras diferentes que han aparecido 1; p>
@@Encontrado: pop bx
pop cx
ret
Statics_Letter Endp
----- --------------- --------------
Función: Retrasar el número especificado de tics de reloj
;; Entrada:
; Didas=clock Número de ticks (aproximadamente 18,2 ticks en 1 segundo, 182 ticks 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?; letras que han aparecido 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 compilado. Presione cualquier tecla para salir...$'
; ----- ---------------------
Inicio: push cs
pop ds
push cs p>
pop es
Salida Prompt_Str; Solicitud para ingresar el artículo en inglés
lea dx, Buffer dirección de búfer de cadena de artículo en inglés
mov ah, 0ah
int 21h
call Output_CTLF; genera un retorno de carro y un avance de línea
lea si, Buffer[1]; carácter número dirección
cld
lodsb; leer este número
mov di, si
mov cl, al
xor ch, ch
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 procesar como letras minúsculas
cmp ah, 'a'
jb Next_One; No es una letra, no convertida
cmp ah, 'z'
ja Next_One; no convertido
cal
l Statics_Letter; busque si aparece la letra especificada y cuente el número de apariciones
xor al, 20h; instrucciones clave: convertir minúsculas a mayúsculas, convertir mayúsculas a minúsculas
mov [si- 1], al; Vuelve a escribir en la posición original
Next_One: loop Translate
mov BYTE ptr [si], '$' reemplaza el carácter de retorno de carro con '$'<; /p>
mov cx , Letras; el número de letras diferentes que han aparecido
mov si, Letter_Table; las direcciones de las letras y sus horas de aparición
Disp_Letter: lodsw; leer una palabra
mov dl, al; letras que han aparecido
llamar a Output_Chr; mostrar un carácter
mov dl, ':'
llamar a Output_Chr
mov dl, 7; código de carácter de campana
llamar a Output_Chr
xor al, al
xchg al , ah; AX=el número de veces que aparece la letra
call 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
call Delay ; Retraso de un sexto de segundo
llamada Output_CTLF
loop Disp_Letter
llamada Output_CTLF
Output Buffer[2]; artículo convertido
; ---------------------------------------- - of of ; indica que la operación se completó, 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 La compilación termina aquí