Una puntuación alta me ayuda a crear un programa en lenguaje ensamblador: estadísticas de rendimiento de los estudiantes
; Instrucciones de operación del programa:
; 1. La definición de este programa: el nombre puede tener hasta 20 caracteres, la identificación del estudiante puede tener hasta 10 caracteres y la calificación. puede tener hasta 3 dígitos
2. Al ingresar la información del estudiante, finalizará automáticamente cuando haya suficiente información; cuando no haya suficientes dígitos, presione la tecla Enter para finalizar; 3. Al ingresar el nombre, si presiona Enter directamente, significa el final Ingrese la información del estudiante e ingrese el procesamiento de la información
Este programa se compiló en el entorno integrado MASMPlus 1.2, se depuró y se ejecutó 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: Obtener la posición del cursor
; Entrada: Ninguna
; número
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
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
;------------------------------------- --- de 2019-01-08 Función: Establecer posición del cursor
Entrada: Cursor_Row=coordenadas 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
SetCursor EndP
-- -------------------------------------------------- ----------------- de del 2019-01-08 Función: Ingrese una posición específica en el teclado Número de dígitos decimales, conviértalo en un número binario y guárdelo en el 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
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
empujar dx
empujar cx
empujar bx
empujar di p>
lea di,@@Save_Tmp
push di
cld
mov cl,@@Digits
xor ch ,ch
push cx
@@Entrada: llamar a GetCursor ;Obtener la posición del cursor
mov ah,1 ;Aceptar un carácter del teclado
int 21h
cmp al,CR ;Si escribe un retorno de carro, el número que se ha 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', vuelve 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
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 p>
sub cx,ax ;número de dígitos realmente ingresado
xor bp,bp
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;Si presiona Enter directamente sin ingresar ningún dígito, presione '0' para procesar
dec cx ;El número de dígitos realmente ingresados se reduce en 1 y está listo para ingresar Convertir esta cadena de números en números binarios
jcxz @@One_Digit Si el número ingresado es solo uno; dígito, guarde el número binario directamente
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,bp
mul bx
mov bp,ax
bucle @@Mul_Ten
@@One_Digit: lodsb
cbw
agregar ax,bp
@@Save_Ret: pop di
cmp @@Type_Data,'B' ;¿Tipo de byte?
> jz $+5
stosw
jmp $+3
stosb
pop bx
pop cx
pop dx
ret
@@Digits db ;Número de dígitos decimales
@@Type_Data db 'B' ;Guardar tipo de datos.
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 reservados
; >; 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
--------------------- -------------- -
Nombre_Longitud equ 20;Longitud del nombre
ID_Longitud equ 10;Longitud del número de estudiante
Info_Estudiantes estructura
; Tipo de estructura de información del estudiante
Nombre_Estudiante db Nombre_Longitud dup(?) ;Nombre
ID_Estudiante db ID_Longitud dup(?) ;Número de estudiante
Puntuación_Estudiante db ;
Info_Estudiantes Finaliza
------------------------------ ---; -
Prompt_Str db 7,'Name',Name_Length-4+2 dup(20h) ;Cadena de título del nombre
db 'Student ID',2 dup(20h );Número de estudiante cadena de título
db 'Score',CR,LF ;cadena de título de partitura
db Name_Length dup('-'),2 dup(20h) p>
db ID_Length dup('-'),2 dup(20h)
db 5 dup('-'),CR,LF,'$'
Temp_Cursor dw ;Ingresar y mostrar la posición del cursor de la información del estudiante
prompt_Ave db CR,LF,'Average: $' ;Pregunta para mostrar el puntaje promedio
Buffer_Data db ?,?,Name_Length+2 dup (? ) ;Búfer de entrada de nombre, número de estudiante
Press_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
mov @@Digits, 3 ;Número de dígitos decimales
mov @@Type_Data,'B' ;Tipo de datos guardados.
B=tipo de byte, W=tipo de palabra
; ----
; nombre para mostrar, número de estudiante, título de grado, solicitud para ingresar la información del estudiante
Salida Prompt_Str
llamar a GetCursor; obtener la posición del cursor
p>p>
mov Temp_Cursor,dx ;Guarda la entrada y muestra la posición del cursor de la información del estudiante
; ------- ----------------
; Ingrese el nombre del estudiante, su identificación y su puntaje
lea di ,Score_Table;Nombre, ID de estudiante, dirección de almacenamiento de puntajes
Input_Name: llamar a GetCursor ;Obtener la posición del cursor
mov Buffer_Data,Name_Length+1 ;El número máximo de caracteres permitidos para ingresar
push di
lea di,Buffer_Data[2]
mov cx,(Name_Length+2)/2
mov ax, 2020h ;rellenar espacios
rep stosw
pop di
lea dx,Buffer_Data; Nombre dirección de búfer de entrada
mov ah,0ah
int 21h
lea si,Buffer_Data[1]
lodsb ;Lee el número real de caracteres ingresados
test al,al
jz @@L1 ;Si ingresa un estudiante Al ingresar un nombre, presione Enter directamente. Se considera que se completa el ingreso del nombre del estudiante, número de estudiante, calificaciones, etc., y el cálculo. se lleva a cabo para calcular el número de estudiantes ingresados
mov cx,Name_Length; número de caracteres del nombre
rep movsb ;Escribir búfer de información del estudiante
agregar Cursor_Col, Name_Length+2 ;Agregue el número de columna a la longitud del nombre y agregue 2 para comenzar a ingresar el número del estudiante
call SetCursor ;Establezca la posición del cursor
push di
lea di, Buffer_Data[2]
mov cx,(Name_Length+2)/2
mov ax,2020h ;llenar espacio
rep stosw
pop di
lea dx,Buffer_Data ;número de estudiante dirección de búfer de entrada
mov ah,0ah p>
int 21h
lea si, Buffer_Data[2]
mov cx,ID_Length; número de caracteres en el número de estudiante
rep movsb; escribe el buffer de información del estudiante
add Cursor_Col,ID_Length+2; Agregue el número de columna y la longitud del número de estudiante y agregue 2 para comenzar a ingresar resultados
llame a SetCursor; establezca la posición del cursor
llame a Input_Digit; ingrese calificaciones
llamar a Output_CTLF; generar un retorno de carro y un salto de línea
jmp Input_Name; ingresar la siguiente información del estudiante
; ---------------------
; Calcular el número de estudiantes ingresados
@@L1: mov ax,di
sub ax,offset Score_Table ;Capacidad de memoria ocupada por toda la información de los estudiantes
mov bl ,escriba Info_Estudiantes ;Capacidad de memoria ocupada por la información de cada alumno
div bl
mov cx,ax ;CX=número de alumnos ingresados
test cx,cx
jnz @@L00
jmp Exit_Proc ;Si no se ingresa información, finalice el programa directamente
-----------; - ------------------------------------
; Crear una lista de información de estudiantes
@@L00: push di ;Guardar dirección de lista vinculada
lea ax,Score_Table ;Dirección inicial de información del estudiante
push cx
@@L2: stosw ;Guardar dirección de información del estudiante
agregar ax,escribir Info_Students;Capacidad de memoria ocupada por la información de cada estudiante
bucle @@L2
pop cx
pop si;Abre la lista vinculada La dirección es si
cmp cx,2
jb Exit_Proc Si solo se ingresa la información de un estudiante, hay no es necesario ordenar y mostrar los resultados
-- -------------------------------- -----------------------
; Utilice el método de clasificación de burbujas para ordenar Ordenar en orden descendente
push si ; empuje la dirección de la lista vinculada a la pila
push cx; guarde el número de estudiantes
dec cx; prepárese para ordenar por método de clasificación de burbujas
@@; Clasificación: presione cx; presione en la pila para guardar el número de bucles externos
presione si; presione en la pila para guardar la dirección de la matriz
@@Comparar: presione si p>
pop di ;Asigne la dirección del elemento de matriz actual al registro de índice de destino para el intercambio
lodsw ;Lea la dirección de información actual del estudiante en AX
mov bx,ax
mov al,[bx.Score_Student] ;Leer la puntuación actual del estudiante en AL
mov bx,[si] ;Dirección de información del siguiente estudiante adyacente
cmp al ,[bx.Score_Student] ;Compara la puntuación del estudiante actual con la puntuación del siguiente estudiante adyacente
jae @@NextOne ;Si es mayor o igual a, no se realiza ningún intercambio de datos y se procesa el siguiente elemento de la matriz
mov ax,[di] ;Si es menor, lee el nodo actual de la lista de información del estudiante
xchg ax,[si] ;Intercambia elementos de la lista vinculada
mov [di ],ax ;Guardar la dirección del nodo con el valor mayor
@@NextOne: bucle @@Compare ;Procesar el siguiente elemento de la matriz
pop si ;Extraer la dirección de la matriz de la pila
pop cx ;Extrae el recuento de bucles externos
loop @@Sorting ;Siguiente comparación
llama a Output_CTLF
; ----- ---------------------------------
>
; Mostrar toda la información del estudiante en orden descendente de calificaciones
Salida Prompt_Str; Mostrar el título de la información del estudiante
llamar a GetCursor
mov Temp_Cursor; ,dx ;Guarda la posición del cursor para mostrar la información del estudiante
pop cx ;Aparece el número de estudiantes
pop si ;Aparece la dirección de la lista vinculada
push cx ;Guardar el número de estudiantes
xor bx,bx ;Valor inicial de la puntuación total
@@List_Info: push cx ;Guardar el número de estudiantes
llamar a GetCursor ;Obtener la posición del cursor
lodsw ;Leer un nodo en la lista vinculada
push si ;Empujar en la pila para guardar la dirección de la lista vinculada
mov si,ax
push si ;Empuje en la pila para guardar la dirección de información del estudiante
lea si,[si.Name_Student] ;Nombre dirección
mov cx,Name_Length ;Longitud de la cadena del nombre
@@Dsip_Name: lodsb ;Leer un carácter
cmp al,0dh ;
jz @@L3 ;Sí, la visualización del nombre finaliza
mov dl,al
call Output_Chr ;Muestra un carácter
bucle @ @Dsip_Name ;Siguiente carácter
@@L3: agregue Cursor_Col,Name_Length+2 ;Número de columna más longitud del nombre más 2 para comenzar a mostrar el número de estudiante
llame a SetCursor ;Establezca la posición del cursor
p>
pop si ; ventana emergente con la dirección de información del estudiante
push si ; empujar a la pila para guardar la dirección de información del estudiante
lea si,[si.ID_Student] ;dirección de identificación del estudiante
mov cx,ID_Length ;Longitud de la cadena del nombre
@@Dsip_ID: lodsb ;Leer un carácter
cmp al,0dh ;¿Carácter de retorno de carro?
jz @@L4 ;Sí, la visualización del número de estudiante ha finalizado
mov dl,al
call Output_Chr ;Mostrar un carácter
bucle @@Dsip_ID ;Siguiente carácter
@@L4: agregar Cursor_Col,ID_Length+2 ;Número de columna más longitud del número de estudiante más 2 para comenzar a mostrar resultados
llamar a SetCursor ;Establecer ubicación del cursor
pop si;dirección emergente de información del estudiante
lea si,[si.Score_Student];dirección de puntaje
lodsb;leer puntajes
xor ah,ah
agregar bx,ax ;Acumular puntuación total
llamar a Dec_ASCII ;Convertir el número binario sin signo en AX en código ASCII decimal explícito y enviar La pantalla muestra
llamar a Output_CTLF
pop si; muestra la dirección de la lista vinculada
pop cx; muestra el número de estudiantes
bucle @@List_Info; Siguiente nodo (información del estudiante)
llamar a Output_CT
LF
;------------------------------------- de LF p>
; Calcular y mostrar la puntuación promedio
Salida request_Ave Solicitar mostrar la puntuación promedio
mov ax,bx
pop; bx; muestra el número de estudiantes
div bl ;Toma la parte entera de la puntuación promedio
mov bh,ah ;Guarda el resto
xor ah ,ah
call Dec_ASCII ;Muestra la puntuación promedio
mov ah,bh ;resto
mov bh,bl ;divisor
mov cx,2 ;lugares decimales restantes
call Dec_Frac ;Convierte el número binario sin signo en AL como decimal en código ASCII decimal explícito
---------- -------------- -----------------
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
mov ah,4ch ;Finalizar programa
int 21h
Score_Table: ;Área de almacenamiento de puntajes de los estudiantes
Código FINALIZA
FIN Inicio ;La compilación termina aquí