home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
TA2ASV08.ZIP
/
TA2AS.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-01-17
|
6KB
|
370 lines
/* TA2AS CONVERTER MODULE,
COPYRIGHT 1994 FRANK VAN DIJK, LAST UPDATE M6-21-94 11:05
*/
#include "ta2as.h"
#include <stdlib.h>
#include <string.h>
char rarray[38][4]=
{
"ah\0",
"al\0",
"ax\0",
"bh\0",
"bl\0",
"bp\0",
"bx\0",
"ch\0",
"cl\0",
"cr0",
"cr1",
"cr2",
"cr3",
"cx\0",
"dh\0",
"di\0",
"dl\0",
"dr0",
"dr1",
"dr2",
"dr3",
"dr4",
"dr5",
"dr6",
"dr7",
"dx\0",
"eax",
"ebp",
"ebx",
"ecx",
"edx",
"edi",
"esi",
"esp",
"si\0",
"sp\0",
"tr6",
"tr7"
};
#define numofmods 8
modstruct mods[numofmods]=
{
{"dosseg\0",NULL},
{"end\0\0\0\0",NULL},
{"equ\0\0\0\0",EquReshuffle},
{"extrn\0\0",NULL},
{"ideal\0\0",NULL},
{"model\0\0",NULL},
{"p386\0\0\0",NULL},
{"stack\0\0",NULL},
};
#define numofreps 19
char replace[numofreps*2][8]=
{
"cbw","cbtw",
"cdq","cltd",
"cmpsd","cmpsl",
"codeseg",".text",
"cwd","cwtd",
"cwde","cwtl",
"dataseg",".data",
"db",".byte",
"dd",".int",
"dw",".short",
"insd","insl",
"lodsd","lodsl",
"movsd","movsl",
"movsx","movs",
"movzx","movz",
"outsd","outsl",
"public",".globl",
"scasd","scasl",
"stosd","stosl",
};
void EquReshuffle(cbuf lab,cbuf com,cbuf rem,oprd *op,int hoeveel)
{
strcpy(com,lab);
strcat(com,",");
strcpy(lab,".equ");
}
int ReplaceMissch(cbuf lab,cbuf com,cbuf rem,oprd *op,int hoeveel)
{
char *p;
if(p=bsearch(com,replace,numofreps,16,(void*)stricmp))
{
strcpy(com,p+8);
return 0;
}
if (p=bsearch(lab,replace,numofreps,16,(void*)stricmp))
{
strcpy(lab,p+8);
return 1;
}
}
void ModLine(cbuf lab,cbuf com,cbuf rem,oprd *op,int *hoeveel)
{
modstruct *p;
int waslabel;
if(p=bsearch(com,mods,numofmods,sizeof(modstruct),(void *)stricmp))
{
waslabel=0;
goto roepmodder;
}
else if(p=bsearch(lab,mods,numofmods,sizeof(modstruct),(void *)stricmp))
{
waslabel=1;
roepmodder:
if(p->p)
{
if(p->p==EquReshuffle) waslabel=1; /*ieuw*/
p->p(lab,com,rem,op,*hoeveel);
}
else *lab=*com=*hoeveel=0;
}
else waslabel=ReplaceMissch(lab,com,rem,op,*hoeveel);
if(!waslabel && (waslabel=strlen(lab)) && *((lab+=waslabel)-1)!=':')
{
*(lab)=':';
*(lab+1)='\0';
}
}
int IsReg(cbuf op)
{
cbuf buf;
int len;
char temp;
strncpy(buf,op,len=strcspn(op," \t"));
*(buf+len)=0;
return (int)bsearch(strlwr(buf),rarray,38,4,(void *)strcmp);
}
void RemoveWs(cbuf op)
{
int len=strlen(op);
do
{
if(*op==' '||*op=='\t')
{
memmove(op,op+1,--len+1);
}
} while(*(op++)!=0);
}
void CrackMemInd(oprd *op)
{
int len;
cbuf disp,base,ofs,multi;
char temp;
char oldchar[2];
char *here,*opg;
disp[0]=multi[0]=0;
((unsigned short*)base)[0]=((unsigned short*)ofs)[0]=37;
((unsigned short*)oldchar)[0]=0;
opg=op->op;
opg++;
opg+=strspn(opg," \t");
len=*((int *)opg)&0xdfdfdfdf;
if(len==*(int*)"BYTE" && isspace(*(opg+4)))
{
op->flags|=1;
opg+=5;
}
else if(len==*(int*)"WORD" && isspace(*(opg+4)))
{
op->flags|=2;
opg+=5;
}
else if(len==*(int*)"DWOR" && (*(opg+4)&0xdf)=='D' && isspace(*(opg+5)))
{
op->flags|=4;
opg+=6;
}
RemoveWs(opg);
do
{
len=strcspn(opg,"+-]");
temp=*(opg+len);
*(opg+len)=0;
if(here=strchr(opg,'*'))
{
*here=0;
if(IsReg(opg))
{
strcpy(ofs+1,opg);
strcpy(multi,here+1);
}
else if(IsReg(here+1))
{
strcpy(ofs+1,here+1);
strcpy(multi,opg);
}
else
{
*here='*';
goto concatdisp;
}
}
else
{
if(IsReg(opg))
{
if(*(base+1)) strcpy(ofs+1,opg);
else strcpy(base+1,opg);
}
else
{
concatdisp:
strcat(disp,oldchar);
strcat(disp,opg);
}
}
if(temp==']') break;
*oldchar=temp;
opg+=len+1;
} while(1);
opg=op->op;
*opg=0;
strcat(opg,*disp=='+'?disp+1:disp);
if(*(base+1)||*(ofs+1))
{
strcat(opg,"(");
if (*(base+1)) strcat(opg,base);
if (*(ofs+1))
{
strcat(opg,",");
strcat(opg,ofs);
if(*multi)
{
strcat(opg,",");
strcat(opg,multi);
}
}
strcat(opg,")");
}
}
void HexBin(oprd *op)
{
int len,len2;
char *opg=op->op;
while(len=strcspn(opg,"0123456789"),opg+=len,isdigit(*opg))
{
len2=strspn(opg,"0123456789abcdefABCDEF");
if(len && (isalpha(*(opg-1)) || *(opg-1)=='@' || *(opg-1)=='_'))
{
}
else
{
char ch;
if((*(opg+len2)&0xdf)=='H')
{
ch='x';
frot:
memmove(opg+len2+1,opg+len2,strlen(opg+len2)+1);
memmove(opg+2,opg,len2);
*opg='0';
*(++opg)=ch;
}
else if((*(opg+len2-1)&0xdf)=='B')
{
len2--;
ch='B';
goto frot;
}
}
opg+=len2;
}
}
int Operand2Operand(oprd *op)
{
char *temp,*opg;
opg=op->op;
opg+=strspn(opg," \t");
if(*opg=='[')
{
CrackMemInd(op);
}
else if(!strnicmp(opg,"offset",6))
{
temp=opg+6;
temp+=strspn(temp," \t");
*--temp='$';
memmove(opg,temp,strlen(temp)+1);
}
else if(IsReg(opg))
{
int len=strcspn(opg," \t");
if (len==2)
{
if (opg[len-1]=='l' || opg[len-1]=='h') op->flags|=1;
else op->flags|=2;
}
else op->flags|=4;
memmove(opg+1,opg,len+1);
*opg='%';
}
else
{
memmove(opg+1,opg,strlen(opg)+1);
*opg='$';
}
HexBin(op);
{
int len=strlen(opg)-1;
while(opg[len]==' '||opg[len]=='\t')
opg[len--]=0;
}
return 1;
}
int ChopEm(cbuf in,cbuf lab,cbuf com,cbuf rem,oprd *op,int *hoeveel)
{
char *p;
int len,teller=0;
if(!isspace(in[0])) /*label*/
{
if(*in==';') goto restisremark;
len=strcspn(in," \t;");
strncpy(lab,in,len);
*(lab+len)=0;
in+=len;
}
else *lab=0;
in+=strspn(in," \t");
if(*in==';') goto restisremark;
len=strcspn(in," \t;");
strncpy(com,in,len);
*(com+len)=0;
in+=len;
if(*in==';')
goto restisremark;
in+=strspn(in," \t");
while(*in!=0 && *in!=';'&& teller<32)
{
len=strcspn(in,",;");
strncpy(op[teller].op,in,len);
*(op[teller++].op+len)=0;
/*if (*(in+len)==',') len++;*/
in+=strspn(in+=len," \t,");
}
if (*in==';')
restisremark:
{
*in='#';
strcpy(rem,in);
}
*hoeveel=teller;
return 1;
}