Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- org 100h
- start:
- ;вывод текста в консоль
- mov ah,9h
- mov dx, str1
- int 21h
- mov ah, 09h
- mov dx, inputA ;предложение ввода А
- int 21h
- mov ah, 0ah
- mov dx, strA ;вводим первое число А
- int 21h
- mov bx, dx ;помещаем в bx ссылку на строку в качестве передачи регистра как параметра процедуры
- call count_number ;извлекаем из строки число А
- ;push ax ;результат из регистра ах помещаем в стек
- mov [A], ax
- mov ah, 02h
- mov dx, 0x0D0A
- int 21h
- mov ah, 09h
- mov dx, inputB ;предложение ввода В
- int 21h
- mov ah, 0ah
- mov dx, strB ;вводим второе число В
- int 21h
- mov bx, dx
- call count_number ;извлекаем из строки число В
- ;push ax ;результат из регистра ах в стек
- mov [B], ax
- ;переход на новую строку
- mov ah,9h
- mov dx, new_line
- int 21h
- ;вывод текста в консоль
- mov ah, 9h
- mov dx, str2
- int 21h
- call get_result ;получаем результат вычислений
- mov ax, [res] ;перемещаем в ах результат для последующего вывода ответ
- call output_number ;вывод ответа
- pop ax ;чистим стек
- pop ax
- mov ah, 08h
- int 21h ;конец основной части программы
- ret
- count_number: ;процедура получения числа из строки
- xor ax, ax ;обнуляем ах
- xor dx, dx ;обнуляем dx
- add bx, 1h ;передвигаем адрес строки на 1
- mov cl, [bx] ;захватываем 1 байт, в котором находится фактическая длина строки
- lp: ;цикл получения числа
- inc bx ;увеличиваем указатель на строку на 1
- mul [cm] ;умножаем на 10
- add al, [bx] ;прибавляем цифру
- sub ax, '0' ;убираем код '0'
- loop lp ;уменьшаем регистр сх на 1, сравниваем с нулем, если не ноль, то повторяем цикл
- ret
- output_number: ;процедура вывода числа на экран
- push '*' ;запоминаем, что концом числа в стеке будет символ *
- lpt: ;цикл разбиения числа на цифры и передача его в стек
- div [cm] ;деление числа на 10, остаток уходит в dx
- push dx ;добавляем в стек остаток от деления
- xor dx, dx ;очищаем dx от уже занесенного результата
- cmp ax, 0h ;сравниваем результат деления с 0
- jne lpt ;если не 0, то заново цикл
- mov ah, 02h
- mov dx, 0x0D0A
- int 21h
- lpp: ;цикл вывода числа
- pop bx ;вытаскиваем число из стека
- cmp bx, '*' ;если конец стека
- je endst ;то выходим из цикла
- add bx, '0' ;иначе добавляем '0' чтобы получить символ
- mov ah, 02h
- mov dx, bx ;выводим символ
- int 21h
- jmp lpp ;повторяем цикл
- endst: ret ;выходим
- get_result:
- mov bp, sp ;в регистр bp передаем указатель на стек для доступа к другим переменным стека
- ;mov ax, [bp+4] ;в регистр ах передаем переменную А
- ;mov bx, [bp+2] ;в регистр ax передаем переменную В
- mov ax, [A]
- mov bx, [B]
- mov cx, ax
- mul cx
- mul cx
- mov cx, ax
- mov ax, bx
- mul ax
- mov bx, ax
- mov ax, cx
- sub ax, bx
- mov [res], ax ;сохраняем результат
- ret ;выходим из процедуры
- str1 db "We will calculate A^3 - B^2", $0d, $0a, "$"
- str2 db "Memory procedure result is $"
- inputA db "Enter number A: $"
- inputB db "Enter number B: $"
- new_line db $0d, $0A, "$"
- strA db 10, 0, 10 dup(?)
- strB db 10, 0, 10 dup(?)
- numA dw 0h
- numB dw 0h
- cm dw 10
- res dw 0h
- A dw 0h
- B dw 0h
Add Comment
Please, Sign In to add comment