Advertisement
Guest User

Untitled

a guest
Oct 26th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. MAX_RADIX EQU 18
  2. jmp main
  3.  
  4. ;ds:si - input buf
  5. ;df - direction
  6. proc_writeln:
  7.     pusha
  8.     mov ah, 0Eh
  9.     write:
  10.         lodsb
  11.         test al,al
  12.         jz exit_write
  13.         int 10h
  14.         jmp write    
  15.     exit_write:
  16.         ;newline
  17.         mov al, 0Dh
  18.         int 10h
  19.         mov al, 0Ah
  20.         int 10h
  21.         popa
  22.         ret
  23.              
  24.        
  25. ;es:di - output buf
  26. ;df - direction
  27. ;cx - max buffer size  
  28. proc_readln:
  29.     pusha
  30.     read:
  31.         mov ah, 0
  32.         int 16h
  33.         cmp al, 13
  34.         jz exit_read
  35.         stosb
  36.         loop read
  37.        
  38.     exit_read:
  39.         mov al, 0 ;;\0
  40.         stosb
  41.    
  42.         mov ah, 0Eh
  43.        
  44.         ;newline
  45.         mov al, 0Dh
  46.         int 10h
  47.         mov al, 0Ah
  48.         int 10h
  49.        
  50.         popa
  51.         ret
  52.  
  53. ;ds:si - char buf
  54. ;es:di - integer buf
  55. ;df - direction        
  56. proc_to_integer:
  57.     pusha
  58.     transform_integer:
  59.         lodsb
  60.         test al,al
  61.         jz transform_integer_exit
  62.        
  63.         cmp al, 2Fh                     ;;validation start
  64.         jng transform_integer_error
  65.         cmp al, 39h
  66.         jg transform_integer_error      ;;validation end
  67.        
  68.         sub al, 30h
  69.         stosb
  70.         jmp transform_integer    
  71.            
  72.     transform_integer_error:
  73.         stc      
  74.            
  75.     transform_integer_exit:
  76.         mov al, '$'
  77.         stosb
  78.    
  79.         popa
  80.         ret
  81.        
  82. ;ds:si - integer buf
  83. ;es:di - char buf
  84. ;df - direction        
  85. proc_to_char:
  86.     pusha
  87.     transform_char:
  88.         lodsb
  89.         cmp al, '$'
  90.         jz transform_char_exit
  91.        
  92.         add al, 30h
  93.         stosb
  94.         jmp transform_char          
  95.            
  96.     transform_char_exit:
  97.         mov al, 0
  98.         stosb
  99.    
  100.         popa
  101.         ret
  102.  
  103. ;es:di - buf
  104. proc_reverse:
  105.     pusha
  106.     lea si, di+MAX_RADIX-1
  107.    
  108.     reverse_loop:
  109.         mov al, [di]
  110.         mov ah, [si]
  111.         mov [di], ah
  112.         mov [si], al
  113.        
  114.         inc di
  115.         dec si
  116.         cmp di, si
  117.         jb reverse_loop
  118.    
  119.     popa    
  120.     ret    
  121.    
  122.  
  123. ;es:di - output buf        
  124. proc_read_integer:
  125.     pusha
  126.    
  127.     mov cx, MAX_RADIX - 1
  128.    
  129.     cld
  130.     call proc_readln
  131.     mov ax, es
  132.     mov ds, ax
  133.     mov si, di
  134.     call proc_to_integer
  135.     jc read_error
  136.    
  137.     call proc_reverse
  138.    
  139.     popa
  140.     ret
  141.    
  142.     read_error:
  143.         lea si, Err_not_integer
  144.         call proc_writeln
  145.         popa
  146.         call proc_read_integer
  147.         ret
  148.        
  149. ;ds:si - output buf        
  150. proc_write_integer:
  151.     pusha
  152.    
  153.     add si, MAX_RADIX - 1
  154.     mov ax, ds
  155.     mov es, ax
  156.     mov di, si
  157.     call proc_to_char
  158.    
  159.     call proc_writeln
  160.     popa
  161.     ret  
  162.  
  163. ;;stack top - op_1
  164. ;;next - op_2
  165. ;;next - res
  166. proc_sum:
  167.     pusha
  168.     mov bp, sp
  169.    
  170.    
  171.  
  172.     ret    
  173.    
  174. main:    
  175.     mov ax, cs
  176.     mov ds, ax
  177.     lea si, Invite_1
  178.     call proc_writeln
  179.    
  180.     mov ax, cs
  181.     mov es, ax
  182.     lea di, op_1
  183.     call proc_read_integer
  184.  
  185.     lea si, Invite_2
  186.     call proc_writeln
  187.    
  188.     lea di, op_2
  189.     call proc_read_integer
  190.    
  191.     push offset res
  192.     push offset op_2
  193.     push offset op_1
  194.     call proc_sum
  195.    
  196.    
  197.     lea si, Res_message
  198.     call proc_writeln
  199.    
  200.     lea si, op_1
  201.     call proc_write_integer
  202.    
  203.     mov ah, 4Ch
  204.     int 21h
  205.    
  206. Invite_1 db 'Enter first number: ', 0
  207. Invite_2 db 'Enter second number: ', 0
  208. Res_message db 'Result is: ', 0
  209. Err_not_integer db 'This is not a number. Try again: ', 0
  210.  
  211. op_1 db MAX_RADIX dup('$')
  212. op_2 db MAX_RADIX dup('$')
  213. res db MAX_RADIX dup('$')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement