MadCortez

Untitled

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