Programación en lenguaje ensamblador
; Este programa fue compilado bajo el entorno integrado MASMPlus 1.2, depurado y ejecutado 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: Obtener la posición del cursor
; Ninguno
; Salir: DH=número de fila, DL=número de columna
GetCursor Proc Near
PUSH AX
PUSH BX
p>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 ?
GetC
ursor FinP
;-----------------------------------—— p >
; Función: Establecer la 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 p >
RET
Establecer cursor EndP
--------------------- ------; ---
; Función: Ingrese un número decimal con dígitos específicos en el teclado, conviértalo en un número binario y guárdelo en la unidad de memoria especificada.
Dado que el tipo de datos máximo se limita a palabras, el número máximo de dígitos es: 5 y el número máximo sin signo es: 65536
; considerado como un número 0
Entrada: @@Digits=número de dígitos; di=guardar la primera dirección de los dígitos ingresados
; =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
@@Input: llama a GetCursor; obtiene la posición del cursor
mov ah, 1; >
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; procesar el número que se ha escrito
cmp al, KBBack
jz @@KB_Back si se devuelve la clave vacía, volver 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 inferior al 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 @@Entrada; aceptar el siguiente número
@@ASC_Dec: mov ax, cx
pop cx
pop si p>
sub cx, ax el número de dígitos realmente ingresados
xor bp, bp
xor dx, dx
xor ax, ax
jcxz @@Save_Ret Si presiona Enter directamente y no ingresa ningún dígito, se procesará como entrada '0; '
dec cx ; Disminuye el número de dígitos realmente ingresados en 1 y prepárate para ingresar Convertir esta cadena de números en números binarios
jcxz @@One_Digit; solo un dígito, guarde el número binario directamente
mov bx, 10
@@Mul_Ten: lodsb
cbw
add ax, pb
mul bx
mov bp, ax
loop @@Mul_Ten
@@One_Digit: lodsb
p>
cbw
agregar hacha, bp
@@Save_Ret: pop di
cmp @@Type_Data, tipo de byte 'B';
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'; tipo de datos guardados.
B=tipo de byte, W=tipo de palabra
@@Save_Tmp db 16 dup(?)
Input_Digit EndP
------- - ----------------------------------------------
; Función: Estadísticas superiores a 90, 80~89, 70~79, 60~69, el número de estudiantes por debajo de 60
Parámetro de entrada: AX=score
Statics_Score; Proc Near
push di
push dx
push ax
mov dl, 10 divisor
div; dl; dividir por 10
cmp al, 5; gt 5, pasó
ja $ 4
mov al, 5;=5, falló
sub al, 5; menos 5, compensación de dirección de recuento de sección fraccionaria
cbw;
push ax
pop di
inc Score_Tab[di]; recuento
pop ax
pop dx
pop di
ret
Statics_Score EndP
----------------------------------- ----------------------- de Convertir el número sin signo en código ASCII decimal explícito y enviarlo a la pantalla
; AX=número binario
; Salir: muestra el ASCII convertido en la posición actual del cursor Número de código
Dec_ASCII Proc Near
push dx
empujar bx
empujar di
mov bx, 10
lea di, @@Temp_Save[6]
mov BYTE ptr [ di], '$'
dec di
@ @Divide: xor dx, dx
div bx
o dl, 30h
mov [di], dl
dec di
test ax, 0ffffh
jnz @@Divide
inc di
push di
pop dx
p>
mov ah, 9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 dup(?)
Dec_ASCII EndP
; -------------
--------------------------
; Función: Convertir el número binario sin signo en AL como decimal en un decimal explícito código ASCII,
y enviado a la pantalla de visualización, sin considerar redondeo
Entrada: AH=número binario, BH=divisor, CX=decimales reservados
; Salir: muestra el número de código ASCII convertido en la posición actual del cursor
Dec_Frac Proc Near
push ax
mov dl, '.' p>
llamar a Output_Chr; mostrar un punto decimal
pop ax
mov bl, 10; multiplicador
@@Dec_Frac: mov al, ah; Si 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 uno; lugar decimal del resultado
p>
o al, 30h
mov dl, al
call Output_Chr muestra un lugar decimal
bucle @@Dec_Frac
ret
Dec_Frac EndP
------------------; ------ ---------
ID_Length equ 6; Longitud del número de estudiante
Info_Students Tipo de estructura de información del estudiante
ID_Student db ID_Length dup(?); ID de estudiante
Score_Student db?; Score
Info_Students EndS
; -------- --------------------
Estudiantes equ 20; número de estudiantes
Prompt_Str db 'Student ID', 2 dup(20h); Cadena de título del número de estudiante
db 'Score', CR, LF ; Cadena de título de puntuación
db 10 dup('-') , 2 dup(20h)
db 5 dup('-'), CR, LF, '$'
Score_Tab db 6 dup(0); recuento de cada segmento de puntuación
prompt_Res db '00 ---59: $'
prompt_Ave db CR, LF, 'Average: $'; Pregunta para mostrar la puntuación promedio
Buffer_Data db ?, ?, ID_Length 2 dup(?); buffer de entrada de número de estudiante
Press_Key db CR, LF, CR, LF, 'Presione cualquier tecla para salir...$'
Inicio: push 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; dígitos decimales Número
mov @@Type_Data, 'B';
tipo de datos.
B=tipo de byte, W=tipo de palabra
; ------ -------------------------------------------- -
; Ingrese el número de estudiante y las calificaciones
lea di, Score_Table; número de estudiante, dirección de almacenamiento de puntaje
mov cx, número de estudiantes
cld
Input_Info: push cx
llamar a GetCursor; obtener la posición del cursor
push di
lea di, Buffer_Data[ 2]
mov cx, (ID_Length 2)/2
mov ax, 2020h; rellenar espacios
rep stosw
pop di
mov Buffer_Data, ID_Length 1; número máximo de caracteres permitidos para ingresar
lea dx, Buffer_Data; dirección del búfer de entrada del número de estudiante
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; ; escriba el búfer de información del estudiante
agregue Cursor_Col, 12
llame a SetCursor
llame a Input_Digit; llame a Output_CTLF; genere un retorno de carro y un avance de línea
pop cx
loop Input_Info Ingrese la siguiente información del estudiante
; --------------------- -
; Crear lista vinculada de información de estudiantes
mov cx, Número de estudiantes;
mov si, di; guardar dirección de lista vinculada
lea ax, Score_Table dirección inicial de información del estudiante
@@L1: stosw; /p>
agregue ax, escriba Info_Students Capacidad de memoria ocupada por la información de cada estudiante
loop @@L1
------------ ---------------- ---
; Utilice el método de clasificación de burbujas para ordenar por calificaciones en orden descendente
mov cx, Estudiantes; número de estudiantes
push si; empuja la dirección de la lista vinculada a la pila
push cx; guarda el número de estudiantes
dec cx; método de clasificación de burbujas
@@Clasificación: empujar cx; empujar a la pila para guardar el número de bucles externos
empujar si empuja la dirección de la matriz a la pila
<; p>@@Compare: push si
pop di; asigna la dirección del elemento de matriz actual al registro de índice de destino para fines de intercambio
lodsw; lee la dirección de información actual del estudiante en AX
<; p> mov bx, axmov al, [bx.Score_Student]; Leer la puntuación actual del estudiante en AL
mov bx, [si] Siguiente dirección de información del estudiante adyacente; p>
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, no se tomará ninguna acción. intercambio, procesa el siguiente elemento de la matriz
mov ax, [di]; si es menor, lee el nodo de la lista vinculada de información actual del estudiante
xchg ax, [si]; elementos
mov [di], ax; guarda la dirección del nodo con el valor mayor
@@NextOne: bucle @@Compare; > pop si ;Extrae la dirección de la matriz de la pila
pop cx ;Extrae el número de bucles externos de la pila
loop @@Sorting ;Siguiente comparación
llamar a Output_CTLF
;---------------------------------- -- ——
; Muestra toda la información de los estudiantes en orden descendente de calificaciones
Salida Prompt_Str; Muestra el título de la información del estudiante
pop cx; /p>
pop si; dirección de lista vinculada emergente
xor bx, bx; valor inicial de la puntuación total
@@List_Info: push cx;
llamar a GetCursor; obtener la posición del cursor
lodsw; leer un nodo de la lista enlazada
empujar si a la pila para guardar la dirección de la lista enlazada
mov si, ax
push si; empujar a la pila para guardar la dirección de información del estudiante
lea si, [si.ID_Student]; /p>
mov cx, ID_Length; longitud de la cadena de identificación del estudiante
@@Dsip_ID: lodsb ;Leer un carácter
cmp al, 0dh;
jz @@L2 ; Sí, final de la visualización del número de estudiante
mov dl, al
call Output_Chr; loop @@Dsip_ID; Siguiente carácter
@@L2: agregar Cursor_Col, 12
llamar a SetCursor; establecer la posición del cursor
pop si;
lea si, [si.Score_Student]; dirección de puntuación
lodsb; leer puntuaciones
xor ah, ah
agregar bx, hacha; puntuación total acumulada
llame a Statics_Score; cuente el número de personas en cada segmento de puntuación
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 de visualización. p >
llamar a Output_CTLF
pop si; muestra la dirección de la lista vinculada
pop cx; muestra el número de estudiantes
loop @@List_Info; ; siguiente nodo (información del estudiante)
mov al, Score_Tab[5]; toma el número de personas con 100 puntos
agrega Score_Tab[4], al; Rango de puntuación de 100
; --------------------------------------- ------------------------------------------------- de a push bx; push bx; empujar a la pila y guardar Puntuación total
llamar a Output_CTLF
llamar a Output_CTLF
mov bl, 59h
mov cx, 5
lea si, Score_Tab; Primera dirección de cada matriz de recuento de segmentos de puntuación
lea dx, Prompt_Res Dirección de cadena de resultado estadístico
List_Res: mov ah, 9; muestra información de solicitud del segmento de puntuación
int 21h
lodsb; valor de recuento de lectura
xor ah, ah
call Dec_ASCII; muestra resultados estadísticos
llama a Output_CTLF; genera un retorno de carro y un salto de línea
mov al, bl
inc al
daa
mov bl, al
p>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
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], hacha
pop cx
bucle List_Res
-------------------; ----------- ---
; Calcular y mostrar la puntuación promedio
call Output_CTLF
call
Output_CTLF
Mensaje de salida_Ave; mensaje para mostrar el puntaje promedio
pop ax; apareció el puntaje total
mov bx, Número de estudiantes
div bl; toma la parte entera de la puntuación promedio
mov bh, ah; guarda el resto
xor ah, ah
llama a Dec_ASCII; la puntuación media
mov ah, bh; resto
mov bh, bl; divisor
mov cx, 2; > call Dec_Frac; put AL El número binario sin signo se convierte en un código ASCII decimal explícito como decimal
; --- -------------
Exit_Proc: Salida Press_Key; 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
Score_Table: área de almacenamiento de puntuación del estudiante<; /p>
Código FINALIZA p>
FIN Inicio La compilación termina aquí