"Fossies" - the Fresh Open Source Software Archive

Member "openssl-1.0.2q/crypto/perlasm/readme" (20 Nov 2018, 3422 Bytes) of package /linux/misc/openssl-1.0.2q.tar.gz:


As a special service "Fossies" has tried to format the requested text file into HTML format (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    1 The perl scripts in this directory are my 'hack' to generate
    2 multiple different assembler formats via the one origional script.
    3 
    4 The way to use this library is to start with adding the path to this directory
    5 and then include it.
    6 
    7 push(@INC,"perlasm","../../perlasm");
    8 require "x86asm.pl";
    9 
   10 The first thing we do is setup the file and type of assember
   11 
   12 &asm_init($ARGV[0],$0);
   13 
   14 The first argument is the 'type'.  Currently
   15 'cpp', 'sol', 'a.out', 'elf' or 'win32'.
   16 Argument 2 is the file name.
   17 
   18 The reciprocal function is
   19 &asm_finish() which should be called at the end.
   20 
   21 There are 2 main 'packages'. x86ms.pl, which is the microsoft assembler,
   22 and x86unix.pl which is the unix (gas) version.
   23 
   24 Functions of interest are:
   25 &external_label("des_SPtrans");	declare and external variable
   26 &LB(reg);			Low byte for a register
   27 &HB(reg);			High byte for a register
   28 &BP(off,base,index,scale)	Byte pointer addressing
   29 &DWP(off,base,index,scale)	Word pointer addressing
   30 &stack_push(num)		Basically a 'sub esp, num*4' with extra
   31 &stack_pop(num)			inverse of stack_push
   32 &function_begin(name,extra)	Start a function with pushing of
   33 				edi, esi, ebx and ebp.  extra is extra win32
   34 				external info that may be required.
   35 &function_begin_B(name,extra)	Same as norma function_begin but no pushing.
   36 &function_end(name)		Call at end of function.
   37 &function_end_A(name)		Standard pop and ret, for use inside functions
   38 &function_end_B(name)		Call at end but with poping or 'ret'.
   39 &swtmp(num)			Address on stack temp word.
   40 &wparam(num)			Parameter number num, that was push
   41 				in C convention.  This all works over pushes
   42 				and pops.
   43 &comment("hello there")		Put in a comment.
   44 &label("loop")			Refer to a label, normally a jmp target.
   45 &set_label("loop")		Set a label at this point.
   46 &data_word(word)		Put in a word of data.
   47 
   48 So how does this all hold together?  Given
   49 
   50 int calc(int len, int *data)
   51 	{
   52 	int i,j=0;
   53 
   54 	for (i=0; i<len; i++)
   55 		{
   56 		j+=other(data[i]);
   57 		}
   58 	}
   59 
   60 So a very simple version of this function could be coded as
   61 
   62 	push(@INC,"perlasm","../../perlasm");
   63 	require "x86asm.pl";
   64 	
   65 	&asm_init($ARGV[0],"cacl.pl");
   66 
   67 	&external_label("other");
   68 
   69 	$tmp1=	"eax";
   70 	$j=	"edi";
   71 	$data=	"esi";
   72 	$i=	"ebp";
   73 
   74 	&comment("a simple function");
   75 	&function_begin("calc");
   76 	&mov(	$data,		&wparam(1)); # data
   77 	&xor(	$j,		$j);
   78 	&xor(	$i,		$i);
   79 
   80 	&set_label("loop");
   81 	&cmp(	$i,		&wparam(0));
   82 	&jge(	&label("end"));
   83 
   84 	&mov(	$tmp1,		&DWP(0,$data,$i,4));
   85 	&push(	$tmp1);
   86 	&call(	"other");
   87 	&add(	$j,		"eax");
   88 	&pop(	$tmp1);
   89 	&inc(	$i);
   90 	&jmp(	&label("loop"));
   91 
   92 	&set_label("end");
   93 	&mov(	"eax",		$j);
   94 
   95 	&function_end("calc");
   96 
   97 	&asm_finish();
   98 
   99 The above example is very very unoptimised but gives an idea of how
  100 things work.
  101 
  102 There is also a cbc mode function generator in cbc.pl
  103 
  104 &cbc(	$name,
  105 	$encrypt_function_name,
  106 	$decrypt_function_name,
  107 	$true_if_byte_swap_needed,
  108 	$parameter_number_for_iv,
  109 	$parameter_number_for_encrypt_flag,
  110 	$first_parameter_to_pass,
  111 	$second_parameter_to_pass,
  112 	$third_parameter_to_pass);
  113 
  114 So for example, given
  115 void BF_encrypt(BF_LONG *data,BF_KEY *key);
  116 void BF_decrypt(BF_LONG *data,BF_KEY *key);
  117 void BF_cbc_encrypt(unsigned char *in, unsigned char *out, long length,
  118         BF_KEY *ks, unsigned char *iv, int enc);
  119 
  120 &cbc("BF_cbc_encrypt","BF_encrypt","BF_encrypt",1,4,5,3,-1,-1);
  121 
  122 &cbc("des_ncbc_encrypt","des_encrypt","des_encrypt",0,4,5,3,5,-1);
  123 &cbc("des_ede3_cbc_encrypt","des_encrypt3","des_decrypt3",0,6,7,3,4,5);
  124