Advertisement
r4lovets

Ближний вызов

Apr 16th, 2019
1,560
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Передача параметров через стек. Ближний вызов
  2.  
  3.         org     100h
  4.  
  5. E       dw      256
  6. F       dw      16
  7. Res     dw      ?
  8.  
  9. Start:
  10.         ; Помещаем в стек параметры процедуры
  11.         push    [E]
  12.         push    [F]
  13.  
  14.         ; Подпрограмма подсчёта значений
  15.         call    Calculating
  16.  
  17.         ; Помещаем в стек параметр процедуры
  18.         push    AX
  19.  
  20.         ; Вывод значений
  21.         call    Output
  22.  
  23.         ; Ввод символа
  24.         mov     AX, $0C08
  25.         int     21h
  26.         test    AL, AL
  27.         jnz     @F
  28.         mov     AH, $08
  29.         int     21h
  30.  
  31. @@:
  32.         ret
  33.  
  34. ; Вычисление формулы [E and F^2]
  35. Calculating:
  36.         ; Сохранить значение BP, поместить текущий указатель стека
  37.         push    BP
  38.         mov     BP, SP
  39.  
  40.         ; Получаем парамеры для процедуры в регистры
  41.         mov     AX, [BP + 4]
  42.         mov     BX, [BP + 6]
  43.  
  44.         ; Возвести AX в квадрат
  45.         mul     AX
  46.  
  47.         ; Два старших байта 100% пустые
  48.         xor     DX, DX
  49.  
  50.         ; Побитовое умножение F^2 и E
  51.         and     AX, BX
  52.  
  53.         pop     BP
  54.         ret     4
  55.  
  56. ; Вывод чисел
  57. Output:
  58.         push     BP
  59.         mov      BP, SP
  60.  
  61.         ; Делитель тут хранится
  62.         mov      BL, 10
  63.  
  64.         ; Параметры цикла: BP - кол-во цифр, CX - счётчик цикла
  65.         mov      CX, 0
  66.  
  67.         mov      AX, [BP + 4]
  68. PushDigit:
  69.         ; Частное в AL, остаток в AH
  70.         div      BL
  71.  
  72.         ; Поместили в стек (AH - нужное)
  73.         push     AX
  74.  
  75.         ; Количество цифр++
  76.         inc      CX
  77.  
  78.         ; Преобразовать частное в новое число
  79.         xor      AH, AH
  80.  
  81.         ; Если в АХ ноль, покинуть. Иначе продолжить
  82.         cmp      AX, 0
  83.         jz       PopDidit
  84.         jmp      PushDigit
  85.  
  86. PopDidit:
  87.         ; Выгрузить из стека в DL цифру
  88.         pop      AX
  89.         mov      DL, AH
  90.  
  91.         ; Вывести цифру из DL
  92.         add      DL, 48
  93.         mov      AH, $02
  94.         int      21h
  95.  
  96.         loop     PopDidit
  97.  
  98.         pop      BP
  99.         ; Вернуться к месту вызова процедуры
  100.         ret      2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement