Red de conocimiento informático - Conocimiento sistemático - Experto en montaje, ayúdame, alguien va a morir.

Experto en montaje, ayúdame, alguien va a morir.

; Nombre de la pregunta: Método de congruencia para generar un conjunto de números aleatorios

; Fuente de la pregunta: /question/129800729.html

; MASMPlus 1.2 Después de la compilación y depuración en el entorno, se ejecuta 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: mostrar, generar un retorno de carro, avance de línea

Output_CTLF proc Near

push ax

push dx

mov ah, 02h

mov dl, 0dh

int 21h

mov dl, 0ah

int 21h

pop dx

pop ax

ret

p>

Output_CTLF Endp

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

Función: Convertir el número binario sin signo en AX en código ASCII decimal explícito y enviarlo a la pantalla de visualización

Entrada: AX=número binario

Salir: Muestra el número de código ASCII convertido en la posición actual del cursor

Unsi_Dec_ASCII Proc Near

empujar dx

empujar bx

empujar 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

@@Dividir

inc di

push di

pop dx

mov ah, 9

int 21h

pop di

pop bx

pop dx

ret

@@Temp_Save db 6 dup(? )

Unsi_Dec_ASCII EndP

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

; Función: Genera un conjunto de números aleatorios N(1lt; Nlt;=50) según el método de congruencia, fórmula: R=(R0*29 7) mod 50

; Parámetro de entrada: DH=50 (módulo) DL=semilla de número aleatorio

; Parámetro de salida: DL=nuevo número aleatorio

Proc. aleatorio cercano

mov al, 27

mul dl

agregar hacha, 17

div dh

mov dl, ah (número aleatorio; )

ret

Final aleatorio

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

Estudiantes equ 45; número de estudiantes

Sujetos equ 5; Calificaciones db 6 dup(0); Recuento de cada segmento fraccionario

Prompt_Str db 'Total: $'

Press_Key db 7, 13, 10, 13, 10, 'El compilado. Presione cualquier tecla para salir...$'

Inicio: push cs

pop ds

push cs

pop es; el segmento de datos, la sección adicional es la misma que la sección de código

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

Generar un conjunto de números aleatorios N (1lt; Nlt; = 50) según el método de congruencia, y asignar las calificaciones de 5 cursos a 45 estudiantes según N 50

>

@@Aleatorio: xor ax, ax

int 1ah; toma el número de ticks del reloj del sistema

cmp dl, 49

ja @@ Aleatorio; mayor que 49, Valor no válido, tomar de nuevo

mov dh, módulo 50

mov cx, Estudiantes*Puntuaciones totales de 45 estudiantes en 5 cursos

lea di, Buffer; dirección de almacenamiento de puntuación

cld

Puntuación: mov al, dl; semilla de número aleatorio

add al, 50; para generar puntuaciones de los estudiantes

stosb ; guardar resultados

llamar a Random ; generar un conjunto de números aleatorios N (1lt; Nlt; =50) según el método de congruencia

bucle Sc

>

; Calcule el puntaje promedio de cada estudiante

push di; inserte la dirección del puntaje promedio en la pila

lea si, Buffer; > mov cx , Estudiantes; número de estudiantes

Promedio: push cx

mov cx, Número de cursos

xor bx, bx; puntuación total

xor ah, ah

Suma: lodsb

suma bx, ax, suma las puntuaciones de cada materia

bucle; Sumar

mov ax, bx

mov bl, Materias

div bl

stosb guardar la puntuación promedio de un estudiante

pop cx

p>

bucle Promedio

pop si; Dirección emergente de puntuación promedio

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

; Cuente el número de estudiantes en cada nivel de la clase según la puntuación promedio (A: 90~100, B: 80~89, C: 70~79, D: 66~69, E: 60~65, F: menos de 60 puntos)

mov dl, 10; usado para dividir 10

mov cx, Estudiantes ; Número de estudiantes

@@ Estática: lodsb; Extraer calificaciones

xor ah, ah

div dl; Dividir 10

cmp al , 5; gt; pasando

jg $ 4

mov al, 5; =5, fallando

sub al, 5; menos 5. Desplazamiento de dirección de recuento de segmentos fraccionarios

xor ah, ah

push ax

pop bx

inc Grades[bx] ; Count

loop @@Statics; Bucle, cuenta el siguiente grado

mov al, Grades[5]; Tome el número de personas con 100 puntos

agregue Calificaciones [4], agregue al segmento fraccionario 90-100

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

; Muestra el número de estudiantes en cada nivel según el puntaje promedio (A: 90~100, B : 80~89, C: 70~79, D: 60~69, E: 60 puntos por debajo)

Salida Prompt_Str; Solicitud para mostrar el número total de estudiantes

mov ax; , Estudiantes; Número de estudiantes

llame a Unsi_Dec_ASCII; Convierta el número binario sin signo en AX a código ASCII decimal explícito y lo envíe a la pantalla de visualización

lea si, Grades[4]; Dirección de resultados de nivel A

mov

dh, 'A'; valor inicial de la calificación

mov cx, 5; número de calificaciones

List_Grades: llame a Output_CTLF para generar un retorno de carro y un salto de línea

mov dl, dh

llamar a Output_Chr; mostrar un carácter

mov dl, ':'

llamar a Output_Chr; > std

lodsb; leer el número de personas en un nivel

xor ah, ah

llamar a Unsi_Dec_ASCII

inc dh

bucle Lista_Calificaciones

----------------------------------- ----- of--

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; Fin del programa

int 21h

Puntajes de 45 estudiantes en 5 cursos

Código FINALIZA

FIN Inicio ; Compilar hasta Esto termina