Advertisement
r4lovets

Дальний вызов. Глобальные переменные

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