Advertisement
r4lovets

Дальний вызов. Регистры

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