Advertisement
Guest User

Untitled

a guest
Apr 4th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; si * di = si                
  2. mul64:                      
  3.     push ax              
  4.     push bx
  5.     push cx
  6.                          
  7.     ; bp -> nasz mnożnik            
  8.     sub sp, 8
  9.     mov bp, sp            
  10.                          
  11.     mov cx, 64                      
  12.                          
  13.     ; Kopiuj dane z si do bp
  14.     mov ax, word ptr [si]
  15.     mov word ptr [bp], ax    
  16.                              
  17.     mov ax, word ptr [si+2]  
  18.     mov word ptr [bp+2], ax  
  19.                              
  20.     mov ax, word ptr [si+4]  
  21.     mov word ptr [bp+4], ax  
  22.                              
  23.     mov ax, word ptr [si+6]  
  24.     mov word ptr [bp+6], ax  
  25.                          
  26.     ; Czyscimy si        
  27.     mov word ptr [si], 0  
  28.     mov word ptr [si+2], 0    
  29.     mov word ptr [si+4], 0    
  30.     mov word ptr [si+6], 0    
  31.                          
  32.     ; Sprawdźmy czy mnozymy przez 0 :)
  33.     cmp word ptr [di], 0  
  34.     jne mul64_calc        
  35.                          
  36.     cmp word ptr [di+2], 0
  37.     jne mul64_calc        
  38.                          
  39.     cmp word ptr [di+4], 0
  40.     jne mul64_calc        
  41.                          
  42.     cmp word ptr [di+6], 0
  43.     jne mul64_calc        
  44.                          
  45.     jmp mul64_zero        
  46.                          
  47. mul64_calc:                  
  48.     ; First 16            
  49.     mov ax, word ptr [di]
  50.                          
  51.     shr word ptr [di+6], 1  
  52.     rcr word ptr [di+4], 1
  53.     rcr word ptr [di+2], 1
  54.     rcr word ptr [di], 1  
  55.                          
  56.     and ax, 1            
  57.     cmp ax, 1                
  58.                          
  59.     je mul64_bit_one      
  60.                          
  61. mul64_bit_zero:              
  62.     ; Przesun całe 64 bity o jeden w lewo
  63.     shl word ptr [bp], 1  
  64.     rcl word ptr [bp+2], 1    
  65.     rcl word ptr [bp+4], 1    
  66.     rcl word ptr [bp+6], 1    
  67.                          
  68.     loop mul64_calc      
  69.     jmp mul64_res        
  70.                              
  71. mul64_bit_one:                
  72.     mov ax, word ptr [bp]
  73.     add word ptr [si], ax
  74.                          
  75.     mov ax, word ptr [bp+2]
  76.     adc word ptr [si+2], ax
  77.                          
  78.     mov ax, word ptr [bp+4]
  79.     adc word ptr [si+4], ax
  80.                          
  81.     mov ax, word ptr [bp+6]
  82.     adc word ptr [si+6], ax
  83.                              
  84.     ; Przesun całe 64 bity o jeden w lewo
  85.     shl word ptr [bp], 1  
  86.     rcl word ptr [bp+2], 1    
  87.     rcl word ptr [bp+4], 1
  88.     rcl word ptr [bp+6], 1
  89.              
  90.     loop mul64_calc
  91.     jmp mul64_res
  92.                  
  93. mul64_zero:      
  94.     mov word ptr [si], 0
  95.     mov word ptr [si+2], 0
  96.     mov word ptr [si+4], 0
  97.     mov word ptr [si+6], 0
  98.              
  99. mul64_res:      
  100.     add sp, 8
  101.              
  102.     pop cx
  103.     pop bx  
  104.     pop ax  
  105.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement