Заполнить массив случайными числами с помощью линейного конгруэнтного метода - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Хочу заполнить массив случайными числами с помощью линейного конгруэнтного метода. Для первых двух чисел последовательности вроде все работает, но при попытке организовать все это в цикле возникают ошибки.
.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
Во-первых, строчки cmp di, len и je exit переходят сразу к концу программы. Во-вторых, первое число выводится неверно (3858 вместо 18), хотя если разместить код вывода числа после строчки mov di, 1, то все работает. Второе число выводится верно, если поменять mov ax, word ptr m_1 на mov ax, word ptr [m_1 + 1]. Подскажите, в чем проблема? Заранее спасибо!

Решение задачи: «Заполнить массив случайными числами с помощью линейного конгруэнтного метода»

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы