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 la letra especificada aparece 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 direcciones de letras que han aparecido y sus; 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, regresa después de contar 1 vez;
inc bx
inc bx
bucle @@Find_Letter
@@First_Time: mov [bx], al; 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
@@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
Fin retrasadoP
; ---------------- ------ -------------------
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 compulated. 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]; 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; 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;
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
llame a Dec_ASCII; Convierta el número binario sin signo en AX en código ASCII decimal explícito y envíelo a la pantalla para su visualización
call Delay; retardo de un sexto de segundo
call Output_CTLF
loop Disp_Letter
call Output_CTLF
Output Buffer[2]; generar el artículo convertido
; - of ; indica que la operación se completó, presione cualquier tecla para finalizar el programa
mov ah, 1
int 21h
mov ah, 4ch End; el programa
int 21h
Buffer db 255; String buffer
Código FINALIZA
FIN Inicio La compilación termina aquí