Red de conocimiento informático - Conocimiento sistemático - Programa en lenguaje ensamblador para obtener respuestas

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

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

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>

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

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

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

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

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

mov Cursor_Col,dh

llamar a SetCursor ;establecer la posición del cursor

mov dl,','

llamar a Output_Chr ;mostrar un carácter

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

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

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

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

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

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

;------------------------------------ de

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í