Red de conocimiento informático - Conocimiento sistemático - Programación en lenguaje ensamblador

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

pop dx

pop ax

ret

Output_CTLF endp

--------- ---------------------------

; 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

;-----------------------------------——

; 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

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

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

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, '.'

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>@@Co

mpare: 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, ax

mov 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

FIN Inicio La compilación termina aquí