MadCortez

Untitled

Mar 28th, 2021
381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         org 100h
  2.  
  3.  
  4. start:
  5.                 ;вывод текста в консоль
  6.                 mov ah,9h
  7.                 mov dx, str1
  8.                 int 21h
  9.  
  10.                 mov ah, 09h
  11.                 mov dx, inputA          ;предложение ввода А
  12.                 int 21h
  13.  
  14.                 mov ah, 0ah
  15.                 mov dx, strA            ;вводим первое число А
  16.                 int 21h
  17.  
  18.                 mov bx, dx              ;помещаем в bx ссылку на строку в качестве передачи регистра как параметра процедуры
  19.                 call count_number       ;извлекаем из строки число А
  20.                 ;push ax                 ;результат из регистра ах помещаем в стек
  21.                 mov [A], ax
  22.  
  23.                 mov ah, 02h
  24.                 mov dx, 0x0D0A
  25.                 int 21h
  26.  
  27.                 mov ah, 09h
  28.                 mov dx, inputB          ;предложение ввода В
  29.                 int 21h
  30.  
  31.                 mov ah, 0ah
  32.                 mov dx, strB            ;вводим второе число В
  33.                 int 21h
  34.  
  35.  
  36.                 mov bx, dx
  37.                 call count_number       ;извлекаем из строки число В
  38.                 ;push ax                 ;результат из регистра ах в стек
  39.                 mov [B], ax
  40.  
  41.                 ;переход на новую строку
  42.                 mov ah,9h
  43.                 mov dx, new_line
  44.                 int 21h
  45.  
  46.                 ;вывод текста в консоль
  47.                 mov ah, 9h
  48.                 mov dx, str2
  49.                 int 21h
  50.  
  51.                 call get_result         ;получаем результат вычислений
  52.  
  53.                 mov ax, [res]           ;перемещаем в ах результат для последующего вывода ответ
  54.                 call output_number      ;вывод ответа
  55.  
  56.                 pop ax                  ;чистим стек
  57.                 pop ax
  58.  
  59.                 mov ah, 08h
  60.                 int 21h                 ;конец основной части программы
  61.                 ret
  62.  
  63. count_number:                    ;процедура получения числа из строки
  64.                 xor ax, ax      ;обнуляем ах
  65.                 xor dx, dx      ;обнуляем dx
  66.  
  67.                 add bx, 1h      ;передвигаем адрес строки на 1
  68.                 mov cl, [bx]    ;захватываем 1 байт, в котором находится фактическая длина строки
  69.  
  70. lp:                             ;цикл получения числа
  71.                 inc bx          ;увеличиваем указатель на строку на 1
  72.                 mul [cm]        ;умножаем на 10
  73.                 add al, [bx]    ;прибавляем цифру
  74.                 sub ax, '0'     ;убираем код '0'
  75.  
  76.                 loop lp         ;уменьшаем регистр сх на 1, сравниваем с нулем, если не ноль, то повторяем цикл
  77.  
  78.  
  79.  
  80.                 ret
  81.  
  82.  
  83. output_number:                   ;процедура вывода числа на экран
  84.                 push '*'        ;запоминаем, что концом числа в стеке будет символ *
  85.  
  86. lpt:                            ;цикл разбиения числа на цифры и передача его в стек
  87.                 div [cm]        ;деление числа на 10, остаток уходит в dx
  88.                 push dx         ;добавляем в стек остаток от деления
  89.                 xor dx, dx      ;очищаем dx от уже занесенного результата
  90.                 cmp ax, 0h      ;сравниваем результат деления с 0
  91.                 jne lpt         ;если не 0, то заново цикл
  92.  
  93.  
  94.                 mov ah, 02h
  95.                 mov dx, 0x0D0A
  96.                 int 21h
  97.  
  98. lpp:                            ;цикл вывода числа
  99.                 pop bx          ;вытаскиваем число из стека
  100.  
  101.                 cmp bx, '*'     ;если конец стека
  102.                 je endst        ;то выходим из цикла
  103.  
  104.                 add bx, '0'     ;иначе добавляем '0' чтобы получить символ
  105.  
  106.                 mov ah, 02h
  107.                 mov dx, bx      ;выводим символ
  108.                 int 21h
  109.  
  110.                 jmp lpp         ;повторяем цикл
  111.  
  112. endst:          ret             ;выходим
  113.  
  114. get_result:
  115.                 mov bp, sp      ;в регистр bp передаем указатель на стек для доступа к другим переменным стека
  116.  
  117.                 ;mov ax, [bp+4]  ;в регистр ах передаем переменную А
  118.                 ;mov bx, [bp+2]  ;в регистр ax передаем переменную В
  119.                 mov ax, [A]
  120.                 mov bx, [B]
  121.                 mov cx, ax
  122.                 mul cx
  123.                 mul cx
  124.                 mov cx, ax
  125.                 mov ax, bx
  126.                 mul ax
  127.                 mov bx, ax
  128.                 mov ax, cx
  129.                 sub ax, bx
  130.                 mov [res], ax   ;сохраняем результат
  131.  
  132.                 ret             ;выходим из процедуры
  133.  
  134.  
  135.  
  136.  
  137. str1            db "We will calculate A^3 - B^2", $0d, $0a, "$"
  138. str2            db "Memory procedure result is $"
  139. inputA          db "Enter number A: $"
  140. inputB          db "Enter number B: $"
  141. new_line        db      $0d, $0A, "$"
  142. strA            db 10, 0, 10 dup(?)
  143. strB            db 10, 0, 10 dup(?)
  144. numA            dw 0h
  145. numB            dw 0h
  146. cm              dw 10
  147. res             dw 0h
  148. A               dw 0h
  149. B               dw 0h
  150.  
  151.  
Add Comment
Please, Sign In to add comment