Advertisement
Guest User

Untitled

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