Red de conocimiento informático - Consumibles informáticos - Una puntuación alta me ayuda a crear un programa en lenguaje ensamblador: estadísticas de rendimiento de los estudiantes

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

-----------------------; --------

; 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

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

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

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

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)

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

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

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

; 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í