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