Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Передача параметров через стек. Ближний вызов
- org 100h
- E dw 256
- F dw 16
- Res dw ?
- Start:
- ; Помещаем в стек параметры процедуры
- push [E]
- push [F]
- ; Подпрограмма подсчёта значений
- call Calculating
- ; Помещаем в стек параметр процедуры
- push AX
- ; Вывод значений
- call Output
- ; Ввод символа
- mov AX, $0C08
- int 21h
- test AL, AL
- jnz @F
- mov AH, $08
- int 21h
- @@:
- ret
- ; Вычисление формулы [E and F^2]
- Calculating:
- ; Сохранить значение BP, поместить текущий указатель стека
- push BP
- mov BP, SP
- ; Получаем парамеры для процедуры в регистры
- mov AX, [BP + 4]
- mov BX, [BP + 6]
- ; Возвести AX в квадрат
- mul AX
- ; Два старших байта 100% пустые
- xor DX, DX
- ; Побитовое умножение F^2 и E
- and AX, BX
- pop BP
- ret 4
- ; Вывод чисел
- Output:
- push BP
- mov BP, SP
- ; Делитель тут хранится
- mov BL, 10
- ; Параметры цикла: BP - кол-во цифр, CX - счётчик цикла
- mov CX, 0
- mov AX, [BP + 4]
- PushDigit:
- ; Частное в AL, остаток в AH
- div BL
- ; Поместили в стек (AH - нужное)
- push AX
- ; Количество цифр++
- inc CX
- ; Преобразовать частное в новое число
- xor AH, AH
- ; Если в АХ ноль, покинуть. Иначе продолжить
- cmp AX, 0
- jz PopDidit
- jmp PushDigit
- PopDidit:
- ; Выгрузить из стека в DL цифру
- pop AX
- mov DL, AH
- ; Вывести цифру из DL
- add DL, 48
- mov AH, $02
- int 21h
- loop PopDidit
- pop BP
- ; Вернуться к месту вызова процедуры
- ret 2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement