3 push(@INC,"perlasm","../../perlasm");
7 &asm_init
($ARGV[0],"bf-686.pl");
10 $BF_OFF=($BF_ROUNDS+2)*4;
19 &des_encrypt
("BF_encrypt",1);
20 &des_encrypt
("BF_decrypt",0);
21 &cbc
("BF_cbc_encrypt","BF_encrypt","BF_decrypt",1,4,5,3,-1,-1);
31 &function_begin
($name,"");
34 &comment
("Load the 2 words");
35 &mov
("eax",&wparam
(0));
36 &mov
($L,&DWP
(0,"eax","",0));
37 &mov
($R,&DWP
(4,"eax","",0));
40 &comment
("P pointer, s and enc flag");
50 &xor($L,&DWP
(0,$P,"",0));
51 for ($i=0; $i<$BF_ROUNDS; $i+=2)
55 &BF_ENCRYPT
($i+1,$R,$L,$P,$tot,$tmp1,$tmp2,$tmp3);
58 &comment
("Round ".sprintf("%d",$i+1));
59 &BF_ENCRYPT
($i+2,$L,$R,$P,$tot,$tmp1,$tmp2,$tmp3);
61 &xor($R,&DWP
(($BF_ROUNDS+1)*4,$P,"",0));
63 &mov
("eax",&wparam
(0));
64 &mov
(&DWP
(0,"eax","",0),$R);
65 &mov
(&DWP
(4,"eax","",0),$L);
66 &function_end_A
($name);
70 &xor($L,&DWP
(($BF_ROUNDS+1)*4,$P,"",0));
71 for ($i=$BF_ROUNDS; $i>0; $i-=2)
75 &BF_ENCRYPT
($i,$R,$L,$P,$tot,$tmp1,$tmp2,$tmp3);
77 &comment
("Round ".sprintf("%d",$i-1));
78 &BF_ENCRYPT
($i-1,$L,$R,$P,$tot,$tmp1,$tmp2,$tmp3);
80 &xor($R,&DWP
(0,$P,"",0));
82 &mov
("eax",&wparam
(0));
83 &mov
(&DWP
(0,"eax","",0),$R);
84 &mov
(&DWP
(4,"eax","",0),$L);
85 &function_end_A
($name);
88 &function_end_B
($name);
93 local($i,$L,$R,$P,$tot,$tmp1,$tmp2,$tmp3)=@_;
96 &mov
( $tot, &DWP
(&n2a
($i*4),$P,"",0));
98 &movb
( &LB
($tmp1), &HB
($R));
99 &movb
( &LB
($tmp2), &LB
($R));
104 &mov
( $tot, &DWP
(&n2a
($BF_OFF+0x0000),$P,$tmp1,4));
105 &mov
( $tmp3, &DWP
(&n2a
($BF_OFF+0x0400),$P,$tmp2,4));
107 &movb
( &LB
($tmp1), &HB
($R));
108 &movb
( &LB
($tmp2), &LB
($R));
111 &mov
( $tmp1, &DWP
(&n2a
($BF_OFF+0x0800),$P,$tmp1,4)); # delay
114 &mov
( $tmp3, &DWP
(&n2a
($BF_OFF+0x0C00),$P,$tmp2,4));