Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  *  vmss_decbin.c
  3.  *  lab11
  4.  *
  5.  *
  6.  * 11/15/2010: inline asm rewrite
  7.  */
  8.  
  9. #include "vmss_decbin.h"
  10. #include <assert.h>
  11.  
  12.  
  13. //
  14. void vmss_gettet(INTFIELD *f, int n, bit_tetrad *t) { _asm {
  15.   mov ecx, 4         ; loop counter
  16.  
  17. it1:
  18.   ; calculate bit position
  19.   xor edx, edx
  20.   mov eax, 4
  21.   sub eax, ecx
  22.   add edx, eax
  23.   mov [ebp-32], eax
  24.  
  25.   mov eax, dword ptr[n]
  26.   lea eax, [eax*4]
  27.   add edx, eax
  28.  
  29.   ; assign
  30.   mov eax, dword ptr[f]
  31.   mov eax, dword ptr[eax+4*edx]
  32.   mov edx, dword ptr[t];
  33.   mov ebx, [ebp-32]
  34.   mov dword ptr[edx+4*ebx], eax
  35.  
  36.   loop it1
  37. }}
  38.  
  39. /*******************************************************************************************/
  40. int vmss_tet2int(bit_tetrad *t) { __asm {
  41.   mov dword ptr[ebp-8], 0       ; i
  42.   mov dword ptr[ebp-12], 0      ; val
  43.   jmp incr_body
  44.  
  45. incr:
  46.   mov eax, dword ptr[ebp-8]
  47.   inc eax
  48.   mov dword ptr [ebp-8], eax
  49.   cmp eax, 4
  50.   jge incr_end
  51.  
  52. incr_body:
  53.   mov eax, 3
  54.   sub eax, dword ptr[ebp-8]
  55.   mov ecx, dword ptr[t]
  56.   mov edx, dword ptr[ecx+eax*4]
  57.   mov ecx, dword ptr[ebp-8]
  58.   shl edx, cl
  59.   or  edx, dword ptr[ebp-12]
  60.   mov dword ptr[ebp-12], edx
  61.  
  62.   jmp incr
  63.  
  64. incr_end:
  65.   mov eax, dword ptr[ebp-12]     ; ret value
  66. }}
  67.  
  68. void vmss_clearbits(INTFIELD *f) { __asm {
  69.     mov ecx, BIT_COUNT-1    ; 32-1
  70.   mov eax, dword ptr[f]
  71.  
  72. lp:
  73.   mov dword ptr[eax+ecx*4], 0
  74.   loop lp
  75.  
  76.   mov dword ptr[eax], 0   ; clear first element
  77. }}
  78.  
  79. /*******************************************************************************************/
  80. void vmss_int2decbin(int val, INTFIELD *f) { __asm {
  81.   mov dword ptr[ebp-4], BIT_COUNT-4
  82.   mov eax, dword ptr[f]
  83.   push eax
  84.   call vmss_clearbits
  85.   pop eax
  86.  
  87.   ; eax = counter
  88.   mov eax, dword ptr[val]
  89.   mov dword ptr[ebp-8], eax
  90.  
  91. val_loop:
  92.   mov eax, dword ptr[ebp-8]
  93.   cmp eax, 0
  94.   je end_loop
  95.  
  96.   mov eax, dword ptr[ebp-4]   ; i <= 4
  97.   cmp eax, 4
  98.   jle end_loop
  99.  
  100.   mov eax, dword ptr[ebp-8]
  101.   cdq                         ; convert dbl to quad
  102.   mov ecx, 10
  103.   idiv ecx                    ; result in edx
  104.   mov dword ptr[ebp-12], edx  ; save remainder
  105.  
  106.   ; write bits
  107.   mov ebx, dword ptr[f]
  108.   mov eax, dword ptr[ebp-4]
  109.   lea ebx, [ebx+eax*4]
  110.   ;add ebx, eax
  111.  
  112.   ; ebx: intfield, eax: digit
  113.  
  114.   ; f->bits[i].v = digit / 8;
  115.   cdq
  116.   mov eax, dword ptr[ebp-12]
  117.   mov ecx, 8
  118.   idiv ecx
  119.   mov dword ptr[ebx], eax
  120.  
  121.   ; f->bits[i+1].v = (digit / 4) % 2;
  122.   cdq
  123.   mov eax, dword ptr[ebp-12]
  124.   mov ecx, 4
  125.   idiv ecx
  126.   cdq
  127.   mov ecx, 2
  128.   idiv ecx
  129.   mov dword ptr[ebx+4], edx
  130.  
  131.   ;f->bits[i+2].v = (digit / 2) % 2;
  132.   cdq
  133.   mov eax, dword ptr[ebp-12]
  134.   mov ecx, 2
  135.   idiv ecx
  136.   cdq
  137.   mov ecx, 2
  138.   idiv ecx
  139.   mov dword ptr[ebx+8], edx
  140.  
  141.   ;f->bits[i+3].v = digit % 2;
  142.   cdq
  143.   mov eax, dword ptr[ebp-12]
  144.   mov ecx, 2
  145.   idiv ecx
  146.   mov dword ptr[ebx+12], edx
  147.  
  148.   ; i=i-4
  149.   mov eax, dword ptr[ebp-4]
  150.   sub eax, 4
  151.   mov dword ptr[ebp-4], eax
  152.  
  153.   ; val / 10
  154.   cdq
  155.   mov eax, dword ptr[ebp-8]
  156.   mov ecx, 10
  157.   idiv ecx
  158.   mov dword ptr[ebp-8], eax
  159.  
  160.   jmp val_loop
  161.  
  162. end_loop:
  163.  
  164. }}
  165.  
  166. /*******************************************************************************************/
  167. int vmss_decbin2int(INTFIELD *f) { __asm {
  168.   ; initialize local variables
  169.   mov dword ptr[ebp-4], BIT_COUNT/4         ; tets: total tetrads
  170.   mov dword ptr[ebp-64], BIT_COUNT/4 - 1    ; i
  171.   mov dword ptr[ebp-8], 0                   ; k
  172.   mov dword ptr[ebp-12], 0                  ; res
  173.  
  174.   mov ecx, dword ptr[ebp-64]
  175. tl:
  176.  
  177.   mov eax, [ebp+8]                          ; dword ptr [f]
  178.   lea edx, [ebp-32]                         ; &bit_tetrad in stack
  179.  
  180.   mov dword ptr[ebp-64], ecx
  181.  
  182.   push edx                                  ; &tetr
  183.   push ecx                                  ; i
  184.   push eax                                  ; f
  185.   call vmss_gettet
  186.   pop eax
  187.   pop ecx
  188.   pop edx
  189.  
  190.   lea edx, [ebp-32]
  191.   push edx
  192.   call vmss_tet2int
  193.   pop edx
  194.  
  195.   ; eax = val
  196.   mov ebx, 1
  197.   mov edx, dword ptr[ebp-8]
  198.   mov dword ptr[ebp-16], eax
  199.  
  200.   inc edx
  201.  
  202. l_pow:
  203.   mov dword ptr[ebp-20], edx
  204.   mov eax, 10
  205.   mul ebx
  206.   mov ebx, eax
  207.   mov edx, dword ptr[ebp-20]
  208.  
  209.   dec edx
  210.   cmp edx, 0
  211.   jne l_pow
  212.  
  213.   mov eax, dword ptr[ebp-16]      ; restore eax=val
  214.   mul ebx                         ; eax = [ebx] * [eax]
  215.  
  216.   ; lost zero fix ?
  217.   mov ebx, 10
  218.   div ebx
  219.  
  220.   mov ebx, dword ptr[ebp-12]      ; ebx = res
  221.   add eax, ebx                    ; eax = eax + ebx
  222.   mov dword ptr[ebp-12], eax      ; res = eax
  223.  
  224.   mov eax, dword ptr[ebp-8]       ; eax <- k
  225.   inc eax                         ; eax++
  226.   mov dword ptr[ebp-8], eax       ; k <- eax
  227.    
  228.   mov ecx, dword ptr[ebp-64]      ; restore i-counter
  229.  
  230.   loop tl                         ; ecx>0 ?
  231.  
  232.   mov eax, dword ptr[ebp-12]                ; ret res
  233. }}
  234.  
  235. /*******************************************************************************************/
  236. void vmss_makefixtet(INTFIELD *src, INTFIELD *fix) { __asm {
  237.   mov dword ptr[ebp-4], 0       ; i
  238.   mov eax, dword ptr[fix]
  239.   push eax
  240.   call vmss_clearbits
  241.   add esp, 4
  242.  
  243.   jmp loop_body
  244.  
  245. loop_cond:
  246.   mov eax, dword ptr[ebp-4]
  247.   cmp eax, BIT_COUNT/4
  248.   jne loop_end
  249.   inc eax
  250.   mov dword ptr[ebp-4], eax
  251.  
  252. loop_body:
  253.   ; vmss_gettet(src, i, &tetr);
  254.   lea ebx, dword ptr[ebp-64]
  255.   push ebx
  256.   mov eax, dword ptr[ebp-4]
  257.   push eax
  258.   mov ecx, dword ptr[src]
  259.   push ecx
  260.   call vmss_gettet
  261.   add esp, 12
  262.  
  263.   ; if ( vmss_tet2int(&tetr) != 0  )
  264.   lea ebx, dword ptr[ebp-64]
  265.   push ebx
  266.   call vmss_tet2int
  267.   add esp, 4
  268.   cmp eax, 0
  269.   jz ifb_e
  270.  
  271.   mov eax, dword ptr[ebp-4]
  272.   mov ecx, dword ptr[src]
  273.  
  274.   lea edx, dword ptr[ecx + 4*eax + 0]
  275.   mov dword ptr[edx], 0
  276.   lea edx, dword ptr[ecx + 4*eax + 4]
  277.   mov dword ptr[edx], 1
  278.   lea edx, dword ptr[ecx + 4*eax + 8]
  279.   mov dword ptr[edx], 1
  280.   lea edx, dword ptr[ecx + 4*eax + 12]
  281.   mov dword ptr[edx], 0
  282.  
  283. ifb_e:
  284.   jmp loop_cond
  285.  
  286. loop_end:
  287.  
  288. }}
  289.  
  290. /*******************************************************************************************/
  291. void vmss_makefixtet_sub(INTFIELD *src, INTFIELD *fix, int count) { _asm {
  292.   mov eax, dword ptr[count]
  293.   mov ebx, BIT_COUNT/4
  294.   sub eax, ebx
  295.   mov dword ptr[ebp-4], eax       ; i
  296.   mov eax, dword ptr[fix]
  297.   push eax
  298.   call vmss_clearbits
  299.   add esp, 4
  300.  
  301.   jmp loop_body
  302.  
  303. loop_cond:
  304.   mov eax, dword ptr[ebp-4]
  305.   cmp eax, BIT_COUNT/4
  306.   jne loop_end
  307.   inc eax
  308.   mov dword ptr[ebp-4], eax
  309.  
  310. loop_body:
  311.   ; vmss_gettet(src, i, &tetr);
  312.   lea ebx, dword ptr[ebp-64]
  313.   push ebx
  314.   mov eax, dword ptr[ebp-4]
  315.   push eax
  316.   mov ecx, dword ptr[src]
  317.   push ecx
  318.   call vmss_gettet
  319.   add esp, 12
  320.  
  321.   lea ebx, dword ptr[ebp-64]
  322.   push ebx
  323.   call vmss_tet2int
  324.   add esp, 4
  325.   cmp eax, 0
  326.   jz ifb_e
  327.  
  328.   mov eax, dword ptr[ebp-4]
  329.   mov ecx, dword ptr[src]
  330.  
  331.   lea edx, dword ptr[ecx + 4*eax + 0]
  332.   mov dword ptr[edx], 1
  333.   lea edx, dword ptr[ecx + 4*eax + 4]
  334.   mov dword ptr[edx], 0
  335.   lea edx, dword ptr[ecx + 4*eax + 8]
  336.   mov dword ptr[edx], 1
  337.   lea edx, dword ptr[ecx + 4*eax + 12]
  338.   mov dword ptr[edx], 0
  339.  
  340. ifb_e:
  341.   jmp loop_cond
  342.  
  343. loop_end:
  344.  
  345. }}
  346. /*******************************************************************************************/
  347. int vmss_gettet_count(INTFIELD *src) { __asm {
  348.   mov dword ptr [ebp-4], 0        ; i
  349.   mov eax, dword ptr[src]        
  350.   mov dword ptr [ebp-8], eax
  351.    
  352. begin_loop:
  353.   mov eax, dword ptr[ebp-4]
  354.   cmp eax, BIT_COUNT/4
  355.   jge end_loop
  356.  
  357.   lea ebx, dword ptr[ebp-64]
  358.   push ebx
  359.   push eax
  360.   mov ecx, dword ptr[ebp-8]
  361.   push ecx
  362.   call vmss_gettet
  363.   add esp, 12
  364.  
  365.   lea ebx, dword ptr[ebp-64];
  366.   push ebx
  367.   call vmss_tet2int
  368.   add esp, 4
  369.  
  370.   cmp eax, 0
  371.   jnz end_loop
  372.  
  373.   mov eax, dword ptr[ebp-4]
  374.   inc eax
  375.   mov dword ptr[ebp-4], eax
  376.   jmp begin_loop
  377.  
  378. end_loop:
  379.   mov ebx, dword ptr[ebp-4]
  380.   mov eax, BIT_COUNT/4
  381.   sub eax, ebx
  382. }}
  383.  
  384. /*******************************************************************************************/
  385. void vmss_tsum(INTFIELD *b1, INTFIELD *b2, INTFIELD *res, INTFIELD *transfer) { __asm {
  386.   mov dword ptr[ebp-4], 0     ; add
  387.   mov dword ptr[ebp-8], 0     ; i
  388.  
  389.   mov ecx, BIT_COUNT-1
  390.  
  391.   mov dword ptr [ebp-8], BIT_COUNT-1
  392.   jmp loop_1
  393. loop_incr:
  394.   mov eax,dword ptr [ebp-8]  
  395.   sub eax,1  
  396.   mov dword ptr [ebp-8],eax  
  397. loop_1:
  398.   cmp dword ptr [ebp-8],0  
  399.   jl loop_exit
  400.  
  401.   mov eax, dword ptr[ebp-8]
  402.   mov ecx, dword ptr[b1]
  403.   cmp dword ptr[ecx+eax*4], 0
  404.   jne if_case_2
  405.   mov ecx, dword ptr[b2]
  406.   cmp dword ptr[ecx+eax*4], 0
  407.   jne if_case_2
  408.  
  409. ;if_case_1:
  410.   ; case_1 body
  411.   mov eax,dword ptr [ebp-8]  
  412.   mov ecx,dword ptr [res]  
  413.   mov edx,dword ptr [ebp-4]  
  414.   mov dword ptr [ecx+eax*4],edx
  415.   mov dword ptr [ebp-4],0  
  416.  
  417.   jmp ex_if
  418. if_case_2:
  419.  
  420.   mov eax, dword ptr[ebp-8]
  421.   mov ecx, dword ptr[b1]
  422.   cmp dword ptr[ecx+eax*4], 1
  423.   jne m_1
  424.  
  425.   mov eax, dword ptr[ebp-8]
  426.   mov ecx, dword ptr[b2]
  427.   cmp dword ptr[ecx+eax*4], 0
  428.   je m_2
  429.  
  430. m_1:
  431.   mov eax, dword ptr[ebp-8]
  432.   mov ecx, dword ptr[b1]
  433.   cmp dword ptr[ecx+eax*4], 0
  434.   jne if_case_3
  435.  
  436.   mov eax, dword ptr[ebp-8]
  437.   mov ecx, dword ptr[b2]
  438.   cmp dword ptr[ecx+eax*4], 1
  439.   jne if_case_3
  440.  
  441. m_2:
  442.   ; case_2 body
  443.   xor eax,eax  
  444.   cmp dword ptr [ebp-4],0  
  445.   sete al  
  446.   mov ecx,dword ptr [ebp-8]  
  447.   mov edx,dword ptr [res]  
  448.   mov  dword ptr [edx+ecx*4],eax
  449.   jmp ex_if
  450.  
  451. if_case_3:
  452.   ; else if ( b1->bits[i].v == 1 && b2->bits[i].v == 1 )
  453.   mov eax, dword ptr[ebp-8]
  454.   mov ecx, dword ptr[b1]
  455.   cmp dword ptr [ecx+eax*4],1
  456.   jne ex_if
  457.   mov eax, dword ptr[ebp-8]
  458.   mov ecx, dword ptr[b2]
  459.   cmp dword ptr[ecx+eax*4],1
  460.   jne ex_if
  461.    
  462.   ; case_3 body
  463.   mov eax,dword ptr [ebp-8]  
  464.   mov ecx,dword ptr [res]  
  465.   mov edx,dword ptr [ebp-4]
  466.  
  467.   mov dword ptr [ecx+eax*4],edx  
  468.   mov dword ptr [ebp-4],1         ; add <- 1
  469.  
  470. ex_if:
  471.   ; transfer bit
  472.   cmp dword ptr [transfer], 0  
  473.   je loop_end
  474.   mov eax,dword ptr [ebp-8]  
  475.   mov ecx,dword ptr [transfer]  
  476.   mov edx,dword ptr [ebp-4]  
  477.   mov dword ptr [ecx+eax*4],edx  
  478.  
  479. loop_end:
  480.   mov ecx, dword ptr[ebp-8]
  481.   jmp loop_incr
  482.  
  483. loop_exit:
  484. }}
  485.  
  486. /*******************************************************************************************/
  487. void vmss_sum_notf(INTFIELD *b1, INTFIELD *b2, INTFIELD *res) { __asm {
  488.   mov dword ptr[ebp-4], 0     ; add
  489.   mov dword ptr[ebp-8], 0     ; i
  490.  
  491.   mov ecx, BIT_COUNT-1
  492.  
  493.   mov dword ptr [ebp-8], BIT_COUNT-1
  494.   jmp loop_1
  495. loop_incr:
  496.   mov eax,dword ptr [ebp-8]  
  497.   sub eax,1  
  498.   mov dword ptr [ebp-8],eax  
  499. loop_1:
  500.   cmp dword ptr [ebp-8],0  
  501.   jl loop_exit
  502.  
  503.   mov eax, dword ptr[ebp-8]
  504.   mov ecx, dword ptr[b1]
  505.   cmp dword ptr[ecx+eax*4], 0
  506.   jne if_case_2
  507.   mov ecx, dword ptr[b2]
  508.   cmp dword ptr[ecx+eax*4], 0
  509.   jne if_case_2
  510.  
  511. ;if_case_1:
  512.   ; case_1 body
  513.   mov eax,dword ptr [ebp-8]  
  514.   mov ecx,dword ptr [res]  
  515.   mov edx,dword ptr [ebp-4]  
  516.   mov dword ptr [ecx+eax*4],edx
  517.   mov dword ptr [ebp-4],0  
  518.  
  519.   jmp ex_if
  520. if_case_2:
  521.  
  522.   mov eax, dword ptr[ebp-8]
  523.   mov ecx, dword ptr[b1]
  524.   cmp dword ptr[ecx+eax*4], 1
  525.   jne m_1
  526.  
  527.   mov eax, dword ptr[ebp-8]
  528.   mov ecx, dword ptr[b2]
  529.   cmp dword ptr[ecx+eax*4], 0
  530.   je m_2
  531.  
  532. m_1:
  533.   mov eax, dword ptr[ebp-8]
  534.   mov ecx, dword ptr[b1]
  535.   cmp dword ptr[ecx+eax*4], 0
  536.   jne if_case_3
  537.  
  538.   mov eax, dword ptr[ebp-8]
  539.   mov ecx, dword ptr[b2]
  540.   cmp dword ptr[ecx+eax*4], 1
  541.   jne if_case_3
  542.  
  543. m_2:
  544.   ; case_2 body
  545.   xor eax,eax  
  546.   cmp dword ptr [ebp-4],0  
  547.   sete al  
  548.   mov ecx,dword ptr [ebp-8]  
  549.   mov edx,dword ptr [res]  
  550.   mov  dword ptr [edx+ecx*4],eax
  551.   jmp ex_if
  552.  
  553. if_case_3:
  554.   ; else if ( b1->bits[i].v == 1 && b2->bits[i].v == 1 )
  555.   mov eax, dword ptr[ebp-8]
  556.   mov ecx, dword ptr[b1]
  557.   cmp dword ptr [ecx+eax*4],1
  558.   jne ex_if
  559.   mov eax, dword ptr[ebp-8]
  560.   mov ecx, dword ptr[b2]
  561.   cmp dword ptr[ecx+eax*4],1
  562.   jne ex_if
  563.    
  564.   ; case_3 body
  565.   mov eax,dword ptr [ebp-8]  
  566.   mov ecx,dword ptr [res]  
  567.   mov edx,dword ptr [ebp-4]
  568.  
  569.   mov dword ptr [ecx+eax*4],edx  
  570.   mov dword ptr [ebp-4],1         ; add <- 1
  571.  
  572. ex_if:
  573.   ; add bit
  574.   mov eax, dword ptr[ebp-8]   ; i
  575.   mov ecx, 4
  576.   cdq
  577.   idiv ecx
  578.   cmp edx, 0  ; remainder
  579.   jnz loop_end
  580.   mov dword ptr [ebp-4], 0    ; add <- 0
  581.  
  582. loop_end:
  583.   mov ecx, dword ptr[ebp-8]
  584.   jmp loop_incr
  585.  
  586. loop_exit:
  587. }}
  588.  
  589. /*******************************************************************************************/
  590. void vmss_decbinsum(INTFIELD *b1, INTFIELD *b2, INTFIELD *res) {
  591.     INTFIELD cr, cr2, res1, res2, tf;
  592.     int tet_count;
  593.     // make correction
  594.     printf("A:  %s\n", bits2string(b1));
  595.     printf("B:  %s\n", bits2string(b2));
  596.     vmss_makefixtet(b1, &cr);
  597.     printf("F:  %s\n", bits2string(&cr));
  598.     // sum A + CR = A'
  599.     vmss_tsum(b1, &cr, &res1, 0);
  600.     printf("A': %s\n", bits2string(&res1));
  601.     // sum A' + B = B'
  602.     vmss_tsum(&res1, b2, &res2, &tf);
  603.     printf("B:  %s\n", bits2string(b2));
  604.     printf("B': %s\n", bits2string(&res2));
  605.     // 2nd correction
  606.     printf("TF: %s\n", bits2string(&tf));
  607.     tet_count = vmss_gettet_count(&cr);
  608.     vmss_makefixtet_sub(&tf, &cr2, tet_count);
  609.     printf("F': %s\n", bits2string(&cr2));
  610.     // B' + CR' = B
  611.     vmss_sum_notf(&res2, &cr2, res);
  612.     printf("RS: %s\n", bits2string(res));
  613.    
  614. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement