Encrypt
Assembler code for encrypting a number
Introduction
Peter uses this program to experiment with assembler code. He converts a secret number (5683063) digit-by-digit to an encrypted number. The first encrypted digit (4) is the zero-based position of the first digit (5) in the first row of digits in the two-dimensional array. The second encrypted digit (4) is the zero-based position of the second digit (6) in the second row of digits in the two-dimensional array. Similarly, each of the remaining five encrypted digits is the zero-based position of the original digit in its row.
The Program
program Encrypt; { Copyright (c) 2011 Peter Hearnshaw Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License, as described at http://www.apache.org/licenses/ and http://www.pp4s.co.uk/licenses/ } {$APPTYPE CONSOLE} {$ASMMODE INTEL}//Delete this line in Delphi uses SysUtils; var i : integer; theKey, fbyte, currentNumOfSecret, newValue, tempAddr, ArrValue : byte; secret:string; total : array [1..7, 1..10] of byte = ( (1,2,3,4,5,6,7,8,9,0), (2,3,4,5,6,7,8,9,0,1), (3,4,5,6,7,8,9,0,1,2), (4,5,6,7,8,9,0,1,2,3), (5,6,7,8,9,0,1,2,3,4), (6,7,8,9,0,1,2,3,4,5), (0,1,2,3,4,5,6,7,8,9)); newEncodedNum : array [1..10] of char; begin secret := '5683063'; //Put in your secret number here for i:=1 to 10 do newEncodedNum[i] := chr(0); asm push 7 //i am using the stack as a store like that of a count register //of the @goThroughRowSecretNum: loop mov dl, 7 @goThroughRowSecretNum: lea eax, secret //this... add eax, dl mov edx, [eax] sub edx, 48 mov currentNumOfSecret, edx //To this - is the code to put the current char //of the secret number (we are going through each char of the secret number) into currentNumOfSecret mov eax, 0 mov ebx, 0 mov ecx, 0 mov edx, 0 mov tempAddr, 0 mov ArrValue, 0 mov newValue, 0 mov fbyte, 0 mov cl, 10 mov ebx, 0 @goThroughRow: //go through row of array of Total //Go through each element lea eax, total //-1 is to make sure 0 value of array is used add eax, 10 sub eax, cl //this bit makes sure we look to the correct row of the array pop edx //pops off the value of the count into edx, so it can be used from the register push edx //pushes the value of count onto the stack so it can be used again sub edx, 1 imul edx, 10 add eax, edx mov eax, [eax] mov ArrValue, eax //END go through each element //newValue equals index containing value in al mov al, currentNumOfSecret cmp ArrValue, al jne @finish add newValue, 10 //this sub newValue, cl //and this line are used to give the value of the index rather than the position // of the element from the end of the array @finish: //END newValue equals index containing value in al loop @goThroughRow pop edx //pops value of count into edx where in line 84 it will be decr. // Then pushed again to continue the iteration lea eax, newEncodedNum //put address of the new encoded number array into eax add eax, dl //add the offset of where we want to add the new number character into the array //This is because we are working char by char through the secret number and putting the encoded value into the new array add newValue, 48 //start newValue of at ascii 0 mov bl, newValue mov [eax-1], bl //put the newValue of the char into the address of the offset of the newEncodedNum array add theKey, 1 dec edx push edx cmp edx, 0 //iteration depends on edx which is the temporary register store //of count which is usually kept on the stack. jg @goThroughRowSecretNum end; for i:=1 to 10 do //write out the new encoded number array write(newEncodedNum[i]); readln; end.
Remarks
Can you think of a program like this that you could write?