Programa en lenguaje ensamblador para obtener respuestas
; Este programa está compilado y se ejecuta correctamente
Segmento de código
Asuma CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
-----------------------; - ----------------
; Función: Mostrar la cadena de la dirección especificada (Str_Addr)
; >
; Str_Addr=Dirección de cadena (obligatoria en el segmento de datos)
Uso: Salida Str_Addr
; Ejemplo de uso: Salida PromptStr
Salida MACRO Str_Addr.
lead dx,Str_Addr
mov ah,9
int 21h
EndM
---; --- ----------------------------------------------- ------------- de 2009---------
Función: Generar un carácter
; Carácter que se mostrará
Output_Chr proc Near
push ax
mov ah,02h
int 21h
hacha pop
ret
Output_Chr endp
------------------- ---- -------------------
Función: retorno de carro de salida y avance de línea
procesamiento Output_CTLF cercano
empujar hacha
empujar dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
p>;------------------------------------ de -
; Función: Obtener la posición del cursor
; Entrada: Ninguna
; Salida: DH=número de línea, DL=número de columna
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX p>
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
<p>GetCursor EndP
; ----------------------
; Establecer posición del cursor
; Entrada: Cursor_Row=coordenada de fila; Cursor_Col: coordenada de columna)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX ,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET p>
Establecer cursor EndP
------------- -------------
; Función: Ingrese un número decimal con un número específico de dígitos en el teclado, conviértalo en un número binario y guárdelo en la unidad de memoria especificada.
; Entrada: @@Digits=número de dígitos; di=guardar la primera dirección de los dígitos ingresados
; @@Type_Data=tipo de datos guardados, B=tipo de byte, W = tipo de fuente.
; Salir: El número binario convertido se guarda en la unidad señalada por di
Input_Digit Proc Near
push dx
push cx.
empujar bx
empujar di
lea di,@@Save_Tmp
empujar di
cld p> p>
mov cl,@@Digits
xor ch,ch
push cx
@@Entrada: llamar a GetCursor; obtener la posición del cursor p>
mov ah,1 ;Aceptar un carácter del teclado
int 21h
cmp al,CR ;Si escribes un retorno de carro, el número que tiene escrito tiene menos de N dígitos
jz @@ASC_Dec ;Ir a procesar el número que se ha escrito
cmp al,KBBack
jz @@KB_Back ;Si es una clave en blanco, vuelva a ingresar
cmp al,'0'
jb @@KBBack ;Si es menor que el número '0', vuelva a ingresar
cmp al,'9'
ja @@KBBack ;Si es menor que el número '9', vuelva a ingresar
jmp @@Save_Dig
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: llamar a SetCursor; establecer la posición del cursor p>
jmp @@Input
@@Save_Dig: y al,0fh ;Convertir a número binario
stosb ;Guardar
bucle @@Input ;Aceptar el siguiente número
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ; realmente ingresó el número de dígitos
xor bp,bp
xor dx,dx
xor ax,ax
jcxz @@Save_Ret; Si ingresa directamente sin ingresar ningún número, se procesará como '0'
dec cx ; Disminuya el número de dígitos realmente ingresados en 1 y prepárese para convertir la cadena de dígitos ingresada en números binarios <; /p>
jcxz @@One_Digit ; Si solo se ingresa un dígito, vaya a Guardar este número binario directamente
mov bx,10
@@Mul_Ten: lodsb<; /p>
cbw
agregar ax,bp
mul bx
mov bp,ax
bucle @@Mul_Ten
@@One_Digit:lodsb
cbw p>
agregar hacha,bp
@@Save_Ret: pop di
cmp @@Type_Data,'B'; ¿Tipo de byte?
jz $+5
stosw
jmp $+3
stosb
pop bx
pop cx
pop d
x
ret
@@Digits db ;El número de dígitos decimales
@@Type_Data db 'B' ;El tipo de datos guardados.
B=tipo de byte, W=tipo de palabra
@@Save_Tmp db 16 dup(?)
Input_Digit EndP
------- - -------------------------------
; Función: Convertir el binario número sin signo en AX a código ASCII decimal explícito y enviado a la pantalla de visualización
; Entrada: AX=número binario
; Salida: muestra el número de código ASCII convertido en el cursor actual posición
Dec_ASCII Proc Near
empujar dx
empujar bx
empujar di
mov bx,10
lea di,@@Temp_Save[6]
mov byte ptr [di],'$'
dec di
@@ Dividir: xor dx ,dx
div bx
o dl,30h
mov [di],dl
dec di p>
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
p>@@Temp_Save db 7 dup(?)
Dec_ASCII EndP
-------------; ------ --------------------
; Función: convierte el número binario sin signo en AL como decimal en ASCII decimal explícito; código,
; y enviado a la pantalla de visualización, sin considerar redondeo
; Entrada: AH=número binario, BH=divisor, CX=decimales retenidos
; >; Salir: en La posición actual del cursor muestra el número de código ASCII convertido
Dec_Frac Proc Near
push ax
mov dl,'.'
call Output_Chr ;Mostrar un punto decimal
pop ax
mov bl,10 ;Multiplicador
@@Dec_Frac: mov al,ah ;El el resto no es 0, procesa la parte decimal
mul bl ;Multiplica el resto por 10 y continúa con la división
div bh ;Divide por el divisor y toma el cociente como un decimal del resultado
o al,30h
mov dl,al
llamar a Output_Chr ;muestra un decimal
bucle @@Dec_Frac p>
ret
Dec_Frac EndP
--------------------- -------------- -
Estudiantes equ 30 ;Número de estudiantes
Temp_Cursor dw ;Al ingresar puntuaciones, la posición actual del cursor de puntuación
Score_Tab db 6 dup(0) ; Cada segmento de puntuación cuenta
>
prompt_Str db 'Ingrese las puntuaciones: $'
prompt_Max db CR,LF,CR,LF,'Máximo: $' mensaje para mostrar la puntuación más alta
Prompt_Min db CR,LF,'Minimum: $' ;El mensaje muestra la puntuación mínima
prompt_Res db '00---59: $'
prompt_Ave db CR,LF,' Promedio: $' ;Solicitud para mostrar la puntuación promedio
Presione_Key db CR,LF,CR,LF,'Presione cualquier tecla para salir...$'
Inicio: presione cs
pop ds
push cs
pop es ;haga que el segmento de datos, el segmento adicional y el segmento de código sean el mismo segmento
--; ------- ---------------------------------------
; 1. Ingrese la puntuación
Salida request_Str; Solicite ingresar calificaciones
mov @@Digits,3 ;El número de dígitos decimales
mov @@Type_Data,'B'; El tipo de datos guardados.
B=tipo de byte, W=tipo de palabra
lea di,List_Score;dirección de almacenamiento de puntuación
mov cx,Estudiantes
Input_Score:llamar a GetCursor;obtener posición del cursor
mov dx,word ptr Cursor_Row
mov Temp_Cursor,dx; guarda la posición actual del cursor
llama a Input_Digit; ingresa la puntuación
cmp cx,1
je @@Next_0
mov dx,Temp_Cursor
agregar dh,3
mov Cursor_Row,dl p >
mov Cursor_Col,dh
llamar a SetCursor ;establecer la posición del cursor
mov dl,','
llamar a Output_Chr ;mostrar un carácter p >
@@Next_0: bucle Input_Score
---------------------------- --- --
2. Encuentre el puntaje más alto y el puntaje más bajo y muéstrelos
cld
lea si,List_Score;Dirección del área de almacenamiento de puntajes del estudiante p>
p>
lodsb ;Lee el primer elemento en AL
mov ah,al ;AH=puntuación más alta, AL=puntuación más baja
mov cx,Estudiantes -1
Comparar: cmp al,[si] ;Compara la puntuación más baja actual con el elemento actual
jbe $+4 ;Si es menor o igual, no actualice la puntuación más baja y compárela con la puntuación más alta
mov al,[si] ;La puntuación más baja actual es mayor que el elemento actual, cargue la nueva puntuación más baja
cmp ah ,[si] ;Compare la puntuación más alta actual con el elemento actual
p>
jae $+4 ;Si es mayor o igual a, no actualice la puntuación más alta
mov ah,[si] ;La puntuación más alta actual es menor que el elemento actual, carga la nueva puntuación más alta
inc si ;incrementa en 1, listo para procesar la siguiente puntuación
bucle Comparar
xchg ah,al
push ax
Salida request_Max ;Solicitud para mostrar la puntuación más alta
pop ax p>
empujar hacha
xor ah,ah
llamar a Dec_ASCII ;Mostrar la puntuación más alta
El mensaje de salida_Min muestra la puntuación mínima
pop ax
xchg ah,al
xor ah,ah
call Dec_ASCII ;Mostrar la puntuación más baja
; -------------------------------- --
; 3. Cuente el número de personas en cada puntuación oscila por debajo de 60 puntos, 60-69, 70-79, 80-89, 90-100 y los muestra
llame a Output_CTLF salida Un retorno de carro y salto de línea
llame; Output_CTLF; Genera un retorno de carro y un avance de línea
lea si,List_Score
xor bx,bx;Total
Puntaje inicial
mov dl,10; usado para dividir por 10
mov cx,Estudiantes
@@Estáticas: lodsb; p> xor ah,ah
agregar bx,ax ;puntuación total acumulada
div dl ; dividir por 10
cmp al,5 ;
ja $+4
mov al,5 ; <=5, fallido
sub al,5 ; restar 5, desplazamiento de dirección de recuento de segmentos fraccionarios
p>cbw ;
empujar hacha
pop di
inc Score_Tab[di] ; ; Bucle, cuenta el siguiente puntaje
mov al,Score_Tab[5] ;Obtener el número de personas con 100 puntos
agregar Score_Tab[4],al ;Agregar a los 90- Rango de puntuación de 100
push bx ;Empuja la puntuación total a la pila
mov bl,59h
mov cx,5
lea si,Score_Tab ;Cada primera dirección de la matriz de recuento de segmentos fraccionarios
lea dx, request_Res; Dirección de cadena de resultados estadísticos
List_Res: mov ah,9; >
int 21h
lodsb ;Leer el valor de recuento
xor ah,ah
llamar a Dec_ASCII ;Mostrar resultados estadísticos
call Output_CTLF; Salida de un retorno de carro, avance de línea
mov al,bl
inc al
daa
mov bl,al
push cx
mov cl,4
xor ah,ah
shl ax,cl
shr al ,cl
o ax,3030h
xchg ah,al
mov word ptr Prompt_Res,ax
mov al,bl p>
agregar al,9
mov bl,al
xor ah,ah
shl ax,cl
shr al,cl
o ax,3030h
xchg ah,al
mov word ptr Prompt_Res[5],ax
pop cx
bucle List_Res
;--------------------------------- --—— p>
4. Calcular y mostrar la puntuación promedio
Mensaje de salida_Ave;
mov bl,Estudiantes
pop ax ;Obtiene la puntuación total
div bl ;Toma la parte entera de la puntuación promedio
mov bh, ah ;guardar el resto
xor ah,ah
llamar a Dec_ASCII ;mostrar la puntuación promedio
mov ah,bh ;el resto
mov bh ,bl ;Divisor
mov cx,2 ;Mantener el número de decimales
call Dec_Frac ;Convertir el número binario sin signo en AL como decimal a explícito código ASCII decimal p>
;------------------------------------ de p>
Salida Press_Key
mov ah,1
int 21h
Exit_Proc: mov ah,4ch finalizar programa
int 21h
List_Score: ;Área de almacenamiento de puntuación del estudiante
Código FINALIZA
FIN Inicio ;La compilación termina aquí