Advertisement
azari_iva

Untitled

Mar 20th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %include "io.inc"
  2.  
  3. section .bss
  4.     n       resd 1
  5.     k       resd 1
  6.     res     resd 1
  7.     i       resd 1
  8.     Cn      resd 1
  9.     Ck      resd 1
  10.     Cres    resd 1
  11.    
  12. section .data
  13.     m       dd  -1
  14.     r       dd   0
  15.    
  16. section .text
  17. global CMAIN
  18. CMAIN:
  19.     GET_UDEC 4, [n]
  20.     GET_UDEC 4, [k]
  21.    
  22.     mov eax, [n]    ; i = n
  23.     cmp eax, 2      ;
  24.     jb  .EXIT_1     ; if (n < 2) { return k <= 1 & (n != 0) & ~k; }
  25.    
  26.     mov ebx, [m]
  27. .L1:
  28.     inc ebx         ; m++
  29.     shr eax, 1      ; i >>= 1
  30.     jnz .L1        
  31.     mov [m], ebx
  32.  
  33.     mov eax, 1      ;
  34.     mov ecx, [m]    ;
  35.     dec ecx         ;
  36.     shl eax, cl     ; i = 1 << (m - 1);
  37.    
  38.     mov ebx, [r]
  39.     test eax, eax
  40.     jz .BL2         ; if (i == 0) goto BL2;
  41.     test eax, [n]   ; n & i
  42.     jnz .BL2
  43. .L2:
  44.     inc ebx         ; r++
  45.     shr eax, 1      ; i >>= 1
  46.     jz .BL2
  47.     test eax, [n]   ; n & i
  48.     jz .L2
  49.    
  50. .BL2:
  51.     mov [r], ebx
  52.    
  53.     mov eax, [m]    ;
  54.     mov [Cn], eax   ; Cn = m;
  55.    
  56.     mov eax, [k]    ;
  57.     inc eax         ;
  58.     mov [Ck], eax   ; Ck = k + 1;
  59.    
  60.     cmp eax, [Cn]   ;
  61.     ja .M1          ; if (Ck > Cn) goto M1;
  62.     shl eax, 1
  63.     cmp eax, [n]
  64.     jbe .S1         ; if (Ck * 2 <= n) goto S1;
  65.    
  66.     mov eax, [Cn]   ;
  67.     sub eax, [Ck]   ;
  68.     mov [Ck], eax   ; Ck = Cn - Ck;
  69. .S1:
  70.     test eax, eax
  71.     jnz .S2         ; if (Ck != 0) goto S2;
  72.     mov eax, 1      ;
  73.     mov [res], eax  ; res = 1
  74.     jmp .M1         ; if (Ck == 0) { res = 1; goto M1; }
  75.    
  76.    
  77.  
  78. .S2:
  79.     mov eax, [Cn]   ; res = Cn
  80.     mov ebx, 2      ; i = 2
  81.     cmp ebx, [Ck]   ; i - Ck
  82.     ja .BL3         ; if (i > Ck) goto BL3;
  83.    
  84.    
  85. .L3:
  86.     mov ecx, [Cn]   ;
  87.     sub ecx, ebx    ; Cn - i
  88.     inc ecx         ; Cn - i + 1
  89.     mul ecx         ; res *= (Cn - i + 1);
  90.    
  91.     div ebx         ; res /= i
  92.     inc ebx         ; i++
  93.     cmp ebx, [Ck]   ; i - Ck
  94.     jbe .L3
  95.    
  96. .BL3:
  97.     mov [res], eax
  98.    
  99.    
  100. .M1:
  101.     mov ecx, [m]    ;
  102.     mov eax, 1      ;
  103.     shl eax, cl     ;
  104.     xor eax, [n]    ;
  105.     mov [n], eax    ; n ^= (1 << m);
  106.    
  107.     mov eax, [k]    ;
  108.     sub eax, [r]    ;
  109.     mov [k], eax    ; k -= r;
  110.    
  111.     mov eax, [m]    ;
  112.     dec eax         ;
  113.     sub eax, [r]    ;
  114.     mov [m], eax    ; m -= (r + 1);
  115.    
  116.     xor eax, eax    ;
  117.     mov [r], eax    ; r = 0
  118.    
  119.     inc eax         ;
  120.     mov ecx, [m]    ;
  121.     dec ecx         ;
  122.     shl eax, cl     ; i = 1 << (m - 1);
  123.    
  124.     mov ebx, [r]
  125.     test eax, eax
  126.     jz .BL4
  127.     test eax, [n]   ; n & i
  128.     jnz .BL4
  129. .L4:
  130.     inc ebx         ; r++
  131.     shr eax, 1      ; i >>= 1
  132.     jz .BL4
  133.     test eax, [n]   ; n & i
  134.     jz .L4
  135.    
  136. .BL4:
  137.     mov [r], ebx
  138.  
  139. ;PRINT_UDEC 4, res
  140. ;NEWLINE
  141. ;PRINT_UDEC 4, n
  142. ;NEWLINE
  143. ;PRINT_UDEC 4, k
  144. ;NEWLINE
  145. ;PRINT_UDEC 4, r
  146. ;NEWLINE
  147.  
  148. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  149. .L5:
  150.     mov eax, [n]    ;
  151.     test eax, eax   ; n & n
  152.     jz .EXIT_2      ; if (n == 0) { return res + (k == 0); }
  153.    
  154.     mov eax, [k]    ;
  155.     test eax, eax   ; k & k
  156.     jz .EXIT_3      ; if (k == 0) { return res + (n == (1 << (m + 1)) - 1); }
  157.    
  158.     mov eax, [m]    ;
  159.     mov [Cn], eax   ; Cn = m;
  160.    
  161.     mov eax, [k]    ;
  162.     dec eax         ;
  163.     mov [Ck], eax   ; Ck = k - 1;
  164.    
  165.     cmp eax, [Cn]   ;
  166.     ja  .M2         ; if (Ck > Cn) { goto M2; }
  167.    
  168.     shl eax, 1      ;
  169.     cmp eax, [n]    ;
  170.     jbe .S3         ; if (Ck * 2 <= n) goto S3;
  171.    
  172.     mov eax, [Cn]   ;
  173.     sub eax, [Ck]   ;
  174.     mov [Ck], eax   ; if (Ck * 2 > n) { Ck = Cn - Ck; }
  175.    
  176. .S3:
  177.     test eax, eax
  178.     jnz .S4         ; if (Ck != 0) goto S4;
  179.     mov eax, [res]  ;
  180.     inc eax         ;
  181.     mov [res], eax  ; res += 1
  182.     jmp .M2         ; if (Ck == 0) { res += 1; goto M2; }
  183.    
  184. .S4:
  185.     mov eax, [Cn]   ; Cres = Cn
  186.     mov ebx, 2      ; i = 2
  187.     cmp ebx, [Ck]   ; i - Ck
  188.     ja .BL6         ; if (i > Ck) goto BL6;
  189. .L6:
  190.     mov ecx, [Cn]
  191.     inc ecx         ; Cn + 1
  192.     sub ecx, ebx    ; Cn - i + 1
  193.     mul ecx         ; Cres *= (Cn - i + 1)
  194.     div ebx         ; Cres /= i
  195.     inc ebx         ; i ++
  196.     cmp ebx, [Ck]   ; i - Ck
  197.     jbe .L6
  198. .BL6:
  199.     add eax, [res]  ;
  200.     mov [res], eax  ; res += Cres;
  201.    
  202. .M2:
  203.     mov eax, 1      ;
  204.     mov ecx, [m]    ;
  205.     shl eax, cl     ;
  206.     xor eax, [n]    ;
  207.     mov [n], eax    ; n ^= (1 << m);
  208.    
  209.     mov eax, [k]    ;
  210.     sub eax, [r]    ;
  211.     mov [k], eax    ;k -= r;
  212.    
  213.     mov eax, [m]    ;
  214.     dec eax         ;
  215.     sub eax, [r]    ;
  216.     mov [m], eax    ; m -= (r + 1);
  217.    
  218.     xor eax, eax    ;
  219.     mov [r], eax    ; r = 0
  220.    
  221.     inc eax         ;
  222.     mov ecx, [m]    ;
  223.     dec ecx         ;
  224.     shl eax, cl     ; i = 1 << (m - 1);
  225.    
  226.     mov ebx, [r]
  227.     test eax, eax
  228.     jz .BL7
  229.     test eax, [n]
  230.     jnz .BL7
  231. .L7:
  232.     inc ebx         ; r++
  233.     shr eax, 1      ; i >>= 1
  234.     jz .BL7
  235.     test eax, [n]   ; n & i
  236.     jz .L7
  237.    
  238. .BL7:
  239.     mov [r], ebx
  240.     jmp .L5
  241. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  242.  
  243.  
  244.  
  245.  
  246.  
  247. .EXIT_3:
  248.     ;PRINT_STRING "EXIT 3"
  249. ;    NEWLINE
  250.    
  251.     mov ebx, 1
  252.     mov ecx, [m]    ; m
  253.     inc ecx         ; m + 1
  254.     shl ebx, cl     ; (1 << (m + 1))
  255.     dec ebx         ; (1 << (m + 1)) - 1
  256.     xor eax, eax
  257.     cmp ebx, [n]
  258.     sete al         ; n == (1 << (m + 1)) - 1
  259.     add eax, [res]  ; res + (n == (1 << (m + 1)) - 1)
  260.     jmp .MAIN_EXIT
  261.    
  262. .EXIT_2:
  263. ;    PRINT_STRING "EXIT 2"
  264. ;    NEWLINE
  265.    
  266.     xor eax, eax
  267.     mov ebx, [k]
  268.     test ebx, ebx   ; k & k
  269.     setz al
  270.     add eax, [res]
  271.     jmp .MAIN_EXIT
  272.    
  273. .EXIT_1:
  274. ;    PRINT_STRING "EXIT 1"
  275. ;    NEWLINE
  276.    
  277.     test eax, eax
  278.     cmovz eax, [r]
  279.     jz .MAIN_EXIT
  280.     mov eax, [k]
  281.     cmp eax, 1
  282.     cmova eax, [r]
  283.     ja .MAIN_EXIT
  284.     cmove eax, [r]
  285.     je .MAIN_EXIT
  286.     mov eax, 1
  287.    
  288. .MAIN_EXIT:
  289.     PRINT_UDEC 4, eax
  290.     xor eax, eax
  291.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement