Advertisement
Guest User

Untitled

a guest
Apr 17th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. format MZ
  2.  
  3. entry     Main: Start
  4.  
  5. ; тут передача через операнды в памяти
  6. ; в Main устанавливаю ds на на сегмент WorkData, погружаю в операнды значения переменных и юзаю их в сегменте API,
  7. ; предварительно установив в нём сегмент ds на WorkData
  8. segment Main
  9. Start:
  10.         mov      ax, WorkData
  11.         mov      ds, ax
  12.         call far   API: GetProccessedNum
  13.         mov        [X],dx
  14.         call far   API: GetProccessedNum
  15.         mov        [Y],dx
  16.         call far   API: CalculateResult ;result in dx
  17.         mov        dx, ax
  18.         call far   API: OutputSoughtNumber
  19.         call far   API: WaitForClick
  20.  
  21.  
  22.  
  23.  
  24. segment API
  25.  
  26. CalculateResult:
  27.         mov      ax, WorkData
  28.         mov      ds, ax
  29.         mov      ax, [X]
  30.         mul      ax
  31.         mov      bx, ax
  32.         mov      ax,[Y]
  33.         mov      si, [Y]
  34.         mul      si
  35.         mul      si
  36.         or       ax, bx
  37.         retf
  38.  
  39. GetProccessedNum:  ; Result in DX
  40.         push     ax
  41.         mov      ax, WorkData
  42.         mov      ds, ax
  43.         mov      ah, 0ah
  44.         mov      dx, input
  45.         int      21h
  46.  
  47.         mov      dh, [input + 1]
  48.         mov      [realSize], dh
  49.         call     ProccessNum
  50.         call     SetNewLine
  51.         pop      ax
  52.         retf
  53.  
  54.  
  55. ProccessNum:    ; Result in DX
  56.         push    cx
  57.         push    bx
  58.         xor     dx, dx
  59.         mov     ax, 1
  60.         mov     ch, 10
  61.         movzx   si, [realSize]
  62.  
  63. LoopDigit:
  64.         xor     bx, bx
  65.         mov     bl, [input + si + 1]
  66.         sub     bl, '0'
  67.         mov     cl, al
  68.         mul     bl
  69.         add     dx, ax
  70.         mov     al, cl
  71.         mul     ch
  72.  
  73.         dec     si
  74.         test    si,si
  75.         jnz     LoopDigit
  76.  
  77.         pop     bx
  78.         pop     cx
  79.         ret
  80.  
  81. SetNewLine:
  82.         push     ax
  83.         push     dx
  84.         mov      ah, 09h
  85.         mov      dx, newLine
  86.         int      21h
  87.         pop      dx
  88.         pop      ax
  89.         ret
  90.  
  91.  
  92.  
  93. OutputSoughtNumber:        ;waits for dx
  94.         mov     ax, WorkData
  95.         mov     ds, ax
  96.         mov     [toOutput],dx
  97.         mov     bh, 10
  98.         xor     ax, ax
  99.         mov     ax, [toOutput]
  100.         test    ax, ax
  101.         jz      NumIsZero
  102.         mov     cx, 0
  103. DivideNum:
  104.         add     cx, 1
  105.         div     bh
  106.         xor     dx, dx
  107.         mov     dl, ah
  108.         push    dx
  109.         xor     ah, ah
  110.         test    ax, ax
  111.         jnz     DivideNum
  112.         jmp     OutputDigit
  113.  
  114. NumIsZero:
  115.         push    0
  116.         mov     cx, 1
  117.  
  118. OutputDigit:
  119.         pop     dx
  120.         add     dx, 30h
  121.         mov     ah, 02h
  122.         int     21h
  123.         loop    OutputDigit
  124.         retf  ;OutputSoughtNumber ret
  125.  
  126. WaitForClick:
  127.         push     ax
  128.         mov      ah, 08h
  129.         int      21h
  130.         pop      ax
  131.         retf
  132.  
  133.  
  134.  
  135. Segment         WorkData
  136. input            db      4,5 dup(?)
  137. newLine          db      13,10,'$'
  138. realSize         db      ?
  139. toOutput         dw      ?
  140. X       dw      ?
  141. Y       dw      ?
  142. Z       dw      ?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement