Ensamblador
; Nombre de la pregunta: ingrese las puntuaciones, ordénelas en orden ascendente y descendente
; Fuente de la pregunta: /question/132061481.html
; Las puntuaciones se basan en el sistema de porcentaje, al ingresar la puntuación, el número máximo es de 3 dígitos, es decir, 100 puntos, si la puntuación es inferior a 100 puntos, presione Entrar para confirmar.
Este programa fue compilado; en el entorno integrado MASMPlus 1.2, depurado y se ejecuta correctamente.
Segmento de código
Supongamos CS: Código, DS: Código
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; -------------------------
; de la dirección especificada (Str_Addr)
; Entrada:
; Str_Addr = dirección de cadena (requiere estar en el segmento de datos)
;
; Ejemplo de uso: Salida PromptStr
Salida MACRO Str_Addr
push ax
lea dx, Str_Addr
mov ah, 9
int 21h
pop ax
EndM
--- ---------; -------------------------------------------------- ----
; Función: Mostrar un carácter
; Entrada: dl=Carácter a mostrar
Output_Chr proc Near
empujar hacha
mov ah, 2
int 21h
pop hacha
ret
Output_Chr Endp p>
; -------- ------------------------------------ --------
; Función: Obtener la posición del cursor
; Entrada: Ninguna
; número
GetCursor Proc Near
PUSH DS
PUSH AX
p>PUSH BX
PUSH CX
PUSH DX
PUSH CS
POP DS
XOR BX, BX
MOV AH, 3 p>
INT 10H
MOV Cursor_Row, DH
MOV Cursor_Col, DL
POP DX
POP CX
POP BX
POP AX
POP DS
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -----
------------------------------------------------ de de 2019-01-2011 p>; Entrada: Cursor_Row=coordenada de fila; Cursor_Col: coordenada de columna)
SetCursor Proc Near
PUSH DS
PUSH DX p>
PUSH CX
PUSH BX
PUSH AX
PUSH CS
POP DS
MOV DH, Cursor_Row
MOV DL, Cursor_Col
XOR BX, BX
MOV AH, 2
INT 10H
POP AX
POP BX
POP CX
POP DX
POP DS
RET
SetCursor EndP
;---------------------------------- --—— p>
; Función: Ingrese un número decimal con un número específico de dígitos (N) en el teclado, conviértalo en un número binario y guárdelo en la unidad de memoria especificada.
; Si se ingresan N dígitos, la entrada finalizará automáticamente; si se ingresan N dígitos, la entrada finalizará con espacios.
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: cs: @@Digits=número de dígitos; es: di=guardar la primera dirección de los dígitos ingresados
; = tipo de datos guardados, B = tipo byte, W = tipo palabra.
; Salir: El número binario convertido se guarda en la unidad señalada por di
Input_Dec Proc Near
push ds
push dx.
empujar cx
empujar bx
empujar di
empujar cs
pop ds
llamar a GetCursor; obtener la posición del cursor
mov dx, WORD PTR Cursor_Row
mov @@Tmp_Cursor, dx guardar la posición inicial del cursor
lea di; , @@Save_Tmp
push di
cld
mov cl, @@Digits
xor ch, ch
push cx
@@Input_Dec: llama a GetCursor; obtiene la posición del cursor
mov ah, 1; acepta un carácter del teclado
int 21h
cmp al, 27; Esc?
jz @@Return
cmp al, CR; que N dígitos
jz @@ASC_Dec; Ir a procesar el número que se ha escrito
cmp al, KBBack
jz @@KB_Back; 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 mayor que el número '9', vuelva a ingresar
jmp @@Save_Dig
@@KB_Back: cmp cl, cs: @@Digits; dígitos decimales Número
jz @@Input_Dec
inc cx
dec di p>
dec Cursor_Col
@@KBBack: llamar a SetCursor; establecer la posición del cursor
jmp @@Input_Dec
@@Save_Dig: y al, 0fh ; convertir a número binario
stosb; guardar
bucle @@Input_Dec; 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 sin ingresar ningún dígito, presione '0' para procesar
dec; cx ; Disminuya el número de dígitos realmente ingresados en 1 y prepárese para ingresar esto. Convierta números de cadena en números binarios
jcxz @@One_Digit
; Si el número ingresado tiene solo un dígito, vaya a guardar el número binario directamente
mov bx, 10
@@Mul_Ten: lodsb
xor ah, ah
agregar ax, bp
mul bx
mov bp, ax
bucle @@Mul_Ten
@ @One_Digit: lodsb
xor ah, ah
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
pop ds
clc
ret
@@Retorno: pop cx
pop di
pop di
pop bx
pop cx
pop dx
pop ds
stc
ret
@@Tmp_Cursor dw ;Iniciar posición del cursor
@@Digits db ? El número de dígitos decimales
@@Type_Data db 'B'; El tipo de datos guardado.
B=tipo de byte, W=tipo de palabra
@@Save_Tmp db 7 dup(?)
Input_Dec EndP
------- - --------------------------------------
; Función: Convertir el número binario 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 actual posición del cursor
Unsi_Dec_ASCII Proc Near
push dx
push bx
push di
mov bx, 10
lea di, @@Temp_Save[5]
mov BYTE PTR [di], '$'
dec di
cld
@@Dividir: xor dx, dx
div bx
o dl, 30h
mov [di], dl p>
dec di
prueba ax, ax
jnz @@Divide
inc di
push di
pop dx
mov ah, 9
int 21h
pop di
pop bx
pop dx
p>ret
@@Temp_Save db 6 dup(?)
Unsi_Dec_ASCII EndP
; ---- ------- --------------------------------
Input_Score proc Cerca
mov @@Digits, 3; Número de dígitos decimales
mov @@Type_Data, 'B';
B=tipo de byte, W=tipo de palabra
lea di, Buffer; dirección de almacenamiento de puntajes
Salida Prompt_Str; solicitud para ingresar puntajes
@@Input_Scores: llamar Input_Dec; ingrese un número decimal con un número específico de dígitos (N) desde el teclado, conviértalo en un número binario y guárdelo en la unidad de memoria especificada
pushf
inc Cursor_Col.
llamar a Setcursor
mov dl, 20h
llamar a Output_Chr; mostrar un espacio
popf
jnc @ @Input_Scores
mov cx, di
sub cx, offset Buffer; número de puntuaciones
mov Counter, cx save
ret;
Input_Score Endp
-----------------------
Increase_Sort proc Near
mov BYTE ptr @@Compare[5], 76h
jmp @@Sorting
Increase_Sort Endp
;----------------------------------------- de ------ -------
Decrease_Sort proc Near
mov BYTE ptr @@Compare[5], 73h
@@Clasificación: lea si, Buffer
mov cx, Contador; número de partituras
dec cx; Número de bucles externos
cld
@@Escaneo: push cx ; Número de bucles externos guardados en la pila
push si ;Empuje la dirección de la matriz a la pila
@@Compare: mov di, si ;Asigne la dirección del elemento de matriz actual al registro de índice de destino para intercambio
lodsb ;Colocar los elementos de lectura de la matriz actual en el acumulador
cmp al, [si] Comparar el elemento de la matriz actual con el siguiente elemento de la matriz adyacente
lodsb ; p>
jae @@NextOne; si es mayor o igual, no hace nada Intercambio de datos, procesa el siguiente elemento de la matriz
xchg al, [si]; elemento
stosb; guarda el valor más pequeño
@ @NextOne: bucle @@Compare; procesa el siguiente elemento de la matriz
pop si; la pila
pop cx; saca el número de bucles externos de la pila
loop @@Scanning siguiente comparación
mov WORD ptr Cursor_Row, 12 p>
llamar a SetCursor; establecer la posición del cursor
lea si, Buffer
mov cx, Counter into;
Número de puntuaciones
@@List_Scores: lodsb
xor ah, ah
llame a Unsi_Dec_ASCII; convierta el número binario sin signo en AX en código ASCII decimal explícito y enviado a la pantalla de visualización
mov dl, 20h
llamada Output_Chr
bucle @@List_Scores
ret
p>Disminuir_Ordenar Fin
----------------------- -----
Prompt_Menu db 35 dup(20h), 'Menú principal', 13, 10
db 30 dup(20h), 201, 18 dup(205), 187, 13, 10
db 30 dup(20h), 186,' 1. puntuaciones de entrada ', 186, 13, 10
db 30 dup(20h), 186,' 2. aumentar clasificación ', 186, 13, 10
db 30 dup(20h), 186,' 3. disminuir ordenación ', 186, 13, 10
db 30 dup( 20h), 186, ' 0. Volver a DOS ', 186, 13, 10
db 30 dup(20h), 200, 18 dup(205), 188, 13, 10
db 32 dup( 20h), 'Elección(0-3): $'
Cursor_Tmp dw ?
Contador dw ;Número de calificaciones
Proc_Addr dw Input_Score, Incrementar_Ordenar, Decrease_Sort
Prompt_Str db 13, 10, 10, 'Ingrese puntuaciones:', 13, 10, '$'
Press_Key db 7, 13, 12 dup(10), ' El compilado. Presione cualquier tecla para salir...$'
Inicio: presione cs
pop ds; haga que el segmento de datos y el segmento de código sean el mismo segmento
Inicio: push cs
pop ds; p>
mov ax, 3; establece el modo de visualización de 25*80 caracteres
int 10h
Salida Prompt_Menu; muestra el menú principal
xor bx, bx
mov ah, 3
int 10h
mov Cursor_Tmp, dx p>
mov ax, 0b800h
mov es, ax; Establecer la dirección de la sección del búfer del modo de visualización de caracteres
mov di, 35*2 1
mov al, 13; Magenta claro
mov cx, 10
cld
Atributo: stosb
inc di
Atributo de bucle
mov di, 160*2 32*2 1
stosb
add di, 159
stosb
agregar di, 159
stosb
agregar di, 159
stosb
mov di, 160*7 39*2 1
stosb
inc di
stosb
inc di
stosb
push cs
pop es; haga que la sección adicional sea la misma que la sección de código
Choice_Func: mov dx, Cursor_Tmp
xor bx, bx
mov ah, 2
int 10h
mov ah, 1
int 21h
cmp al, ' 0'
jz Exit_Proc
cmp al,'1'
jb Choice_Func
cmp al,'3'
ja Choice_Func
y ax, 0fh
mov bx, ax
dec bx
shl bx, 1
llamar a Proc_Addr[bx]
jmp Choice_Func
----------------------- - ------------
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 programa
int 21h
Búfer de datos db?; >Código FINALIZA p>
FIN Inicio La compilación termina aquí