Red de conocimiento informático - Conocimiento sistemático - Ensamblador

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

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

; 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

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

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

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

; 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

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

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

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

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

FIN Inicio La compilación termina aquí