sub.pl 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/local/bin/perl
  2. # x86 assember
  3. sub bn_sub_words
  4. {
  5. local($name)=@_;
  6. &function_begin($name,"");
  7. &comment("");
  8. $a="esi";
  9. $b="edi";
  10. $c="eax";
  11. $r="ebx";
  12. $tmp1="ecx";
  13. $tmp2="edx";
  14. $num="ebp";
  15. &mov($r,&wparam(0)); # get r
  16. &mov($a,&wparam(1)); # get a
  17. &mov($b,&wparam(2)); # get b
  18. &mov($num,&wparam(3)); # get num
  19. &xor($c,$c); # clear carry
  20. &and($num,0xfffffff8); # num / 8
  21. &jz(&label("aw_finish"));
  22. &set_label("aw_loop",0);
  23. for ($i=0; $i<8; $i++)
  24. {
  25. &comment("Round $i");
  26. &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
  27. &mov($tmp2,&DWP($i*4,$b,"",0)); # *b
  28. &sub($tmp1,$c);
  29. &mov($c,0);
  30. &adc($c,$c);
  31. &sub($tmp1,$tmp2);
  32. &adc($c,0);
  33. &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
  34. }
  35. &comment("");
  36. &add($a,32);
  37. &add($b,32);
  38. &add($r,32);
  39. &sub($num,8);
  40. &jnz(&label("aw_loop"));
  41. &set_label("aw_finish",0);
  42. &mov($num,&wparam(3)); # get num
  43. &and($num,7);
  44. &jz(&label("aw_end"));
  45. for ($i=0; $i<7; $i++)
  46. {
  47. &comment("Tail Round $i");
  48. &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
  49. &mov($tmp2,&DWP($i*4,$b,"",0));# *b
  50. &sub($tmp1,$c);
  51. &mov($c,0);
  52. &adc($c,$c);
  53. &sub($tmp1,$tmp2);
  54. &adc($c,0);
  55. &dec($num) if ($i != 6);
  56. &mov(&DWP($i*4,$r,"",0),$tmp1); # *a
  57. &jz(&label("aw_end")) if ($i != 6);
  58. }
  59. &set_label("aw_end",0);
  60. # &mov("eax",$c); # $c is "eax"
  61. &function_end($name);
  62. }
  63. 1;