# 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;
{

use this file except in compliance with the License, as described at
}
{\$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...
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 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
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
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
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

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]);