Заполнить массив случайными числами с помощью линейного конгруэнтного метода - Assembler
Формулировка задачи:
Здравствуйте! Хочу заполнить массив случайными числами с помощью линейного конгруэнтного метода. Для первых двух чисел последовательности вроде все работает, но при попытке организовать все это в цикле возникают ошибки.
Во-первых, строчки cmp di, len и je exit переходят сразу к концу программы. Во-вторых, первое число выводится неверно (3858 вместо 18), хотя если разместить код вывода числа после строчки mov di, 1, то все работает. Второе число выводится верно, если поменять mov ax, word ptr m_1 на mov ax, word ptr [m_1 + 1]. Подскажите, в чем проблема? Заранее спасибо!
.model small .stack 100h .data len equ 16 m_1 db len dup (?) a db 7 c dw 9 m db 20 ;txt db 'generator', 13, 10, 36 .code start: mov ax, @data mov ds, ax mov m_1, 18 mov di, 1 get_matrix: cmp di, len je exit mov ax, word ptr [m_1 + di - 1] mul a add ax, c mov bl, m div bl xchg ah, al and ah, 0 mov byte ptr [m_1 + di], al inc di jmp get_matrix mov ax, word ptr m_1 push -1 ;Сохраним признак конца числа mov cx,10 ;Делим на 10 l: xor dx, dx ;Очистим регистр dx (xor dx,dx - оптимальнее) div cx ;Делим push dx ;Сохраним цифру cmp ax,0 ;Остался 0? (оптимальнее or ax,ax) jne l ;нет -> продолжим mov ah,2h l2: pop dx ;Восстановим цифру cmp dx,-1 ;Дошли до конца -> выход {оптимальнее: or dx,dx jl ex} je exit add dl, 30h ;Преобразуем число в цифру int 21h ;Выведем цифру на экран jmp l2 ;И продолжим exit: mov ax, 4C00h int 21h end Start
Решение задачи: «Заполнить массив случайными числами с помощью линейного конгруэнтного метода»
textual
Листинг программы
.MODEL TINY .CODE ORG 100h Main: mov al, 0 out 70h, al xor al, al in al, 71h aam 10h aad mov m_1, al aam aad 10h mov di, 1 get_m_1: cmp di, len je con_get mov ax, word ptr [m_1 + di - 1] mul a add ax, c mov bl, m div bl xchg ah, al and ah, 0 mov byte ptr [m_1 + di], al inc di jmp get_m_1 con_get: mov m_2, 7 mov di, 1 get_m_2: cmp di, len je con_get_1 mov ax, word ptr [m_2 + di - 1] mul a add ax, c mov bl, m div bl xchg ah, al and ah, 0 mov byte ptr [m_2 + di], al inc di jmp get_m_2 con_get_1: mov di, 0 get_m_3: cmp di, len je print mov al, [m_1 + di] add al, [m_2 + di] mov [m_3 + di], al inc di jmp get_m_3 print: mov ax, 2 int 10h mov ax, 3 int 10h mov di, 0 print_m_1: cmp di, len je contin mov ax, di mov bl, 4 div bl cmp ah, 0 jne next_col_1 add row, 2 mov col, 2 jmp next_number_1 next_col_1: mov ax, di mov bl, 4 div bl mov al, ah mov bl, 5 mul bl mov col, al add col, 2 next_number_1: mov al, byte ptr [m_1 + di] mov ah, 0 push -1 ;Сохраним признак конца числа mov cx, 10 ;Делим на 10 div_1: xor dx, dx ;Очистим регистр dx (xor dx,dx - оптимальнее) div cx ;Делим push dx ;Сохраним цифру cmp ax, 0 ;Остался 0? (оптимальнее or ax,ax) jne div_1 ;нет -> продолжим pr_1: pop dx ;Восстановим цифру cmp dx, -1 ;Дошли до конца -> выход {оптимальнее: or dx,dx jl ex} je stop_1 add dl, 30h ;Преобразуем число в цифру mov al, dl mov ah, 2 mov bh, 0 mov dh, row mov dl, col int 10h mov ah, 9 mov bx, 0Fh mov cx, 1 int 10h ;Выведем цифру на экран inc col jmp pr_1 ;И продолжим stop_1: inc di jmp print_m_1 contin: mov di, 0 mov row, 0 mov col, 0 print_m_2: cmp di, len je contin_1 mov ax, di mov bl, 4 div bl cmp ah, 0 jne next_col_2 add row, 2 mov col, 2 jmp next_number_2 next_col_2: mov ax, di mov bl, 4 div bl mov al, ah mov bl, 5 mul bl mov col, al add col, 2 next_number_2: mov al, byte ptr [m_2 + di] mov ah, 0 push -1 ;Сохраним признак конца числа mov cx, 10 ;Делим на 10 div_2: xor dx, dx ;Очистим регистр dx (xor dx,dx - оптимальнее) div cx ;Делим push dx ;Сохраним цифру cmp ax, 0 ;Остался 0? (оптимальнее or ax,ax) jne div_2 ;нет -> продолжим pr_2: pop dx ;Восстановим цифру cmp dx, -1 ;Дошли до конца -> выход {оптимальнее: or dx,dx jl ex} je stop_2 add dl, 30h ;Преобразуем число в цифру mov al, dl mov ah, 2 mov bh, 0 mov dh, row mov dl, col add dl, 25 int 10h mov ah, 9 mov bx, 0Fh mov cx, 1 int 10h ;Выведем цифру на экран inc col jmp pr_2 ;И продолжим stop_2: inc di jmp print_m_2 contin_1: mov di, 0 mov row, 0 mov col, 0 print_m_3: cmp di, len je contin_2 mov ax, di mov bl, 4 div bl cmp ah, 0 jne next_col_3 add row, 2 mov col, 2 jmp next_number_3 next_col_3: mov ax, di mov bl, 4 div bl mov al, ah mov bl, 5 mul bl mov col, al add col, 2 next_number_3: mov al, byte ptr [m_3 + di] mov ah, 0 push -1 ;Сохраним признак конца числа mov cx, 10 ;Делим на 10 div_3: xor dx, dx ;Очистим регистр dx (xor dx,dx - оптимальнее) div cx ;Делим push dx ;Сохраним цифру cmp ax, 0 ;Остался 0? (оптимальнее or ax,ax) jne div_3 ;нет -> продолжим pr_3: pop dx ;Восстановим цифру cmp dx, -1 ;Дошли до конца -> выход {оптимальнее: or dx,dx jl ex} je stop_3 add dl, 30h ;Преобразуем число в цифру mov al, dl mov ah, 2 mov bh, 0 mov dh, row mov dl, col add dl, 50 int 10h mov ah, 9 mov bx, 0Fh mov cx, 1 int 10h ;Выведем цифру на экран inc col jmp pr_3 ;И продолжим stop_3: inc di jmp print_m_3 contin_2: mov ah, 2 mov bh, 0 mov dh, 5 mov dl, 22 int 10h mov al, '+' mov ah, 9 mov bx, 0Fh mov cx, 1 int 10h ;+ mov ah, 2 mov bh, 0 mov dh, 5 mov dl, 47 int 10h mov al, '=' mov ah, 9 mov bx, 0Fh mov cx, 1 int 10h ;= aam aad 10h len equ 16 m_1 db 16 dup (?) m_2 db 16 dup (?) m_3 db 16 dup (?) a db 4 c dw 79 m db 21 row db 0 col db 0 END Main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д