x
This commit is contained in:
parent
9b9df8be6e
commit
10bcaa2caf
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
tests/outputs/*
|
||||||
|
bld
|
||||||
@ -20,7 +20,12 @@ typedef lFunction::iterator ilFunction;
|
|||||||
|
|
||||||
|
|
||||||
/* SYMBOL TABLE */
|
/* SYMBOL TABLE */
|
||||||
struct SYM {
|
struct SYM
|
||||||
|
{
|
||||||
|
SYM() : label(0),size(0),flg(0),type(TYPE_UNKNOWN)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
char name[10]; /* New name for this variable */
|
char name[10]; /* New name for this variable */
|
||||||
dword label; /* physical address (20 bit) */
|
dword label; /* physical address (20 bit) */
|
||||||
Int size; /* maximum size */
|
Int size; /* maximum size */
|
||||||
@ -29,13 +34,7 @@ struct SYM {
|
|||||||
eDuVal duVal; /* DEF, USE, VAL */
|
eDuVal duVal; /* DEF, USE, VAL */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SYMTAB
|
typedef std::vector<SYM> SYMTAB;
|
||||||
{
|
|
||||||
Int csym; /* No. of symbols in table */
|
|
||||||
Int alloc; /* Allocation */
|
|
||||||
SYM * sym; /* Symbols */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* CALL GRAPH NODE */
|
/* CALL GRAPH NODE */
|
||||||
struct CALL_GRAPH
|
struct CALL_GRAPH
|
||||||
{
|
{
|
||||||
|
|||||||
@ -332,7 +332,7 @@ struct DU1
|
|||||||
bool isLlFlag(dword flg) {return (ic.ll.flg&flg)==flg;}
|
bool isLlFlag(dword flg) {return (ic.ll.flg&flg)==flg;}
|
||||||
llIcode GetLlOpcode() const { return ic.ll.opcode; }
|
llIcode GetLlOpcode() const { return ic.ll.opcode; }
|
||||||
|
|
||||||
void writeIntComment(char *s);
|
void writeIntComment(std::ostringstream &s);
|
||||||
void setRegDU(byte regi, operDu du_in);
|
void setRegDU(byte regi, operDu du_in);
|
||||||
void invalidate();
|
void invalidate();
|
||||||
void newCallHl();
|
void newCallHl();
|
||||||
@ -343,7 +343,7 @@ struct DU1
|
|||||||
void setUnary(hlIcode op, COND_EXPR *exp);
|
void setUnary(hlIcode op, COND_EXPR *exp);
|
||||||
void setJCond(COND_EXPR *cexp);
|
void setJCond(COND_EXPR *cexp);
|
||||||
void emitGotoLabel(Int indLevel);
|
void emitGotoLabel(Int indLevel);
|
||||||
void copyDU(const ICODE &duIcode, operDu _du, operDu duDu);
|
void copyDU(const ICODE &duIcode, operDu _du, operDu duDu);
|
||||||
public:
|
public:
|
||||||
boolT removeDefRegi(byte regi, Int thisDefIdx, LOCAL_ID *locId);
|
boolT removeDefRegi(byte regi, Int thisDefIdx, LOCAL_ID *locId);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -12,10 +12,6 @@ struct SYMTABLE
|
|||||||
std::string pSymName; /* Ptr to symbolic name or comment */
|
std::string pSymName; /* Ptr to symbolic name or comment */
|
||||||
dword symOff; /* Symbol image offset */
|
dword symOff; /* Symbol image offset */
|
||||||
Function *symProc; /* Procedure pointer */
|
Function *symProc; /* Procedure pointer */
|
||||||
word preHash; /* Hash value before the modulo */
|
|
||||||
word postHash; /* Hash value after the modulo */
|
|
||||||
word nextOvf; /* Next entry this hash bucket, or -1 */
|
|
||||||
word prevOvf; /* Back link in Ovf chain */
|
|
||||||
SYMTABLE() : symOff(0),symProc(0) {}
|
SYMTABLE() : symOff(0),symProc(0) {}
|
||||||
SYMTABLE(dword _sym,Function *_proc) : symOff(_sym),symProc(_proc)
|
SYMTABLE(dword _sym,Function *_proc) : symOff(_sym),symProc(_proc)
|
||||||
{}
|
{}
|
||||||
@ -36,6 +32,6 @@ enum tableType /* The table types */
|
|||||||
|
|
||||||
void createSymTables(void);
|
void createSymTables(void);
|
||||||
void destroySymTables(void);
|
void destroySymTables(void);
|
||||||
boolT readVal (char *symName, dword symOff, Function *symProc);
|
boolT readVal (std::ostringstream &symName, dword symOff, Function *symProc);
|
||||||
void selectTable(tableType); /* Select a particular table */
|
void selectTable(tableType); /* Select a particular table */
|
||||||
|
|
||||||
|
|||||||
@ -58,6 +58,10 @@ typedef unsigned char boolT; /* 8 bits */
|
|||||||
/* duVal FLAGS */
|
/* duVal FLAGS */
|
||||||
struct eDuVal
|
struct eDuVal
|
||||||
{
|
{
|
||||||
|
eDuVal()
|
||||||
|
{
|
||||||
|
def=use=val=0;
|
||||||
|
}
|
||||||
enum flgs
|
enum flgs
|
||||||
{
|
{
|
||||||
DEF=1,
|
DEF=1,
|
||||||
|
|||||||
@ -14,7 +14,7 @@ def perform_test(exepath,filepath,outname)
|
|||||||
filepath=path_local(filepath)
|
filepath=path_local(filepath)
|
||||||
printf("calling:" + "#{exepath} -a1 -o#{output_path}.a1 #{filepath}\n")
|
printf("calling:" + "#{exepath} -a1 -o#{output_path}.a1 #{filepath}\n")
|
||||||
result = `#{exepath} -a1 -o#{output_path}.a1 #{filepath}`
|
result = `#{exepath} -a1 -o#{output_path}.a1 #{filepath}`
|
||||||
result = `#{exepath} -a2 -o#{output_path}.a2 #{filepath}`
|
result = `#{exepath} -a2msc -o#{output_path}.a2 #{filepath}`
|
||||||
puts result
|
puts result
|
||||||
p $?
|
p $?
|
||||||
end
|
end
|
||||||
|
|||||||
12
src/ast.cpp
12
src/ast.cpp
@ -151,10 +151,10 @@ COND_EXPR *COND_EXPR::idGlob (int16 segValue, int16 off)
|
|||||||
newExp = newCondExp (IDENTIFIER);
|
newExp = newCondExp (IDENTIFIER);
|
||||||
newExp->expr.ident.idType = GLOB_VAR;
|
newExp->expr.ident.idType = GLOB_VAR;
|
||||||
adr = opAdr(segValue, off);
|
adr = opAdr(segValue, off);
|
||||||
for (i = 0; i < symtab.csym; i++)
|
for (i = 0; i < symtab.size(); i++)
|
||||||
if (symtab.sym[i].label == adr)
|
if (symtab[i].label == adr)
|
||||||
break;
|
break;
|
||||||
if (i == symtab.csym)
|
if (i == symtab.size())
|
||||||
printf ("Error, glob var not found in symtab\n");
|
printf ("Error, glob var not found in symtab\n");
|
||||||
newExp->expr.ident.idNode.globIdx = i;
|
newExp->expr.ident.idNode.globIdx = i;
|
||||||
return (newExp);
|
return (newExp);
|
||||||
@ -511,7 +511,7 @@ Int hlTypeSize (const COND_EXPR *expr, Function * pproc)
|
|||||||
switch (expr->expr.ident.idType)
|
switch (expr->expr.ident.idType)
|
||||||
{
|
{
|
||||||
case GLOB_VAR:
|
case GLOB_VAR:
|
||||||
return (symtab.sym[expr->expr.ident.idNode.globIdx].size);
|
return (symtab[expr->expr.ident.idNode.globIdx].size);
|
||||||
case REGISTER:
|
case REGISTER:
|
||||||
if (expr->expr.ident.regiType == BYTE_REG)
|
if (expr->expr.ident.regiType == BYTE_REG)
|
||||||
return (1);
|
return (1);
|
||||||
@ -574,7 +574,7 @@ hlType expType (const COND_EXPR *expr, Function * pproc)
|
|||||||
switch (expr->expr.ident.idType)
|
switch (expr->expr.ident.idType)
|
||||||
{
|
{
|
||||||
case GLOB_VAR:
|
case GLOB_VAR:
|
||||||
return (symtab.sym[expr->expr.ident.idNode.globIdx].type);
|
return (symtab[expr->expr.ident.idNode.globIdx].type);
|
||||||
case REGISTER:
|
case REGISTER:
|
||||||
if (expr->expr.ident.regiType == BYTE_REG)
|
if (expr->expr.ident.regiType == BYTE_REG)
|
||||||
return (TYPE_BYTE_SIGN);
|
return (TYPE_BYTE_SIGN);
|
||||||
@ -734,7 +734,7 @@ string walkCondExpr (const COND_EXPR* expr, Function * pProc, Int* numLoc)
|
|||||||
switch (expr->expr.ident.idType)
|
switch (expr->expr.ident.idType)
|
||||||
{
|
{
|
||||||
case GLOB_VAR:
|
case GLOB_VAR:
|
||||||
o << symtab.sym[expr->expr.ident.idNode.globIdx].name;
|
o << symtab[expr->expr.ident.idNode.globIdx].name;
|
||||||
break;
|
break;
|
||||||
case REGISTER:
|
case REGISTER:
|
||||||
id = &pProc->localId.id_arr[expr->expr.ident.idNode.regiIdx];
|
id = &pProc->localId.id_arr[expr->expr.ident.idNode.regiIdx];
|
||||||
|
|||||||
@ -146,14 +146,14 @@ static void writeGlobSymTable()
|
|||||||
char type[10];
|
char type[10];
|
||||||
SYM * pSym;
|
SYM * pSym;
|
||||||
|
|
||||||
if (symtab.csym)
|
if (not symtab.empty())
|
||||||
{
|
{
|
||||||
cCode.appendDecl( "/* Global variables */\n");
|
cCode.appendDecl( "/* Global variables */\n");
|
||||||
for (idx = 0; idx < symtab.csym; idx++)
|
for (idx = 0; idx < symtab.size(); idx++)
|
||||||
{
|
{
|
||||||
pSym = &symtab.sym[idx];
|
pSym = &symtab[idx];
|
||||||
if (symtab.sym[idx].duVal.isUSE_VAL()) /* first used */
|
if (symtab[idx].duVal.isUSE_VAL()) /* first used */
|
||||||
printGlobVar (&(symtab.sym[idx]));
|
printGlobVar (&symtab[idx]);
|
||||||
else { /* first defined */
|
else { /* first defined */
|
||||||
switch (pSym->size) {
|
switch (pSym->size) {
|
||||||
case 1: strcpy (type, "byte\t"); break;
|
case 1: strcpy (type, "byte\t"); break;
|
||||||
|
|||||||
@ -694,7 +694,7 @@ void STATE::checkStartup()
|
|||||||
but decides the model required. Note: must do the far data models
|
but decides the model required. Note: must do the far data models
|
||||||
(large and compact) before the others, since they are the same pattern
|
(large and compact) before the others, since they are the same pattern
|
||||||
as near data, just more pushes at the start. */
|
as near data, just more pushes at the start. */
|
||||||
if(prog.cbImage>0x180+sizeof(pattMainLarge))
|
if(prog.cbImage>startOff+0x180+sizeof(pattMainLarge))
|
||||||
{
|
{
|
||||||
if (locatePattern(prog.Image, startOff, startOff+0x180, pattMainLarge,sizeof(pattMainLarge), &i))
|
if (locatePattern(prog.Image, startOff, startOff+0x180, pattMainLarge,sizeof(pattMainLarge), &i))
|
||||||
{
|
{
|
||||||
|
|||||||
253
src/comwrite.cpp
253
src/comwrite.cpp
@ -8,118 +8,121 @@
|
|||||||
|
|
||||||
#include "dcc.h"
|
#include "dcc.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sstream>
|
||||||
|
using namespace std;
|
||||||
#define intSize 40
|
#define intSize 40
|
||||||
|
|
||||||
static const char *int21h[] =
|
static const char *int21h[] =
|
||||||
{"Terminate process",
|
{
|
||||||
"Character input with echo",
|
"Terminate process",
|
||||||
"Character output",
|
"Character input with echo",
|
||||||
"Auxiliary input",
|
"Character output",
|
||||||
"Auxiliary output",
|
"Auxiliary input",
|
||||||
"Printer output",
|
"Auxiliary output",
|
||||||
"Direct console i/o",
|
"Printer output",
|
||||||
"Unfiltered char i w/o echo",
|
"Direct console i/o",
|
||||||
"Character input without echo",
|
"Unfiltered char i w/o echo",
|
||||||
"Display string",
|
"Character input without echo",
|
||||||
"Buffered keyboard input",
|
"Display string",
|
||||||
"Check input status",
|
"Buffered keyboard input",
|
||||||
"Flush input buffer and then input",
|
"Check input status",
|
||||||
"Disk reset",
|
"Flush input buffer and then input",
|
||||||
"Select disk",
|
"Disk reset",
|
||||||
"Open file",
|
"Select disk",
|
||||||
"Close file",
|
"Open file",
|
||||||
"Find first file",
|
"Close file",
|
||||||
"Find next file",
|
"Find first file",
|
||||||
"Delete file",
|
"Find next file",
|
||||||
"Sequential read",
|
"Delete file",
|
||||||
"Sequential write",
|
"Sequential read",
|
||||||
"Create file",
|
"Sequential write",
|
||||||
"Rename file",
|
"Create file",
|
||||||
"Reserved",
|
"Rename file",
|
||||||
"Get current disk",
|
"Reserved",
|
||||||
"Set DTA address",
|
"Get current disk",
|
||||||
"Get default drive data",
|
"Set DTA address",
|
||||||
"Get drive data",
|
"Get default drive data",
|
||||||
"Reserved",
|
"Get drive data",
|
||||||
"Reserved",
|
"Reserved",
|
||||||
"Reserved",
|
"Reserved",
|
||||||
"Reserved",
|
"Reserved",
|
||||||
"Random read",
|
"Reserved",
|
||||||
"Random write",
|
"Random read",
|
||||||
"Get file size",
|
"Random write",
|
||||||
"Set relative record number",
|
"Get file size",
|
||||||
"Set interrupt vector",
|
"Set relative record number",
|
||||||
"Create new PSP",
|
"Set interrupt vector",
|
||||||
"Random block read",
|
"Create new PSP",
|
||||||
"Random block write",
|
"Random block read",
|
||||||
"Parse filename",
|
"Random block write",
|
||||||
"Get date",
|
"Parse filename",
|
||||||
"Set date",
|
"Get date",
|
||||||
"Get time",
|
"Set date",
|
||||||
"Set time",
|
"Get time",
|
||||||
"Set verify flag",
|
"Set time",
|
||||||
"Get DTA address",
|
"Set verify flag",
|
||||||
"Get MSDOS version number",
|
"Get DTA address",
|
||||||
"Terminate and stay resident",
|
"Get MSDOS version number",
|
||||||
"Reserved",
|
"Terminate and stay resident",
|
||||||
"Get or set break flag",
|
"Reserved",
|
||||||
"Reserved",
|
"Get or set break flag",
|
||||||
"Get interrupt vector",
|
"Reserved",
|
||||||
"Get drive allocation info",
|
"Get interrupt vector",
|
||||||
"Reserved",
|
"Get drive allocation info",
|
||||||
"Get or set country info",
|
"Reserved",
|
||||||
"Create directory",
|
"Get or set country info",
|
||||||
"Delete directory",
|
"Create directory",
|
||||||
"Set current directory",
|
"Delete directory",
|
||||||
"Create file",
|
"Set current directory",
|
||||||
"Open file",
|
"Create file",
|
||||||
"Close file",
|
"Open file",
|
||||||
"Read file or device",
|
"Close file",
|
||||||
"Write file or device",
|
"Read file or device",
|
||||||
"Delete file",
|
"Write file or device",
|
||||||
"Set file pointer",
|
"Delete file",
|
||||||
"Get or set file attributes",
|
"Set file pointer",
|
||||||
"IOCTL (i/o control)",
|
"Get or set file attributes",
|
||||||
"Duplicate handle",
|
"IOCTL (i/o control)",
|
||||||
"Redirect handle",
|
"Duplicate handle",
|
||||||
"Get current directory",
|
"Redirect handle",
|
||||||
"Alloate memory block",
|
"Get current directory",
|
||||||
"Release memory block",
|
"Alloate memory block",
|
||||||
"Resize memory block",
|
"Release memory block",
|
||||||
"Execute program (exec)",
|
"Resize memory block",
|
||||||
"Terminate process with return code",
|
"Execute program (exec)",
|
||||||
"Get return code",
|
"Terminate process with return code",
|
||||||
"Find first file",
|
"Get return code",
|
||||||
"Find next file",
|
"Find first file",
|
||||||
"Reserved",
|
"Find next file",
|
||||||
"Reserved",
|
"Reserved",
|
||||||
"Reserved",
|
"Reserved",
|
||||||
"Reserved",
|
"Reserved",
|
||||||
"Get verify flag",
|
"Reserved",
|
||||||
"Reserved",
|
"Get verify flag",
|
||||||
"Rename file",
|
"Reserved",
|
||||||
"Get or set file date & time",
|
"Rename file",
|
||||||
"Get or set allocation strategy",
|
"Get or set file date & time",
|
||||||
"Get extended error information",
|
"Get or set allocation strategy",
|
||||||
"Create temporary file",
|
"Get extended error information",
|
||||||
"Create new file",
|
"Create temporary file",
|
||||||
"Lock or unlock file region",
|
"Create new file",
|
||||||
"Reserved",
|
"Lock or unlock file region",
|
||||||
"Get machine name",
|
"Reserved",
|
||||||
"Device redirection",
|
"Get machine name",
|
||||||
"Reserved",
|
"Device redirection",
|
||||||
"Reserved",
|
"Reserved",
|
||||||
"Get PSP address",
|
"Reserved",
|
||||||
"Get DBCS lead byte table",
|
"Get PSP address",
|
||||||
"Reserved",
|
"Get DBCS lead byte table",
|
||||||
"Get extended country information",
|
"Reserved",
|
||||||
"Get or set code page",
|
"Get extended country information",
|
||||||
"Set handle count",
|
"Get or set code page",
|
||||||
"Commit file",
|
"Set handle count",
|
||||||
"Reserved",
|
"Commit file",
|
||||||
"Reserved",
|
"Reserved",
|
||||||
"Reserved",
|
"Reserved",
|
||||||
"Extended open file"
|
"Reserved",
|
||||||
|
"Extended open file"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -144,33 +147,37 @@ static const char *intOthers[] = {
|
|||||||
|
|
||||||
/* Writes the description of the current interrupt. Appends it to the
|
/* Writes the description of the current interrupt. Appends it to the
|
||||||
* string s. */
|
* string s. */
|
||||||
void ICODE::writeIntComment (char *s)
|
void ICODE::writeIntComment (std::ostringstream &s)
|
||||||
{
|
{
|
||||||
char *t;
|
s<<"\t/* ";
|
||||||
|
|
||||||
t = (char *)allocMem(intSize * sizeof(char));
|
|
||||||
if (ic.ll.immed.op == 0x21)
|
if (ic.ll.immed.op == 0x21)
|
||||||
{ sprintf (t, "\t/* %s */\n", int21h[ic.ll.dst.off]);
|
{
|
||||||
strcat (s, t);
|
s <<int21h[ic.ll.dst.off];
|
||||||
}
|
}
|
||||||
else if (ic.ll.immed.op > 0x1F && ic.ll.immed.op < 0x2F)
|
else if (ic.ll.immed.op > 0x1F && ic.ll.immed.op < 0x2F)
|
||||||
{
|
{
|
||||||
sprintf (t, "\t/* %s */\n", intOthers[ic.ll.immed.op - 0x20]);
|
s <<intOthers[ic.ll.immed.op - 0x20];
|
||||||
strcat (s, t);
|
|
||||||
}
|
}
|
||||||
else if (ic.ll.immed.op == 0x2F)
|
else if (ic.ll.immed.op == 0x2F)
|
||||||
|
{
|
||||||
switch (ic.ll.dst.off)
|
switch (ic.ll.dst.off)
|
||||||
{
|
{
|
||||||
case 0x01 : strcat (s, "\t/* Print spooler */\n");
|
case 0x01 :
|
||||||
|
s << "Print spooler";
|
||||||
break;
|
break;
|
||||||
case 0x02: strcat (s, "\t/* Assign */\n");
|
case 0x02:
|
||||||
|
s << "Assign";
|
||||||
break;
|
break;
|
||||||
case 0x10: strcat (s, "\t/* Share */\n");
|
case 0x10:
|
||||||
|
s << "Share";
|
||||||
break;
|
break;
|
||||||
case 0xB7: strcat (s, "\t/* Append */\n");
|
case 0xB7:
|
||||||
|
s << "Append";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
strcat (s, "\n");
|
s<<"Unknown int";
|
||||||
|
s<<" */\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -247,7 +254,7 @@ void Function::writeProcComments()
|
|||||||
if (this->flg & (PROC_BADINST | PROC_IJMP))
|
if (this->flg & (PROC_BADINST | PROC_IJMP))
|
||||||
cCode.appendDecl(" * Incomplete due to an %s.\n",
|
cCode.appendDecl(" * Incomplete due to an %s.\n",
|
||||||
(this->flg & PROC_BADINST)? "untranslated opcode":
|
(this->flg & PROC_BADINST)? "untranslated opcode":
|
||||||
"indirect JMP");
|
"indirect JMP");
|
||||||
if (this->flg & PROC_ICALL)
|
if (this->flg & PROC_ICALL)
|
||||||
cCode.appendDecl(" * Indirect call procedure.\n");
|
cCode.appendDecl(" * Indirect call procedure.\n");
|
||||||
if (this->flg & IMPURE)
|
if (this->flg & IMPURE)
|
||||||
|
|||||||
114
src/dcc.cpp
114
src/dcc.cpp
@ -56,14 +56,14 @@ int main(int argc, char *argv[])
|
|||||||
* analysis, data flow etc. and outputs it to output file ready for
|
* analysis, data flow etc. and outputs it to output file ready for
|
||||||
* re-compilation.
|
* re-compilation.
|
||||||
*/
|
*/
|
||||||
BackEnd(option.filename, callGraph);
|
BackEnd(option.filename, callGraph);
|
||||||
|
|
||||||
callGraph->write();
|
callGraph->write();
|
||||||
|
|
||||||
if (option.Stats)
|
if (option.Stats)
|
||||||
displayTotalStats();
|
displayTotalStats();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
freeDataStructures(pProcList);
|
freeDataStructures(pProcList);
|
||||||
*/
|
*/
|
||||||
return 0;
|
return 0;
|
||||||
@ -77,62 +77,64 @@ static char *initargs(int argc, char *argv[])
|
|||||||
char *pc;
|
char *pc;
|
||||||
progname = *argv; /* Save invocation name for error messages */
|
progname = *argv; /* Save invocation name for error messages */
|
||||||
|
|
||||||
while (--argc > 0 && (*++argv)[0] == '-') {
|
while (--argc > 0 && (*++argv)[0] == '-')
|
||||||
|
{
|
||||||
for (pc = argv[0]+1; *pc; pc++)
|
for (pc = argv[0]+1; *pc; pc++)
|
||||||
switch (*pc) {
|
switch (*pc)
|
||||||
case 'a': /* Print assembler listing */
|
{
|
||||||
if (*(pc+1) == '2')
|
case 'a': /* Print assembler listing */
|
||||||
option.asm2 = TRUE;
|
if (*(pc+1) == '2')
|
||||||
else
|
option.asm2 = TRUE;
|
||||||
option.asm1 = TRUE;
|
else
|
||||||
if (*(pc+1) == '1' || *(pc+1) == '2')
|
option.asm1 = TRUE;
|
||||||
pc++;
|
if (*(pc+1) == '1' || *(pc+1) == '2')
|
||||||
break;
|
pc++;
|
||||||
case 'c':
|
break;
|
||||||
option.Calls = TRUE;
|
case 'c':
|
||||||
break;
|
option.Calls = TRUE;
|
||||||
case 'i':
|
break;
|
||||||
option.Interact = TRUE;
|
case 'i':
|
||||||
break;
|
option.Interact = TRUE;
|
||||||
case 'm': /* Print memory map */
|
break;
|
||||||
option.Map = TRUE;
|
case 'm': /* Print memory map */
|
||||||
break;
|
option.Map = TRUE;
|
||||||
case 's': /* Print Stats */
|
break;
|
||||||
option.Stats = TRUE;
|
case 's': /* Print Stats */
|
||||||
break;
|
option.Stats = TRUE;
|
||||||
case 'V': /* Very verbose => verbose */
|
break;
|
||||||
option.VeryVerbose = TRUE;
|
case 'V': /* Very verbose => verbose */
|
||||||
case 'v': /* Make everything verbose */
|
option.VeryVerbose = TRUE;
|
||||||
option.verbose = TRUE;
|
case 'v': /* Make everything verbose */
|
||||||
break;
|
option.verbose = TRUE;
|
||||||
case 'o': /* assembler output file */
|
break;
|
||||||
if (*(pc+1)) {
|
case 'o': /* assembler output file */
|
||||||
asm1_name = asm2_name = pc+1;
|
if (*(pc+1)) {
|
||||||
goto NextArg;
|
asm1_name = asm2_name = pc+1;
|
||||||
}
|
goto NextArg;
|
||||||
else if (--argc > 0) {
|
}
|
||||||
asm1_name = asm2_name = *++argv;
|
else if (--argc > 0) {
|
||||||
goto NextArg;
|
asm1_name = asm2_name = *++argv;
|
||||||
}
|
goto NextArg;
|
||||||
default:
|
}
|
||||||
fatalError(INVALID_ARG, *pc);
|
default:
|
||||||
return *argv;
|
fatalError(INVALID_ARG, *pc);
|
||||||
|
return *argv;
|
||||||
}
|
}
|
||||||
NextArg:;
|
NextArg:;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argc == 1)
|
if (argc == 1)
|
||||||
{
|
{
|
||||||
if (option.asm1 || option.asm2)
|
if (option.asm1 || option.asm2)
|
||||||
{
|
{
|
||||||
if (! asm1_name)
|
if (! asm1_name)
|
||||||
{
|
{
|
||||||
asm1_name = strcpy((char*)allocMem(strlen(*argv)+4), *argv);
|
asm1_name = strcpy((char*)allocMem(strlen(*argv)+4), *argv);
|
||||||
pc = strrchr(asm1_name, '.');
|
pc = strrchr(asm1_name, '.');
|
||||||
if (pc > strrchr(asm1_name, '/'))
|
if (pc > strrchr(asm1_name, '/'))
|
||||||
{
|
{
|
||||||
*pc = '\0';
|
*pc = '\0';
|
||||||
}
|
}
|
||||||
asm2_name = (char*)allocMem(strlen(asm1_name)+4) ;
|
asm2_name = (char*)allocMem(strlen(asm1_name)+4) ;
|
||||||
strcat(strcpy(asm2_name, asm1_name), ".a2");
|
strcat(strcpy(asm2_name, asm1_name), ".a2");
|
||||||
unlink(asm2_name);
|
unlink(asm2_name);
|
||||||
@ -141,7 +143,7 @@ static char *initargs(int argc, char *argv[])
|
|||||||
unlink(asm1_name); /* Remove asm output files */
|
unlink(asm1_name); /* Remove asm output files */
|
||||||
}
|
}
|
||||||
return *argv; /* filename of the program to decompile */
|
return *argv; /* filename of the program to decompile */
|
||||||
}
|
}
|
||||||
|
|
||||||
fatalError(USAGE);
|
fatalError(USAGE);
|
||||||
return *argv;
|
return *argv;
|
||||||
@ -151,11 +153,11 @@ static void
|
|||||||
displayTotalStats ()
|
displayTotalStats ()
|
||||||
/* Displays final statistics for the complete program */
|
/* Displays final statistics for the complete program */
|
||||||
{
|
{
|
||||||
printf ("\nFinal Program Statistics\n");
|
printf ("\nFinal Program Statistics\n");
|
||||||
printf (" Total number of low-level Icodes : %ld\n", stats.totalLL);
|
printf (" Total number of low-level Icodes : %ld\n", stats.totalLL);
|
||||||
printf (" Total number of high-level Icodes: %ld\n", stats.totalHL);
|
printf (" Total number of high-level Icodes: %ld\n", stats.totalHL);
|
||||||
printf (" Total reduction of instructions : %2.2f%%\n", 100.0 -
|
printf (" Total reduction of instructions : %2.2f%%\n", 100.0 -
|
||||||
(stats.totalHL * 100.0) / stats.totalLL);
|
(stats.totalHL * 100.0) / stats.totalLL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
320
src/disassem.cpp
320
src/disassem.cpp
@ -9,6 +9,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <malloc.h> /* For free() */
|
#include <malloc.h> /* For free() */
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iomanip>
|
||||||
#ifdef _CONSOLE
|
#ifdef _CONSOLE
|
||||||
#include <windows.h> /* For console mode routines */
|
#include <windows.h> /* For console mode routines */
|
||||||
#endif
|
#endif
|
||||||
@ -122,24 +124,24 @@ static const char *szIndex[8] = {"bx+si", "bx+di", "bp+si", "bp+di", "si", "di",
|
|||||||
static const char *szBreg[8] = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh" };
|
static const char *szBreg[8] = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh" };
|
||||||
static const char *szWreg[12] = { "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
|
static const char *szWreg[12] = { "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
|
||||||
"es", "cs", "ss", "ds" };
|
"es", "cs", "ss", "ds" };
|
||||||
static const char *szPtr[2] = { " word ptr ", " byte ptr " };
|
static const char *szPtr[2] = { "word ptr ", "byte ptr " };
|
||||||
|
|
||||||
|
|
||||||
static void dis1Line (Int i, Int pass);
|
static void dis1Line (Int i, Int pass);
|
||||||
void dis1LineOp(Int i, boolT fWin, char attr, word *len, Function * pProc);
|
void dis1LineOp(Int i, boolT fWin, char attr, word *len, Function * pProc);
|
||||||
static void formatRM(char *p, flags32 flg, ICODEMEM* pm);
|
static void formatRM(ostringstream &p, flags32 flg, ICODEMEM* pm);
|
||||||
static char *strDst(flags32 flg, ICODEMEM *pm);
|
static ostringstream &strDst(ostringstream &os, flags32 flg, ICODEMEM *pm);
|
||||||
static char *strSrc(ICODE * pc);
|
static ostringstream &strSrc(ostringstream &os, ICODE *pc, bool skip_comma=false);
|
||||||
static char *strHex(dword d);
|
static char *strHex(dword d);
|
||||||
static Int checkScanned(dword pcCur);
|
static Int checkScanned(dword pcCur);
|
||||||
static void setProc(Function * proc);
|
static void setProc(Function * proc);
|
||||||
static void dispData(word dataSeg);
|
static void dispData(word dataSeg);
|
||||||
static void flops(ICODE * pi);
|
void flops(ICODE *pIcode,std::ostringstream &out);
|
||||||
boolT callArg(word off, char *temp); /* Check for procedure name */
|
boolT callArg(word off, char *temp); /* Check for procedure name */
|
||||||
|
|
||||||
static FILE *fp;
|
static FILE *fp;
|
||||||
static CIcodeRec pc;
|
static CIcodeRec pc;
|
||||||
static char buf[200], *p;
|
static std::ostringstream buf;
|
||||||
static Int cb, j, numIcode, allocIcode, eop;
|
static Int cb, j, numIcode, allocIcode, eop;
|
||||||
static vector<int> pl;
|
static vector<int> pl;
|
||||||
static dword nextInst;
|
static dword nextInst;
|
||||||
@ -192,7 +194,7 @@ void disassem(Int pass, Function * ppProc)
|
|||||||
/* Open the output file (.a1 or .a2 only) */
|
/* Open the output file (.a1 or .a2 only) */
|
||||||
if (pass != 3)
|
if (pass != 3)
|
||||||
{
|
{
|
||||||
p = (pass == 1)? asm1_name: asm2_name;
|
auto p = (pass == 1)? asm1_name: asm2_name;
|
||||||
fp = fopen(p, "a+");
|
fp = fopen(p, "a+");
|
||||||
if (!fp)
|
if (!fp)
|
||||||
{
|
{
|
||||||
@ -260,8 +262,12 @@ void disassem(Int pass, Function * ppProc)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static void dis1Line(Int i, Int pass)
|
static void dis1Line(Int i, Int pass)
|
||||||
{
|
{
|
||||||
|
ostringstream oper_stream;
|
||||||
|
ostringstream hex_bytes;
|
||||||
|
ostringstream result_stream;
|
||||||
ICODE * pIcode = &pc[i];
|
ICODE * pIcode = &pc[i];
|
||||||
|
oper_stream << uppercase;
|
||||||
|
hex_bytes << uppercase;
|
||||||
/* Disassembly stage 1 --
|
/* Disassembly stage 1 --
|
||||||
* Do not try to display NO_CODE entries or synthetic instructions,
|
* Do not try to display NO_CODE entries or synthetic instructions,
|
||||||
* other than JMPs, that have been introduced for def/use analysis. */
|
* other than JMPs, that have been introduced for def/use analysis. */
|
||||||
@ -275,10 +281,6 @@ static void dis1Line(Int i, Int pass)
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* p points to the current position in buf[] */
|
|
||||||
p = (char*)memset(buf, ' ', sizeof(buf));
|
|
||||||
|
|
||||||
if (pIcode->ic.ll.flg & (TARGET | CASE))
|
if (pIcode->ic.ll.flg & (TARGET | CASE))
|
||||||
{
|
{
|
||||||
if (pass == 3)
|
if (pass == 3)
|
||||||
@ -298,97 +300,91 @@ static void dis1Line(Int i, Int pass)
|
|||||||
/* Output hexa code in program image */
|
/* Output hexa code in program image */
|
||||||
if (pass != 3)
|
if (pass != 3)
|
||||||
{
|
{
|
||||||
for (j = 0; j < cb; j++, p += 2)
|
for (j = 0; j < cb; j++)
|
||||||
sprintf(p, "%02X", prog.Image[pIcode->ic.ll.label + j]);
|
{
|
||||||
*p = ' ';
|
hex_bytes << hex << setw(2) << setfill('0') << uint16_t(prog.Image[pIcode->ic.ll.label + j]);
|
||||||
|
}
|
||||||
|
hex_bytes << ' ';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
oper_stream << setw(POS_LAB) << left<< hex_bytes.str();
|
||||||
/* Check if there is a symbol here */
|
/* Check if there is a symbol here */
|
||||||
selectTable(Label);
|
selectTable(Label);
|
||||||
if (readVal(&buf[POS_LAB], pIcode->ic.ll.label, 0))
|
oper_stream << setw(5)<<left; // align for the labels
|
||||||
{
|
{
|
||||||
buf[strlen(buf)] = ':'; /* Also removes the null */
|
ostringstream lab_contents;
|
||||||
}
|
if (readVal(lab_contents, pIcode->ic.ll.label, 0))
|
||||||
|
|
||||||
else if (pIcode->ic.ll.flg & TARGET) /* Symbols override Lnn labels */
|
|
||||||
{ /* Print label */
|
|
||||||
if (! pl[i])
|
|
||||||
{
|
{
|
||||||
pl[i] = ++lab;
|
lab_contents << ':'; /* Also removes the null */
|
||||||
}
|
}
|
||||||
if (pass == 3)
|
else if (pIcode->ic.ll.flg & TARGET) /* Symbols override Lnn labels */
|
||||||
sprintf(buf, "L%ld", pl[i]);
|
{
|
||||||
else
|
/* Print label */
|
||||||
sprintf(&buf[15], "L%ld", pl[i]);
|
if (! pl[i])
|
||||||
buf[strlen(buf)] = ':'; /* Also removes the null */
|
{
|
||||||
|
pl[i] = ++lab;
|
||||||
|
}
|
||||||
|
lab_contents<< "L"<<pl[i]<<':';
|
||||||
|
}
|
||||||
|
oper_stream<< lab_contents.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pIcode->ic.ll.opcode == iSIGNEX && (pIcode->ic.ll.flg & B))
|
if (pIcode->ic.ll.opcode == iSIGNEX && (pIcode->ic.ll.flg & B))
|
||||||
{
|
{
|
||||||
pIcode->ic.ll.opcode = iCBW;
|
pIcode->ic.ll.opcode = iCBW;
|
||||||
}
|
}
|
||||||
|
oper_stream << setw(15) << left <<szOps[pIcode->ic.ll.opcode];
|
||||||
if (pass == 3)
|
|
||||||
{
|
|
||||||
strcpy (&buf[8], szOps[pIcode->ic.ll.opcode]);
|
|
||||||
buf[eop = strlen(buf)] = ' ';
|
|
||||||
p = buf + 8 + (POS_OPR - POS_OPC);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
strcpy(&buf[POS_OPC], szOps[pIcode->ic.ll.opcode]);
|
|
||||||
buf[eop = strlen(buf)] = ' ';
|
|
||||||
p = buf + POS_OPR;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (pIcode->ic.ll.opcode)
|
switch (pIcode->ic.ll.opcode)
|
||||||
{
|
{
|
||||||
case iADD: case iADC: case iSUB: case iSBB: case iAND: case iOR:
|
case iADD: case iADC: case iSUB: case iSBB: case iAND: case iOR:
|
||||||
case iXOR: case iTEST: case iCMP: case iMOV: case iLEA: case iXCHG:
|
case iXOR: case iTEST: case iCMP: case iMOV: case iLEA: case iXCHG:
|
||||||
strcpy(p, strDst(pIcode->ic.ll.flg, &pIcode->ic.ll.dst));
|
strDst(oper_stream,pIcode->ic.ll.flg, &pIcode->ic.ll.dst);
|
||||||
strcat(p, strSrc(pIcode));
|
strSrc(oper_stream,pIcode);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iESC:
|
case iESC:
|
||||||
flops(pIcode);
|
flops(pIcode,oper_stream);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iSAR: case iSHL: case iSHR: case iRCL: case iRCR: case iROL:
|
case iSAR: case iSHL: case iSHR: case iRCL: case iRCR: case iROL:
|
||||||
case iROR:
|
case iROR:
|
||||||
strcpy(p, strDst(pIcode->ic.ll.flg | I, &pIcode->ic.ll.dst));
|
strDst(oper_stream,pIcode->ic.ll.flg | I, &pIcode->ic.ll.dst);
|
||||||
strcat(p, (pIcode->ic.ll.flg & I)? strSrc(pIcode): ", cl");
|
if(pIcode->ic.ll.flg & I)
|
||||||
|
strSrc(oper_stream,pIcode);
|
||||||
|
else
|
||||||
|
oper_stream<<", cl";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iINC: case iDEC: case iNEG: case iNOT: case iPOP:
|
case iINC: case iDEC: case iNEG: case iNOT: case iPOP:
|
||||||
strcpy(p, strDst(pIcode->ic.ll.flg | I, &pIcode->ic.ll.dst));
|
strDst(oper_stream,pIcode->ic.ll.flg | I, &pIcode->ic.ll.dst);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iPUSH:
|
case iPUSH:
|
||||||
if (pIcode->ic.ll.flg & I)
|
if (pIcode->ic.ll.flg & I)
|
||||||
{
|
{
|
||||||
strcpy(p + WID_PTR, strHex(pIcode->ic.ll.immed.op));
|
oper_stream<<strHex(pIcode->ic.ll.immed.op);
|
||||||
|
// strcpy(p + WID_PTR, strHex(pIcode->ic.ll.immed.op));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strcpy(p, strDst(pIcode->ic.ll.flg | I, &pIcode->ic.ll.dst));
|
strDst(oper_stream,pIcode->ic.ll.flg | I, &pIcode->ic.ll.dst);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iDIV: case iIDIV: case iMUL: case iIMUL: case iMOD:
|
case iDIV: case iIDIV: case iMUL: case iIMUL: case iMOD:
|
||||||
if (pIcode->ic.ll.flg & I)
|
if (pIcode->ic.ll.flg & I)
|
||||||
{
|
{
|
||||||
strcat(strcpy(p, strDst(pIcode->ic.ll.flg, &pIcode->ic.ll.dst)),", ");
|
strDst(oper_stream,pIcode->ic.ll.flg, &pIcode->ic.ll.dst) <<", ";
|
||||||
formatRM(p + strlen(p), pIcode->ic.ll.flg, &pIcode->ic.ll.src);
|
formatRM(oper_stream, pIcode->ic.ll.flg, &pIcode->ic.ll.src);
|
||||||
strcat(p, strSrc(pIcode));
|
strSrc(oper_stream,pIcode);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
strcpy(p, strDst(pIcode->ic.ll.flg | I, &pIcode->ic.ll.src));
|
strDst(oper_stream,pIcode->ic.ll.flg | I, &pIcode->ic.ll.src);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iLDS: case iLES: case iBOUND:
|
case iLDS: case iLES: case iBOUND:
|
||||||
strcpy(p, strDst(pIcode->ic.ll.flg, &pIcode->ic.ll.dst));
|
strDst(oper_stream,pIcode->ic.ll.flg, &pIcode->ic.ll.dst)<<", dword ptr";
|
||||||
strcat(strcat(p, ", dword ptr"), strSrc(pIcode)+1);
|
strSrc(oper_stream,pIcode,true);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iJB: case iJBE: case iJAE: case iJA:
|
case iJB: case iJBE: case iJAE: case iJA:
|
||||||
@ -401,14 +397,15 @@ static void dis1Line(Int i, Int pass)
|
|||||||
/* Check if there is a symbol here */
|
/* Check if there is a symbol here */
|
||||||
selectTable(Label);
|
selectTable(Label);
|
||||||
if ((pIcode->ic.ll.immed.op < (dword)numIcode) && /* Ensure in range */
|
if ((pIcode->ic.ll.immed.op < (dword)numIcode) && /* Ensure in range */
|
||||||
readVal(p+WID_PTR, pc[pIcode->ic.ll.immed.op].ic.ll.label, 0))
|
readVal(oper_stream, pc[pIcode->ic.ll.immed.op].ic.ll.label, 0))
|
||||||
{
|
{
|
||||||
break; /* Symbolic label. Done */
|
break; /* Symbolic label. Done */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pIcode->ic.ll.flg & NO_LABEL)
|
if (pIcode->ic.ll.flg & NO_LABEL)
|
||||||
{
|
{
|
||||||
strcpy(p + WID_PTR, strHex(pIcode->ic.ll.immed.op));
|
//strcpy(p + WID_PTR, strHex(pIcode->ic.ll.immed.op));
|
||||||
|
oper_stream<<strHex(pIcode->ic.ll.immed.op);
|
||||||
}
|
}
|
||||||
else if (pIcode->ic.ll.flg & I)
|
else if (pIcode->ic.ll.flg & I)
|
||||||
{
|
{
|
||||||
@ -419,51 +416,48 @@ static void dis1Line(Int i, Int pass)
|
|||||||
}
|
}
|
||||||
if (pIcode->ic.ll.opcode == iJMPF)
|
if (pIcode->ic.ll.opcode == iJMPF)
|
||||||
{
|
{
|
||||||
sprintf(p, " far ptr L%ld", pl[j]);
|
oper_stream<<" far ptr ";
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sprintf(p + WID_PTR, "L%ld", pl[j]);
|
|
||||||
}
|
}
|
||||||
|
oper_stream<<"L"<<pl[j];
|
||||||
}
|
}
|
||||||
else if (pIcode->ic.ll.opcode == iJMPF)
|
else if (pIcode->ic.ll.opcode == iJMPF)
|
||||||
{
|
{
|
||||||
strcat(strcpy(p-1, "dword ptr"), strSrc(pIcode)+1);
|
oper_stream<<"dword ptr";
|
||||||
|
strSrc(oper_stream,pIcode,true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strcpy(p, strDst(I, &pIcode->ic.ll.src));
|
strDst(oper_stream,I, &pIcode->ic.ll.src);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iCALL: case iCALLF:
|
case iCALL: case iCALLF:
|
||||||
if (pIcode->ic.ll.flg & I)
|
if (pIcode->ic.ll.flg & I)
|
||||||
{
|
{
|
||||||
sprintf(p, "%s ptr %s",(pIcode->ic.ll.opcode == iCALL) ?" near":" far",(pIcode->ic.ll.immed.proc.proc)->name);
|
if((pIcode->ic.ll.opcode == iCALL))
|
||||||
|
oper_stream<< "near";
|
||||||
|
else
|
||||||
|
oper_stream<< " far";
|
||||||
|
oper_stream<<" ptr "<<(pIcode->ic.ll.immed.proc.proc)->name;
|
||||||
}
|
}
|
||||||
else if (pIcode->ic.ll.opcode == iCALLF)
|
else if (pIcode->ic.ll.opcode == iCALLF)
|
||||||
{
|
{
|
||||||
strcat(strcpy(p, "dword ptr"),strSrc(pIcode)+1);
|
oper_stream<<"dword ptr ";
|
||||||
|
strSrc(oper_stream,pIcode,true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
strDst(oper_stream,I, &pIcode->ic.ll.src);
|
||||||
strcpy(p, strDst(I, &pIcode->ic.ll.src));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iENTER:
|
case iENTER:
|
||||||
strcat(strcpy(p + WID_PTR, strHex(pIcode->ic.ll.dst.off)), ", ");
|
oper_stream<<strHex(pIcode->ic.ll.dst.off)<<", ";
|
||||||
strcat(p, strHex(pIcode->ic.ll.immed.op));
|
oper_stream<<strHex(pIcode->ic.ll.immed.op);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iRET: case iRETF: case iINT:
|
case iRET: case iRETF: case iINT:
|
||||||
if (pIcode->ic.ll.flg & I)
|
if (pIcode->ic.ll.flg & I)
|
||||||
{
|
{
|
||||||
strcpy(p + WID_PTR, strHex(pIcode->ic.ll.immed.op));
|
oper_stream<<strHex(pIcode->ic.ll.immed.op);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
buf[eop] = '\0';
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -476,46 +470,47 @@ static void dis1Line(Int i, Int pass)
|
|||||||
case iOUTS: case iREP_OUTS:
|
case iOUTS: case iREP_OUTS:
|
||||||
if (pIcode->ic.ll.src.segOver)
|
if (pIcode->ic.ll.src.segOver)
|
||||||
{
|
{
|
||||||
(pIcode->ic.ll.opcode == iOUTS || pIcode->ic.ll.opcode == iREP_OUTS)
|
bool is_dx_src=(pIcode->ic.ll.opcode == iOUTS || pIcode->ic.ll.opcode == iREP_OUTS);
|
||||||
? strcat(strcpy(p+WID_PTR,"dx, "), szPtr[pIcode->ic.ll.flg & B])
|
if(is_dx_src)
|
||||||
: strcpy(&buf[eop+1], szPtr[pIcode->ic.ll.flg & B]);
|
oper_stream<<"dx, "<<szPtr[pIcode->ic.ll.flg & B];
|
||||||
|
else
|
||||||
|
oper_stream<<szPtr[pIcode->ic.ll.flg & B];
|
||||||
if (pIcode->ic.ll.opcode == iLODS ||
|
if (pIcode->ic.ll.opcode == iLODS ||
|
||||||
pIcode->ic.ll.opcode == iREP_LODS ||
|
pIcode->ic.ll.opcode == iREP_LODS ||
|
||||||
pIcode->ic.ll.opcode == iOUTS ||
|
pIcode->ic.ll.opcode == iOUTS ||
|
||||||
pIcode->ic.ll.opcode == iREP_OUTS)
|
pIcode->ic.ll.opcode == iREP_OUTS)
|
||||||
{
|
{
|
||||||
strcat(p, szWreg[pIcode->ic.ll.src.segOver-rAX]);
|
oper_stream<<szWreg[pIcode->ic.ll.src.segOver-rAX];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strcat(strcat(p, "es:[di], "),szWreg[pIcode->ic.ll.src.segOver - rAX]);
|
oper_stream<<"es:[di], "<<szWreg[pIcode->ic.ll.src.segOver - rAX];
|
||||||
}
|
}
|
||||||
strcat(p, ":[si]");
|
oper_stream<<":[si]";
|
||||||
}
|
}
|
||||||
else strcpy(&buf[eop], (pIcode->ic.ll.flg & B)? "B": "W");
|
else
|
||||||
|
oper_stream<<(pIcode->ic.ll.flg & B)? "B": "W";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iXLAT:
|
case iXLAT:
|
||||||
if (pIcode->ic.ll.src.segOver)
|
if (pIcode->ic.ll.src.segOver)
|
||||||
{
|
{
|
||||||
strcpy(&buf[eop+1], szPtr[1]);
|
oper_stream<<" "<<szPtr[1];
|
||||||
strcat(strcat(p, szWreg[pIcode->ic.ll.src.segOver-rAX]), ":[bx]");
|
oper_stream<<szWreg[pIcode->ic.ll.src.segOver-rAX]<<":[bx]";
|
||||||
}
|
}
|
||||||
else buf[eop] = '\0';
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iIN:
|
case iIN:
|
||||||
strcpy(p+WID_PTR, (pIcode->ic.ll.flg & B)?"al, ": "ax, ");
|
oper_stream<<(pIcode->ic.ll.flg & B)?"al, ": "ax, ";
|
||||||
strcat(p+WID_PTR, (pIcode->ic.ll.flg & I)? strHex(pIcode->ic.ll.immed.op): "dx");
|
oper_stream<<(pIcode->ic.ll.flg & I)? strHex(pIcode->ic.ll.immed.op): "dx";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case iOUT:
|
case iOUT:
|
||||||
strcpy(p+WID_PTR, (pIcode->ic.ll.flg & I)? strHex(pIcode->ic.ll.immed.op): "dx");
|
oper_stream<<(pIcode->ic.ll.flg & I)? strHex(pIcode->ic.ll.immed.op): "dx";
|
||||||
strcat(p+WID_PTR, (pIcode->ic.ll.flg & B)?", al": ", ax");
|
oper_stream<<(pIcode->ic.ll.flg & B)?", al": ", ax";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
buf[eop] = '\0';
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,76 +521,73 @@ static void dis1Line(Int i, Int pass)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (j = pIcode->ic.ll.label, fImpure = 0; j > 0 && j < (Int)nextInst;
|
for (j = pIcode->ic.ll.label, fImpure = 0; j > 0 && j < (Int)nextInst; j++)
|
||||||
j++)
|
|
||||||
{
|
{
|
||||||
fImpure |= BITMAP(j, BM_DATA);
|
fImpure |= BITMAP(j, BM_DATA);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result_stream << setw(54) << left << oper_stream.str();
|
||||||
/* Check for user supplied comment */
|
/* Check for user supplied comment */
|
||||||
selectTable(Comment);
|
selectTable(Comment);
|
||||||
|
ostringstream cbuf;
|
||||||
if (readVal(cbuf, pIcode->ic.ll.label, 0))
|
if (readVal(cbuf, pIcode->ic.ll.label, 0))
|
||||||
{
|
{
|
||||||
buf[strlen(buf)] = ' '; /* Removes the null */
|
result_stream <<"; "<<cbuf.str();
|
||||||
buf[POS_CMT] = ';';
|
|
||||||
strcpy(buf+POS_CMT+1, cbuf);
|
|
||||||
}
|
}
|
||||||
|
else if (fImpure || (pIcode->ic.ll.flg & (SWITCH | CASE | SEG_IMMED | IMPURE | SYNTHETIC | TERMINATES)))
|
||||||
else if (fImpure || (pIcode->ic.ll.flg & (SWITCH | CASE | SEG_IMMED |
|
|
||||||
IMPURE | SYNTHETIC | TERMINATES)))
|
|
||||||
{
|
{
|
||||||
buf[strlen(buf)] = ' ';
|
|
||||||
buf[POS_CMT] = '\0';
|
|
||||||
if (pIcode->ic.ll.flg & CASE)
|
if (pIcode->ic.ll.flg & CASE)
|
||||||
{
|
{
|
||||||
sprintf(buf+POS_CMT, ";Case l%ld", pIcode->ic.ll.caseTbl.numEntries);
|
result_stream << ";Case l"<< pIcode->ic.ll.caseTbl.numEntries;
|
||||||
}
|
}
|
||||||
if (pIcode->ic.ll.flg & SWITCH)
|
if (pIcode->ic.ll.flg & SWITCH)
|
||||||
{
|
{
|
||||||
strcat(buf, ";Switch ");
|
result_stream << ";Switch ";
|
||||||
}
|
}
|
||||||
if (fImpure)
|
if (fImpure)
|
||||||
{
|
{
|
||||||
strcat(buf, ";Accessed as data ");
|
result_stream << ";Accessed as data ";
|
||||||
}
|
}
|
||||||
if (pIcode->ic.ll.flg & IMPURE)
|
if (pIcode->ic.ll.flg & IMPURE)
|
||||||
{
|
{
|
||||||
strcat(buf, ";Impure operand ");
|
result_stream << ";Impure operand ";
|
||||||
}
|
}
|
||||||
if (pIcode->ic.ll.flg & SEG_IMMED)
|
if (pIcode->ic.ll.flg & SEG_IMMED)
|
||||||
{
|
{
|
||||||
strcat(buf, ";Segment constant");
|
result_stream << ";Segment constant";
|
||||||
}
|
}
|
||||||
if (pIcode->ic.ll.flg & TERMINATES)
|
if (pIcode->ic.ll.flg & TERMINATES)
|
||||||
{
|
{
|
||||||
strcat(buf, ";Exit to DOS");
|
result_stream << ";Exit to DOS";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Comment on iINT icodes */
|
/* Comment on iINT icodes */
|
||||||
if (pIcode->ic.ll.opcode == iINT)
|
if (pIcode->ic.ll.opcode == iINT)
|
||||||
pIcode->writeIntComment (buf);
|
pIcode->writeIntComment (result_stream);
|
||||||
|
|
||||||
/* Display output line */
|
/* Display output line */
|
||||||
if (! (pIcode->ic.ll.flg & SYNTHETIC))
|
if(pass==3)
|
||||||
{
|
{
|
||||||
|
/* output to .b code buffer */
|
||||||
|
if (pIcode->isLlFlag(SYNTHETIC))
|
||||||
|
result_stream<<";Synthetic inst";
|
||||||
if (pass == 3) /* output to .b code buffer */
|
if (pass == 3) /* output to .b code buffer */
|
||||||
cCode.appendCode("%s\n", buf);
|
cCode.appendCode("%s\n", result_stream.str().c_str());
|
||||||
else /* output to .a1 or .a2 file */
|
|
||||||
fprintf (fp, "%03ld %06lX %s\n", i, pIcode->ic.ll.label, buf);
|
|
||||||
}
|
}
|
||||||
else /* SYNTHETIC instruction */
|
else
|
||||||
{
|
{
|
||||||
strcat (buf, ";Synthetic inst");
|
if (! (pIcode->ic.ll.flg & SYNTHETIC))
|
||||||
if (pass == 3) /* output to .b code buffer */
|
|
||||||
{
|
{
|
||||||
cCode.appendCode("%s\n", buf);
|
/* output to .a1 or .a2 file */
|
||||||
|
fprintf (fp, "%03ld %06lX %s\n", i, pIcode->ic.ll.label, result_stream.str().c_str());
|
||||||
}
|
}
|
||||||
else /* output to .a1 or .a2 file */
|
else /* SYNTHETIC instruction */
|
||||||
{
|
{
|
||||||
fprintf (fp, "%03ld %s\n", i, buf);
|
result_stream<<";Synthetic inst";
|
||||||
|
fprintf (fp, "%03ld %s\n", i, result_stream.str().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -605,7 +597,7 @@ static void dis1Line(Int i, Int pass)
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* formatRM
|
* formatRM
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
static void formatRM(char *p, flags32 flg, ICODEMEM *pm)
|
static void formatRM(std::ostringstream &p, flags32 flg, ICODEMEM *pm)
|
||||||
{
|
{
|
||||||
char seg[4];
|
char seg[4];
|
||||||
|
|
||||||
@ -617,71 +609,68 @@ static void formatRM(char *p, flags32 flg, ICODEMEM *pm)
|
|||||||
|
|
||||||
if (pm->regi == 0)
|
if (pm->regi == 0)
|
||||||
{
|
{
|
||||||
sprintf(p,"%s[%s]", seg, strHex((dword)pm->off));
|
p<<seg<<"["<<strHex((dword)pm->off)<<"]";
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (pm->regi == (INDEXBASE - 1))
|
else if (pm->regi == (INDEXBASE - 1))
|
||||||
{
|
{
|
||||||
strcpy (p, "tmp");
|
p<<"tmp";
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (pm->regi < INDEXBASE)
|
else if (pm->regi < INDEXBASE)
|
||||||
{
|
{
|
||||||
strcpy(p, (flg & B)? szBreg[pm->regi - rAL]: szWreg[pm->regi - rAX]);
|
if(flg & B)
|
||||||
|
p << szBreg[pm->regi - rAL];
|
||||||
|
else
|
||||||
|
p << szWreg[pm->regi - rAX];
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (pm->off)
|
else if (pm->off)
|
||||||
{
|
{
|
||||||
if (pm->off < 0)
|
if (pm->off < 0)
|
||||||
{
|
{
|
||||||
sprintf(p,"%s[%s-%s]", seg, szIndex[pm->regi - INDEXBASE],strHex((dword)(- pm->off)));
|
p <<seg<<"["<<szIndex[pm->regi - INDEXBASE]<<"-"<<strHex((dword)(- pm->off))<<"]";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(p,"%s[%s+%s]", seg, szIndex[pm->regi - INDEXBASE],strHex((dword)pm->off));
|
p <<seg<<"["<<szIndex[pm->regi - INDEXBASE]<<"+"<<strHex((dword)(pm->off))<<"]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else sprintf(p,"%s[%s]", seg, szIndex[pm->regi - INDEXBASE]);
|
else
|
||||||
|
p <<seg<<"["<<szIndex[pm->regi - INDEXBASE]<<"]";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* strDst
|
* strDst
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static char *strDst(flags32 flg, ICODEMEM *pm)
|
static ostringstream & strDst(ostringstream &os,flags32 flg, ICODEMEM *pm)
|
||||||
{
|
{
|
||||||
static char buf[30];
|
|
||||||
|
|
||||||
/* Immediates to memory require size descriptor */
|
/* Immediates to memory require size descriptor */
|
||||||
|
//os << setw(WID_PTR);
|
||||||
if ((flg & I) && (pm->regi == 0 || pm->regi >= INDEXBASE))
|
if ((flg & I) && (pm->regi == 0 || pm->regi >= INDEXBASE))
|
||||||
{
|
os << szPtr[flg & B];
|
||||||
memcpy(buf, szPtr[flg & B], WID_PTR);
|
formatRM(os, flg, pm);
|
||||||
}
|
return os;
|
||||||
else
|
|
||||||
{
|
|
||||||
memset(buf, ' ', WID_PTR);
|
|
||||||
}
|
|
||||||
|
|
||||||
formatRM(buf + WID_PTR, flg, pm);
|
|
||||||
return buf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* strSrc *
|
* strSrc *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static char *strSrc(ICODE *pc)
|
static ostringstream &strSrc(ostringstream &os,ICODE *pc,bool skip_comma)
|
||||||
{
|
{
|
||||||
static char buf[30] = {", "};
|
static char buf[30] = {", "};
|
||||||
|
if(false==skip_comma)
|
||||||
|
os<<", ";
|
||||||
if (pc->ic.ll.flg & I)
|
if (pc->ic.ll.flg & I)
|
||||||
strcpy(buf + 2, strHex(pc->ic.ll.immed.op));
|
os<<strHex(pc->ic.ll.immed.op);
|
||||||
else if (pc->ic.ll.flg & IM_SRC) /* level 2 */
|
else if (pc->ic.ll.flg & IM_SRC) /* level 2 */
|
||||||
strcpy (buf + 2, "dx:ax");
|
os<<"dx:ax";
|
||||||
else
|
else
|
||||||
formatRM(buf + 2, pc->ic.ll.flg, &pc->ic.ll.src);
|
formatRM(os, pc->ic.ll.flg, &pc->ic.ll.src);
|
||||||
|
|
||||||
return buf;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -707,7 +696,7 @@ void interactDis(Function * initProc, Int initIC)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Handle the floating point opcodes (icode iESC) */
|
/* Handle the floating point opcodes (icode iESC) */
|
||||||
static void flops(ICODE *pIcode)
|
void flops(ICODE *pIcode,std::ostringstream &out)
|
||||||
{
|
{
|
||||||
char bf[30];
|
char bf[30];
|
||||||
byte op = (byte)pIcode->ic.ll.immed.op;
|
byte op = (byte)pIcode->ic.ll.immed.op;
|
||||||
@ -717,11 +706,9 @@ static void flops(ICODE *pIcode)
|
|||||||
|
|
||||||
if ((pIcode->ic.ll.dst.regi == 0) || (pIcode->ic.ll.dst.regi >= INDEXBASE))
|
if ((pIcode->ic.ll.dst.regi == 0) || (pIcode->ic.ll.dst.regi >= INDEXBASE))
|
||||||
{
|
{
|
||||||
/* The mod/rm mod bits are not set to 11 (i.e. register).
|
/* The mod/rm mod bits are not set to 11 (i.e. register). This is the normal floating point opcode */
|
||||||
This is the normal floating point opcode */
|
out<<szFlops1[op]<<' ';
|
||||||
strcpy(&buf[POS_OPC], szFlops1[op]);
|
out <<setw(10);
|
||||||
buf[strlen(buf)] = ' ';
|
|
||||||
|
|
||||||
if ((op == 0x29) || (op == 0x1F))
|
if ((op == 0x29) || (op == 0x1F))
|
||||||
{
|
{
|
||||||
strcpy(bf, "tbyte ptr ");
|
strcpy(bf, "tbyte ptr ");
|
||||||
@ -753,8 +740,7 @@ static void flops(ICODE *pIcode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
formatRM(bf + 10, pIcode->ic.ll.flg, &pIcode->ic.ll.dst);
|
formatRM(out, pIcode->ic.ll.flg, &pIcode->ic.ll.dst);
|
||||||
strcpy(p, bf);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -763,44 +749,44 @@ static void flops(ICODE *pIcode)
|
|||||||
normal opcodes. Because the opcodes are slightly different for
|
normal opcodes. Because the opcodes are slightly different for
|
||||||
this case (e.g. op=04 means FSUB if reg != 3, but FSUBR for
|
this case (e.g. op=04 means FSUB if reg != 3, but FSUBR for
|
||||||
reg == 3), a separate table is used (szFlops2). */
|
reg == 3), a separate table is used (szFlops2). */
|
||||||
|
|
||||||
switch (op)
|
switch (op)
|
||||||
{
|
{
|
||||||
case 0x0C:
|
case 0x0C:
|
||||||
strcpy(&buf[POS_OPC], szFlops0C[pIcode->ic.ll.dst.regi - rAX]);
|
out << szFlops0C[pIcode->ic.ll.dst.regi - rAX];
|
||||||
break;
|
break;
|
||||||
case 0x0D:
|
case 0x0D:
|
||||||
strcpy(&buf[POS_OPC], szFlops0D[pIcode->ic.ll.dst.regi - rAX]);
|
out << szFlops0D[pIcode->ic.ll.dst.regi - rAX];
|
||||||
break;
|
break;
|
||||||
case 0x0E:
|
case 0x0E:
|
||||||
strcpy(&buf[POS_OPC], szFlops0E[pIcode->ic.ll.dst.regi - rAX]);
|
out << szFlops0E[pIcode->ic.ll.dst.regi - rAX];
|
||||||
break;
|
break;
|
||||||
case 0x0F:
|
case 0x0F:
|
||||||
strcpy(&buf[POS_OPC], szFlops0F[pIcode->ic.ll.dst.regi - rAX]);
|
out << szFlops0F[pIcode->ic.ll.dst.regi - rAX];
|
||||||
break;
|
break;
|
||||||
case 0x15:
|
case 0x15:
|
||||||
strcpy(&buf[POS_OPC], szFlops15[pIcode->ic.ll.dst.regi - rAX]);
|
out << szFlops15[pIcode->ic.ll.dst.regi - rAX];
|
||||||
break;
|
break;
|
||||||
case 0x1C:
|
case 0x1C:
|
||||||
strcpy(&buf[POS_OPC], szFlops1C[pIcode->ic.ll.dst.regi - rAX]);
|
out << szFlops1C[pIcode->ic.ll.dst.regi - rAX];
|
||||||
break;
|
break;
|
||||||
case 0x33:
|
case 0x33:
|
||||||
strcpy(&buf[POS_OPC], szFlops33[pIcode->ic.ll.dst.regi - rAX]);
|
out << szFlops33[pIcode->ic.ll.dst.regi - rAX];
|
||||||
break;
|
break;
|
||||||
case 0x3C:
|
case 0x3C:
|
||||||
strcpy(&buf[POS_OPC], szFlops3C[pIcode->ic.ll.dst.regi - rAX]);
|
out << szFlops3C[pIcode->ic.ll.dst.regi - rAX];
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
strcpy(&buf[POS_OPC], szFlops2[op]);
|
out << szFlops2[op];
|
||||||
buf[strlen(buf)] = ' ';
|
|
||||||
if ((op >= 0x20) && (op <= 0x27))
|
if ((op >= 0x20) && (op <= 0x27))
|
||||||
{
|
{
|
||||||
/* This is the ST(i), ST form. */
|
/* This is the ST(i), ST form. */
|
||||||
sprintf(&buf[POS_OPR2], "ST(%d),ST", pIcode->ic.ll.dst.regi - rAX);
|
out << "ST("<<pIcode->ic.ll.dst.regi - rAX<<"),ST";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* ST, ST(i) */
|
/* ST, ST(i) */
|
||||||
sprintf(&buf[POS_OPR2], "ST,ST(%d)", pIcode->ic.ll.dst.regi - rAX);
|
out << "ST,ST("<<pIcode->ic.ll.dst.regi - rAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -164,7 +164,7 @@ void Function::markImpure()
|
|||||||
{
|
{
|
||||||
if (Icode.GetLlFlag(i) & (SYM_USE | SYM_DEF))
|
if (Icode.GetLlFlag(i) & (SYM_USE | SYM_DEF))
|
||||||
{
|
{
|
||||||
psym = &symtab.sym[Icode.GetIcode(i)->ic.ll.caseTbl.numEntries];
|
psym = &symtab[Icode.GetIcode(i)->ic.ll.caseTbl.numEntries];
|
||||||
for (int c = (Int)psym->label; c < (Int)psym->label+psym->size; c++)
|
for (int c = (Int)psym->label; c < (Int)psym->label+psym->size; c++)
|
||||||
{
|
{
|
||||||
if (BITMAP(c, BM_CODE))
|
if (BITMAP(c, BM_CODE))
|
||||||
|
|||||||
@ -90,12 +90,12 @@ void parse (CALL_GRAPH * *pcallGraph)
|
|||||||
static void updateSymType (dword symbol, hlType symType, Int size)
|
static void updateSymType (dword symbol, hlType symType, Int size)
|
||||||
{ Int i;
|
{ Int i;
|
||||||
|
|
||||||
for (i = 0; i < symtab.csym; i++)
|
for (i = 0; i < symtab.size(); i++)
|
||||||
if (symtab.sym[i].label == symbol)
|
if (symtab[i].label == symbol)
|
||||||
{
|
{
|
||||||
symtab.sym[i].type = symType;
|
symtab[i].type = symType;
|
||||||
if (size != 0)
|
if (size != 0)
|
||||||
symtab.sym[i].size = size;
|
symtab[i].size = size;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -691,35 +691,34 @@ static SYM * updateGlobSym (dword operand, Int size, word duFlag)
|
|||||||
Int i;
|
Int i;
|
||||||
|
|
||||||
/* Check for symbol in symbol table */
|
/* Check for symbol in symbol table */
|
||||||
for (i = 0; i < symtab.csym; i++)
|
for (i = 0; i < symtab.size(); i++)
|
||||||
if (symtab.sym[i].label == operand) {
|
if (symtab[i].label == operand)
|
||||||
if (symtab.sym[i].size < size)
|
{
|
||||||
symtab.sym[i].size = size;
|
if (symtab[i].size < size)
|
||||||
|
symtab[i].size = size;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* New symbol, not in symbol table */
|
/* New symbol, not in symbol table */
|
||||||
if (i == symtab.csym) {
|
if (i == symtab.size())
|
||||||
if (++symtab.csym > symtab.alloc) {
|
{
|
||||||
symtab.alloc += 5;
|
SYM v;
|
||||||
symtab.sym = (SYM *)reallocVar(symtab.sym, symtab.alloc * sizeof(SYM));
|
sprintf (v.name, "var%05lX", operand);
|
||||||
memset (&symtab.sym[i], 0, 5 * sizeof(SYM));
|
v.label = operand;
|
||||||
}
|
v.size = size;
|
||||||
sprintf (symtab.sym[i].name, "var%05lX", operand);
|
v.type = cbType[size];
|
||||||
symtab.sym[i].label = operand;
|
|
||||||
symtab.sym[i].size = size;
|
|
||||||
symtab.sym[i].type = cbType[size];
|
|
||||||
if (duFlag == eDuVal::USE) /* must already have init value */
|
if (duFlag == eDuVal::USE) /* must already have init value */
|
||||||
{
|
{
|
||||||
symtab.sym[i].duVal.use =1; // USEVAL;
|
v.duVal.use =1; // USEVAL;
|
||||||
symtab.sym[i].duVal.val =1;
|
v.duVal.val =1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
symtab.sym[i].duVal.setFlags(duFlag);
|
v.duVal.setFlags(duFlag);
|
||||||
}
|
}
|
||||||
|
symtab.push_back(v);
|
||||||
}
|
}
|
||||||
return (&symtab.sym[i]);
|
return (&symtab[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -792,11 +791,12 @@ static SYM * lookupAddr (ICODEMEM *pm, STATE *pstate, Int size, word duFlag)
|
|||||||
else if (pstate->f[pm->seg]) { /* new value */
|
else if (pstate->f[pm->seg]) { /* new value */
|
||||||
pm->segValue = pstate->r[pm->seg];
|
pm->segValue = pstate->r[pm->seg];
|
||||||
operand = opAdr(pm->segValue, pm->off);
|
operand = opAdr(pm->segValue, pm->off);
|
||||||
i = symtab.csym;
|
i = symtab.size();
|
||||||
psym = updateGlobSym (operand, size, duFlag);
|
psym = updateGlobSym (operand, size, duFlag);
|
||||||
|
|
||||||
/* Flag new memory locations that are segment values */
|
/* Flag new memory locations that are segment values */
|
||||||
if (symtab.csym > i) {
|
if (symtab.size() > i)
|
||||||
|
{
|
||||||
if (size == 4)
|
if (size == 4)
|
||||||
operand += 2; /* High word */
|
operand += 2; /* High word */
|
||||||
for (i = 0; i < prog.cReloc; i++)
|
for (i = 0; i < prog.cReloc; i++)
|
||||||
@ -939,7 +939,7 @@ static void use (opLoc d, ICODE * pIcode, Function * pProc, STATE * pstate, Int
|
|||||||
{
|
{
|
||||||
setBits (BM_DATA, psym->label, (dword)size);
|
setBits (BM_DATA, psym->label, (dword)size);
|
||||||
pIcode->ic.ll.flg |= SYM_USE;
|
pIcode->ic.ll.flg |= SYM_USE;
|
||||||
pIcode->ic.ll.caseTbl.numEntries = psym - symtab.sym;
|
pIcode->ic.ll.caseTbl.numEntries = psym - &symtab[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -988,7 +988,7 @@ static void def (opLoc d, ICODE * pIcode, Function * pProc, STATE * pstate, Int
|
|||||||
{
|
{
|
||||||
setBits(BM_DATA, psym->label, (dword)size);
|
setBits(BM_DATA, psym->label, (dword)size);
|
||||||
pIcode->ic.ll.flg |= SYM_DEF;
|
pIcode->ic.ll.flg |= SYM_DEF;
|
||||||
pIcode->ic.ll.caseTbl.numEntries = psym - symtab.sym;
|
pIcode->ic.ll.caseTbl.numEntries = psym - &symtab[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -28,7 +28,7 @@
|
|||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
|
|
||||||
#define TABLESIZE 16 /* Number of entries added each expansion */
|
#define TABLESIZE 16 /* Number of entries added each expansion */
|
||||||
/* Probably has to be a power of 2 */
|
/* Probably has to be a power of 2 */
|
||||||
#define STRTABSIZE 256 /* Size string table is inc'd by */
|
#define STRTABSIZE 256 /* Size string table is inc'd by */
|
||||||
#define NIL ((word)-1)
|
#define NIL ((word)-1)
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@ -51,6 +51,10 @@ struct hash<SYMTABLE> : public unary_function<const SYMTABLE &,size_t>
|
|||||||
static tableType curTableType; /* Which table is current */
|
static tableType curTableType; /* Which table is current */
|
||||||
struct TABLEINFO_TYPE
|
struct TABLEINFO_TYPE
|
||||||
{
|
{
|
||||||
|
TABLEINFO_TYPE()
|
||||||
|
{
|
||||||
|
symTab=valTab=0;
|
||||||
|
}
|
||||||
void deleteVal(dword symOff, Function *symProc, boolT bSymToo);
|
void deleteVal(dword symOff, Function *symProc, boolT bSymToo);
|
||||||
void create(tableType type);
|
void create(tableType type);
|
||||||
void destroy();
|
void destroy();
|
||||||
@ -75,21 +79,16 @@ void TABLEINFO_TYPE::create(tableType type)
|
|||||||
case Comment:
|
case Comment:
|
||||||
numEntry = 0;
|
numEntry = 0;
|
||||||
tableSize = TABLESIZE;
|
tableSize = TABLESIZE;
|
||||||
valTab = (SYMTABLE*)allocMem(sizeof(SYMTABLE) * TABLESIZE);
|
valTab = new SYMTABLE [TABLESIZE];
|
||||||
symTab = 0;
|
symTab = 0;
|
||||||
memset(valTab, 0, sizeof(SYMTABLE) * TABLESIZE);
|
|
||||||
break;
|
break;
|
||||||
case Label:
|
case Label:
|
||||||
currentTabInfo.numEntry = 0;
|
currentTabInfo.numEntry = 0;
|
||||||
currentTabInfo.tableSize = TABLESIZE;
|
currentTabInfo.tableSize = TABLESIZE;
|
||||||
currentTabInfo.symTab = (SYMTABLE*)allocMem(sizeof(SYMTABLE) * TABLESIZE);
|
currentTabInfo.symTab = new SYMTABLE [TABLESIZE];
|
||||||
memset(currentTabInfo.symTab, 0, sizeof(SYMTABLE) * TABLESIZE);
|
currentTabInfo.valTab = new SYMTABLE [TABLESIZE];
|
||||||
|
|
||||||
currentTabInfo.valTab = (SYMTABLE*)allocMem(sizeof(SYMTABLE) * TABLESIZE);
|
|
||||||
memset(currentTabInfo.valTab, 0, sizeof(SYMTABLE) * TABLESIZE);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void createSymTables(void)
|
void createSymTables(void)
|
||||||
@ -109,10 +108,6 @@ void createSymTables(void)
|
|||||||
strTabNext = 0;
|
strTabNext = 0;
|
||||||
pStrTab = (char *)allocMem(STRTABSIZE);
|
pStrTab = (char *)allocMem(STRTABSIZE);
|
||||||
|
|
||||||
// tableInfo[Label].symTab = currentTabInfo.symTab;
|
|
||||||
// tableInfo[Label].valTab = currentTabInfo.valTab;
|
|
||||||
// tableInfo[Label].numEntry = currentTabInfo.numEntry;
|
|
||||||
// tableInfo[Label].tableSize = currentTabInfo.tableSize;
|
|
||||||
curTableType = Label;
|
curTableType = Label;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -126,11 +121,8 @@ void selectTable(tableType tt)
|
|||||||
}
|
}
|
||||||
void TABLEINFO_TYPE::destroy()
|
void TABLEINFO_TYPE::destroy()
|
||||||
{
|
{
|
||||||
if(symTab)
|
delete [] symTab; // The symbol hashed label table
|
||||||
free(symTab); // The symbol hashed label table
|
delete [] valTab; // And the value hashed label table
|
||||||
if(valTab)
|
|
||||||
free(valTab); // And the value hashed label table
|
|
||||||
|
|
||||||
}
|
}
|
||||||
void destroySymTables(void)
|
void destroySymTables(void)
|
||||||
{
|
{
|
||||||
@ -141,7 +133,7 @@ void destroySymTables(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Using the value, read the symbolic name */
|
/* Using the value, read the symbolic name */
|
||||||
boolT readVal(char *symName, dword symOff, Function * symProc)
|
boolT readVal(std::ostringstream &symName, dword symOff, Function * symProc)
|
||||||
{
|
{
|
||||||
return false; // no symbolic names for now
|
return false; // no symbolic names for now
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,16 +9,16 @@
|
|||||||
proc_3 PROC NEAR
|
proc_3 PROC NEAR
|
||||||
000 0002FF 55 PUSH bp
|
000 0002FF 55 PUSH bp
|
||||||
001 000300 8BEC MOV bp, sp
|
001 000300 8BEC MOV bp, sp
|
||||||
002 000302 E8F5FF CALL near ptr proc_4
|
002 000302 E8F5FF CALL near ptr proc_4
|
||||||
003 000305 E8F2FF CALL near ptr proc_4
|
003 000305 E8F2FF CALL near ptr proc_4
|
||||||
004 000308 E8EFFF CALL near ptr proc_4
|
004 000308 E8EFFF CALL near ptr proc_4
|
||||||
005 00030B E8ECFF CALL near ptr proc_4
|
005 00030B E8ECFF CALL near ptr proc_4
|
||||||
006 00030E E8E9FF CALL near ptr proc_4
|
006 00030E E8E9FF CALL near ptr proc_4
|
||||||
007 000311 E8E6FF CALL near ptr proc_4
|
007 000311 E8E6FF CALL near ptr proc_4
|
||||||
008 000314 E8E3FF CALL near ptr proc_4
|
008 000314 E8E3FF CALL near ptr proc_4
|
||||||
009 000317 E8E0FF CALL near ptr proc_4
|
009 000317 E8E0FF CALL near ptr proc_4
|
||||||
010 00031A E8DDFF CALL near ptr proc_4
|
010 00031A E8DDFF CALL near ptr proc_4
|
||||||
011 00031D E8DAFF CALL near ptr proc_4
|
011 00031D E8DAFF CALL near ptr proc_4
|
||||||
012 000320 5D POP bp
|
012 000320 5D POP bp
|
||||||
013 000321 C3 RET
|
013 000321 C3 RET
|
||||||
|
|
||||||
@ -27,16 +27,16 @@
|
|||||||
proc_2 PROC NEAR
|
proc_2 PROC NEAR
|
||||||
000 000322 55 PUSH bp
|
000 000322 55 PUSH bp
|
||||||
001 000323 8BEC MOV bp, sp
|
001 000323 8BEC MOV bp, sp
|
||||||
002 000325 E8D7FF CALL near ptr proc_3
|
002 000325 E8D7FF CALL near ptr proc_3
|
||||||
003 000328 E8D4FF CALL near ptr proc_3
|
003 000328 E8D4FF CALL near ptr proc_3
|
||||||
004 00032B E8D1FF CALL near ptr proc_3
|
004 00032B E8D1FF CALL near ptr proc_3
|
||||||
005 00032E E8CEFF CALL near ptr proc_3
|
005 00032E E8CEFF CALL near ptr proc_3
|
||||||
006 000331 E8CBFF CALL near ptr proc_3
|
006 000331 E8CBFF CALL near ptr proc_3
|
||||||
007 000334 E8C8FF CALL near ptr proc_3
|
007 000334 E8C8FF CALL near ptr proc_3
|
||||||
008 000337 E8C5FF CALL near ptr proc_3
|
008 000337 E8C5FF CALL near ptr proc_3
|
||||||
009 00033A E8C2FF CALL near ptr proc_3
|
009 00033A E8C2FF CALL near ptr proc_3
|
||||||
010 00033D E8BFFF CALL near ptr proc_3
|
010 00033D E8BFFF CALL near ptr proc_3
|
||||||
011 000340 E8BCFF CALL near ptr proc_3
|
011 000340 E8BCFF CALL near ptr proc_3
|
||||||
012 000343 5D POP bp
|
012 000343 5D POP bp
|
||||||
013 000344 C3 RET
|
013 000344 C3 RET
|
||||||
|
|
||||||
@ -45,15 +45,15 @@
|
|||||||
proc_1 PROC NEAR
|
proc_1 PROC NEAR
|
||||||
000 000345 55 PUSH bp
|
000 000345 55 PUSH bp
|
||||||
001 000346 8BEC MOV bp, sp
|
001 000346 8BEC MOV bp, sp
|
||||||
002 000348 E8D7FF CALL near ptr proc_2
|
002 000348 E8D7FF CALL near ptr proc_2
|
||||||
003 00034B E8D4FF CALL near ptr proc_2
|
003 00034B E8D4FF CALL near ptr proc_2
|
||||||
004 00034E E8D1FF CALL near ptr proc_2
|
004 00034E E8D1FF CALL near ptr proc_2
|
||||||
005 000351 E8CEFF CALL near ptr proc_2
|
005 000351 E8CEFF CALL near ptr proc_2
|
||||||
006 000354 E8CBFF CALL near ptr proc_2
|
006 000354 E8CBFF CALL near ptr proc_2
|
||||||
007 000357 E8C8FF CALL near ptr proc_2
|
007 000357 E8C8FF CALL near ptr proc_2
|
||||||
008 00035A E8C5FF CALL near ptr proc_2
|
008 00035A E8C5FF CALL near ptr proc_2
|
||||||
009 00035D E8C2FF CALL near ptr proc_2
|
009 00035D E8C2FF CALL near ptr proc_2
|
||||||
010 000360 E8BFFF CALL near ptr proc_2
|
010 000360 E8BFFF CALL near ptr proc_2
|
||||||
011 000363 5D POP bp
|
011 000363 5D POP bp
|
||||||
012 000364 C3 RET
|
012 000364 C3 RET
|
||||||
|
|
||||||
@ -65,23 +65,23 @@
|
|||||||
002 000368 83EC08 SUB sp, 8
|
002 000368 83EC08 SUB sp, 8
|
||||||
003 00036B B89401 MOV ax, 194h
|
003 00036B B89401 MOV ax, 194h
|
||||||
004 00036E 50 PUSH ax
|
004 00036E 50 PUSH ax
|
||||||
005 00036F E8D90B CALL near ptr printf
|
005 00036F E8D90B CALL near ptr printf
|
||||||
006 000372 59 POP cx
|
006 000372 59 POP cx
|
||||||
007 000373 8D46FC LEA ax, [bp-4]
|
007 000373 8D46FC LEA ax, [bp-4]
|
||||||
008 000376 50 PUSH ax
|
008 000376 50 PUSH ax
|
||||||
009 000377 B8B001 MOV ax, 1B0h
|
009 000377 B8B001 MOV ax, 1B0h
|
||||||
010 00037A 50 PUSH ax
|
010 00037A 50 PUSH ax
|
||||||
011 00037B E85614 CALL near ptr scanf
|
011 00037B E85614 CALL near ptr scanf
|
||||||
012 00037E 59 POP cx
|
012 00037E 59 POP cx
|
||||||
013 00037F 59 POP cx
|
013 00037F 59 POP cx
|
||||||
014 000380 FF76FE PUSH word ptr [bp-2]
|
014 000380 FF76FE PUSH word ptr [bp-2]
|
||||||
015 000383 FF76FC PUSH word ptr [bp-4]
|
015 000383 FF76FC PUSH word ptr [bp-4]
|
||||||
016 000386 B8B401 MOV ax, 1B4h
|
016 000386 B8B401 MOV ax, 1B4h
|
||||||
017 000389 50 PUSH ax
|
017 000389 50 PUSH ax
|
||||||
018 00038A E8BE0B CALL near ptr printf
|
018 00038A E8BE0B CALL near ptr printf
|
||||||
019 00038D 83C406 ADD sp, 6
|
019 00038D 83C406 ADD sp, 6
|
||||||
020 000390 C746FA0000 MOV word ptr [bp-6], 0
|
020 000390 C746FA0000 MOV word ptr [bp-6], 0
|
||||||
021 000395 C746F80100 MOV word ptr [bp-8], 1
|
021 000395 C746F80100 MOV word ptr [bp-8], 1
|
||||||
|
|
||||||
023 0003A7 8B56FA L1: MOV dx, [bp-6]
|
023 0003A7 8B56FA L1: MOV dx, [bp-6]
|
||||||
024 0003AA 8B46F8 MOV ax, [bp-8]
|
024 0003AA 8B46F8 MOV ax, [bp-8]
|
||||||
@ -93,15 +93,15 @@
|
|||||||
|
|
||||||
030 0003B9 B8CE01 L3: MOV ax, 1CEh
|
030 0003B9 B8CE01 L3: MOV ax, 1CEh
|
||||||
031 0003BC 50 PUSH ax
|
031 0003BC 50 PUSH ax
|
||||||
032 0003BD E88B0B CALL near ptr printf
|
032 0003BD E88B0B CALL near ptr printf
|
||||||
033 0003C0 59 POP cx
|
033 0003C0 59 POP cx
|
||||||
034 0003C1 8BE5 MOV sp, bp
|
034 0003C1 8BE5 MOV sp, bp
|
||||||
035 0003C3 5D POP bp
|
035 0003C3 5D POP bp
|
||||||
036 0003C4 C3 RET
|
036 0003C4 C3 RET
|
||||||
|
|
||||||
037 00039C E8A6FF L2: CALL near ptr proc_1
|
037 00039C E8A6FF L2: CALL near ptr proc_1
|
||||||
038 00039F 8346F801 ADD word ptr [bp-8], 1
|
038 00039F 8346F801 ADD word ptr [bp-8], 1
|
||||||
039 0003A3 8356FA00 ADC word ptr [bp-6], 0
|
039 0003A3 8356FA00 ADC word ptr [bp-6], 0
|
||||||
040 JMP L1 ;Synthetic inst
|
040 JMP L1 ;Synthetic inst
|
||||||
|
|
||||||
main ENDP
|
main ENDP
|
||||||
|
|||||||
@ -91,41 +91,41 @@
|
|||||||
004 000303 50 PUSH ax
|
004 000303 50 PUSH ax
|
||||||
005 000304 B89401 MOV ax, 194h
|
005 000304 B89401 MOV ax, 194h
|
||||||
006 000307 50 PUSH ax
|
006 000307 50 PUSH ax
|
||||||
007 000308 E85D15 CALL near ptr scanf
|
007 000308 E85D15 CALL near ptr scanf
|
||||||
008 00030B 59 POP cx
|
008 00030B 59 POP cx
|
||||||
009 00030C 59 POP cx
|
009 00030C 59 POP cx
|
||||||
010 00030D FF76FE PUSH word ptr [bp-2]
|
010 00030D FF76FE PUSH word ptr [bp-2]
|
||||||
011 000310 FF76FC PUSH word ptr [bp-4]
|
011 000310 FF76FC PUSH word ptr [bp-4]
|
||||||
012 000313 B89801 MOV ax, 198h
|
012 000313 B89801 MOV ax, 198h
|
||||||
013 000316 50 PUSH ax
|
013 000316 50 PUSH ax
|
||||||
014 000317 E8C50C CALL near ptr printf
|
014 000317 E8C50C CALL near ptr printf
|
||||||
015 00031A 83C406 ADD sp, 6
|
015 00031A 83C406 ADD sp, 6
|
||||||
016 00031D 8D46EC LEA ax, [bp-14h]
|
016 00031D 8D46EC LEA ax, [bp-14h]
|
||||||
017 000320 50 PUSH ax
|
017 000320 50 PUSH ax
|
||||||
018 000321 B8B201 MOV ax, 1B2h
|
018 000321 B8B201 MOV ax, 1B2h
|
||||||
019 000324 50 PUSH ax
|
019 000324 50 PUSH ax
|
||||||
020 000325 E84015 CALL near ptr scanf
|
020 000325 E84015 CALL near ptr scanf
|
||||||
021 000328 59 POP cx
|
021 000328 59 POP cx
|
||||||
022 000329 59 POP cx
|
022 000329 59 POP cx
|
||||||
023 00032A 8D46F0 LEA ax, [bp-10h]
|
023 00032A 8D46F0 LEA ax, [bp-10h]
|
||||||
024 00032D 50 PUSH ax
|
024 00032D 50 PUSH ax
|
||||||
025 00032E B8B601 MOV ax, 1B6h
|
025 00032E B8B601 MOV ax, 1B6h
|
||||||
026 000331 50 PUSH ax
|
026 000331 50 PUSH ax
|
||||||
027 000332 E83315 CALL near ptr scanf
|
027 000332 E83315 CALL near ptr scanf
|
||||||
028 000335 59 POP cx
|
028 000335 59 POP cx
|
||||||
029 000336 59 POP cx
|
029 000336 59 POP cx
|
||||||
030 000337 C746FA0000 MOV word ptr [bp-6], 0
|
030 000337 C746FA0000 MOV word ptr [bp-6], 0
|
||||||
031 00033C C746F80100 MOV word ptr [bp-8], 1
|
031 00033C C746F80100 MOV word ptr [bp-8], 1
|
||||||
|
|
||||||
033 00042D 8B56FA L11: MOV dx, [bp-6]
|
033 00042D 8B56FA L11: MOV dx, [bp-6]
|
||||||
034 000430 8B46F8 MOV ax, [bp-8]
|
034 000430 8B46F8 MOV ax, [bp-8]
|
||||||
035 000433 3B56FE CMP dx, [bp-2]
|
035 000433 3B56FE CMP dx, [bp-2]
|
||||||
036 000436 7D03 JGE L12
|
036 000436 7D03 JGE L12
|
||||||
|
|
||||||
038 000344 C746F60000 L13: MOV word ptr [bp-0Ah], 0
|
038 000344 C746F60000 L13: MOV word ptr [bp-0Ah], 0
|
||||||
039 000349 C746F40100 MOV word ptr [bp-0Ch], 1
|
039 000349 C746F40100 MOV word ptr [bp-0Ch], 1
|
||||||
|
|
||||||
041 000411 837EF600 L14: CMP word ptr [bp-0Ah], 0
|
041 000411 837EF600 L14: CMP word ptr [bp-0Ah], 0
|
||||||
042 000415 7D03 JGE L15
|
042 000415 7D03 JGE L15
|
||||||
|
|
||||||
044 000351 8B56EE L16: MOV dx, [bp-12h]
|
044 000351 8B56EE L16: MOV dx, [bp-12h]
|
||||||
@ -146,9 +146,9 @@
|
|||||||
059 00037B B80A00 MOV ax, 0Ah
|
059 00037B B80A00 MOV ax, 0Ah
|
||||||
060 00037E 52 PUSH dx
|
060 00037E 52 PUSH dx
|
||||||
061 00037F 50 PUSH ax
|
061 00037F 50 PUSH ax
|
||||||
062 000380 FF76F2 PUSH word ptr [bp-0Eh]
|
062 000380 FF76F2 PUSH word ptr [bp-0Eh]
|
||||||
063 000383 FF76F0 PUSH word ptr [bp-10h]
|
063 000383 FF76F0 PUSH word ptr [bp-10h]
|
||||||
064 000386 9AEB1D1000 CALL far ptr LMOD@
|
064 000386 9AEB1D1000 CALL far ptr LMOD@
|
||||||
065 00038B 8956EE MOV [bp-12h], dx
|
065 00038B 8956EE MOV [bp-12h], dx
|
||||||
066 00038E 8946EC MOV [bp-14h], ax
|
066 00038E 8946EC MOV [bp-14h], ax
|
||||||
067 000391 8B56F2 MOV dx, [bp-0Eh]
|
067 000391 8B56F2 MOV dx, [bp-0Eh]
|
||||||
@ -195,8 +195,8 @@
|
|||||||
107 000402 99 L23: CWD
|
107 000402 99 L23: CWD
|
||||||
108 000403 8956EE MOV [bp-12h], dx
|
108 000403 8956EE MOV [bp-12h], dx
|
||||||
109 000406 8946EC MOV [bp-14h], ax
|
109 000406 8946EC MOV [bp-14h], ax
|
||||||
110 000409 8346F401 ADD word ptr [bp-0Ch], 1
|
110 000409 8346F401 ADD word ptr [bp-0Ch], 1
|
||||||
111 00040D 8356F600 ADC word ptr [bp-0Ah], 0
|
111 00040D 8356F600 ADC word ptr [bp-0Ah], 0
|
||||||
112 JMP L14 ;Synthetic inst
|
112 JMP L14 ;Synthetic inst
|
||||||
|
|
||||||
113 000400 33C0 L21: XOR ax, ax
|
113 000400 33C0 L21: XOR ax, ax
|
||||||
@ -209,22 +209,22 @@
|
|||||||
118 JMP L18 ;Synthetic inst
|
118 JMP L18 ;Synthetic inst
|
||||||
|
|
||||||
119 00041A 7F09 L15: JG L24
|
119 00041A 7F09 L15: JG L24
|
||||||
120 00041C 837EF428 CMP word ptr [bp-0Ch], 28h
|
120 00041C 837EF428 CMP word ptr [bp-0Ch], 28h
|
||||||
121 000420 7703 JA L24
|
121 000420 7703 JA L24
|
||||||
|
|
||||||
123 000425 8346F801 L24: ADD word ptr [bp-8], 1
|
123 000425 8346F801 L24: ADD word ptr [bp-8], 1
|
||||||
124 000429 8356FA00 ADC word ptr [bp-6], 0
|
124 000429 8356FA00 ADC word ptr [bp-6], 0
|
||||||
125 JMP L11 ;Synthetic inst
|
125 JMP L11 ;Synthetic inst
|
||||||
|
|
||||||
126 00043B 7F08 L12: JG L25
|
126 00043B 7F08 L12: JG L25
|
||||||
127 00043D 3B46FC CMP ax, [bp-4]
|
127 00043D 3B46FC CMP ax, [bp-4]
|
||||||
128 000440 7703 JA L25
|
128 000440 7703 JA L25
|
||||||
|
|
||||||
130 000445 FF76EE L25: PUSH word ptr [bp-12h]
|
130 000445 FF76EE L25: PUSH word ptr [bp-12h]
|
||||||
131 000448 FF76EC PUSH word ptr [bp-14h]
|
131 000448 FF76EC PUSH word ptr [bp-14h]
|
||||||
132 00044B B8BA01 MOV ax, 1BAh
|
132 00044B B8BA01 MOV ax, 1BAh
|
||||||
133 00044E 50 PUSH ax
|
133 00044E 50 PUSH ax
|
||||||
134 00044F E88D0B CALL near ptr printf
|
134 00044F E88D0B CALL near ptr printf
|
||||||
135 000452 83C406 ADD sp, 6
|
135 000452 83C406 ADD sp, 6
|
||||||
136 000455 8BE5 MOV sp, bp
|
136 000455 8BE5 MOV sp, bp
|
||||||
137 000457 5D POP bp
|
137 000457 5D POP bp
|
||||||
|
|||||||
@ -14,87 +14,87 @@ long LMOD@ (long arg0, int arg2, int arg3)
|
|||||||
* Pascal calling convention.
|
* Pascal calling convention.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
MOV cx, 2
|
MOV cx, 2
|
||||||
PUSH bp
|
PUSH bp
|
||||||
PUSH si
|
PUSH si
|
||||||
PUSH di
|
PUSH di
|
||||||
MOV bp, sp
|
MOV bp, sp
|
||||||
MOV di, cx
|
MOV di, cx
|
||||||
MOV ax, [bp+0Ah]
|
MOV ax, [bp+0Ah]
|
||||||
MOV dx, [bp+0Ch]
|
MOV dx, [bp+0Ch]
|
||||||
MOV bx, [bp+0Eh]
|
MOV bx, [bp+0Eh]
|
||||||
MOV cx, [bp+10h]
|
MOV cx, [bp+10h]
|
||||||
CMP cx, 0
|
CMP cx, 0
|
||||||
JNE L1
|
JNE L1
|
||||||
OR dx, dx
|
OR dx, dx
|
||||||
JE L2
|
JE L2
|
||||||
OR bx, bx
|
OR bx, bx
|
||||||
JE L2
|
JE L2
|
||||||
|
|
||||||
L1: TEST di, 1
|
L1: TEST di, 1
|
||||||
JNE L3
|
JNE L3
|
||||||
OR dx, dx
|
OR dx, dx
|
||||||
JNS L4
|
JNS L4
|
||||||
NEG dx
|
NEG dx
|
||||||
NEG ax
|
NEG ax
|
||||||
SBB dx, 0
|
SBB dx, 0
|
||||||
OR di, 0Ch
|
OR di, 0Ch
|
||||||
|
|
||||||
L4: OR cx, cx
|
L4: OR cx, cx
|
||||||
JNS L3
|
JNS L3
|
||||||
NEG cx
|
NEG cx
|
||||||
NEG bx
|
NEG bx
|
||||||
SBB cx, 0
|
SBB cx, 0
|
||||||
XOR di, 4
|
XOR di, 4
|
||||||
|
|
||||||
L3: MOV bp, cx
|
L3: MOV bp, cx
|
||||||
MOV cx, 20h
|
MOV cx, 20h
|
||||||
PUSH di
|
PUSH di
|
||||||
XOR di, 0
|
XOR di, 0
|
||||||
XOR si, 0
|
XOR si, 0
|
||||||
|
|
||||||
L5: SHL ax, 1
|
L5: SHL ax, 1
|
||||||
RCL dx, 1
|
RCL dx, 1
|
||||||
RCL si, 1
|
RCL si, 1
|
||||||
RCL di, 1
|
RCL di, 1
|
||||||
CMP di, bp
|
CMP di, bp
|
||||||
JB L6
|
JB L6
|
||||||
JA L7
|
JA L7
|
||||||
CMP si, bx
|
CMP si, bx
|
||||||
JB L6
|
JB L6
|
||||||
|
|
||||||
L7: SUB si, bx
|
L7: SUB si, bx
|
||||||
SBB di, bp
|
SBB di, bp
|
||||||
INC ax
|
INC ax
|
||||||
|
|
||||||
L6: LOOP L5
|
L6: LOOP L5
|
||||||
POP bx
|
POP bx
|
||||||
TEST bx, 2
|
TEST bx, 2
|
||||||
JE L8
|
JE L8
|
||||||
MOV ax, si
|
MOV ax, si
|
||||||
MOV dx, di
|
MOV dx, di
|
||||||
SHR bx, 1
|
SHR bx, 1
|
||||||
|
|
||||||
L8: TEST bx, 4
|
L8: TEST bx, 4
|
||||||
JE L9
|
JE L9
|
||||||
NEG dx
|
NEG dx
|
||||||
NEG ax
|
NEG ax
|
||||||
SBB dx, 0
|
SBB dx, 0
|
||||||
|
|
||||||
L9: POP di
|
L9: POP di
|
||||||
POP si
|
POP si
|
||||||
POP bp
|
POP bp
|
||||||
RETF 8
|
RETF 8
|
||||||
|
|
||||||
L2: MOV tmp, dx:ax ;Synthetic inst
|
L2: MOV tmp, dx:ax ;Synthetic inst
|
||||||
DIV bx
|
DIV bx
|
||||||
MOD bx ;Synthetic inst
|
MOD bx ;Synthetic inst
|
||||||
TEST di, 2
|
TEST di, 2
|
||||||
JE L10
|
JE L10
|
||||||
MOV ax, dx
|
MOV ax, dx
|
||||||
|
|
||||||
L10: XOR dx, dx
|
L10: XOR dx, dx
|
||||||
JMP L9
|
JMP L9
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -5,37 +5,37 @@
|
|||||||
003 000300 56 PUSH si
|
003 000300 56 PUSH si
|
||||||
004 000301 B89401 MOV ax, 194h
|
004 000301 B89401 MOV ax, 194h
|
||||||
005 000304 50 PUSH ax
|
005 000304 50 PUSH ax
|
||||||
006 000305 E8530C CALL near ptr printf
|
006 000305 E8530C CALL near ptr printf
|
||||||
007 000308 59 POP cx
|
007 000308 59 POP cx
|
||||||
008 000309 8D46FC LEA ax, [bp-4]
|
008 000309 8D46FC LEA ax, [bp-4]
|
||||||
009 00030C 50 PUSH ax
|
009 00030C 50 PUSH ax
|
||||||
010 00030D B8B001 MOV ax, 1B0h
|
010 00030D B8B001 MOV ax, 1B0h
|
||||||
011 000310 50 PUSH ax
|
011 000310 50 PUSH ax
|
||||||
012 000311 E8D014 CALL near ptr scanf
|
012 000311 E8D014 CALL near ptr scanf
|
||||||
013 000314 59 POP cx
|
013 000314 59 POP cx
|
||||||
014 000315 59 POP cx
|
014 000315 59 POP cx
|
||||||
015 000316 FF76FE PUSH word ptr [bp-2]
|
015 000316 FF76FE PUSH word ptr [bp-2]
|
||||||
016 000319 FF76FC PUSH word ptr [bp-4]
|
016 000319 FF76FC PUSH word ptr [bp-4]
|
||||||
017 00031C B8B401 MOV ax, 1B4h
|
017 00031C B8B401 MOV ax, 1B4h
|
||||||
018 00031F 50 PUSH ax
|
018 00031F 50 PUSH ax
|
||||||
019 000320 E8380C CALL near ptr printf
|
019 000320 E8380C CALL near ptr printf
|
||||||
020 000323 83C406 ADD sp, 6
|
020 000323 83C406 ADD sp, 6
|
||||||
021 000326 8D46F4 LEA ax, [bp-0Ch]
|
021 000326 8D46F4 LEA ax, [bp-0Ch]
|
||||||
022 000329 50 PUSH ax
|
022 000329 50 PUSH ax
|
||||||
023 00032A B8CE01 MOV ax, 1CEh
|
023 00032A B8CE01 MOV ax, 1CEh
|
||||||
024 00032D 50 PUSH ax
|
024 00032D 50 PUSH ax
|
||||||
025 00032E E8B314 CALL near ptr scanf
|
025 00032E E8B314 CALL near ptr scanf
|
||||||
026 000331 59 POP cx
|
026 000331 59 POP cx
|
||||||
027 000332 59 POP cx
|
027 000332 59 POP cx
|
||||||
028 000333 8D46F6 LEA ax, [bp-0Ah]
|
028 000333 8D46F6 LEA ax, [bp-0Ah]
|
||||||
029 000336 50 PUSH ax
|
029 000336 50 PUSH ax
|
||||||
030 000337 B8D101 MOV ax, 1D1h
|
030 000337 B8D101 MOV ax, 1D1h
|
||||||
031 00033A 50 PUSH ax
|
031 00033A 50 PUSH ax
|
||||||
032 00033B E8A614 CALL near ptr scanf
|
032 00033B E8A614 CALL near ptr scanf
|
||||||
033 00033E 59 POP cx
|
033 00033E 59 POP cx
|
||||||
034 00033F 59 POP cx
|
034 00033F 59 POP cx
|
||||||
035 000340 C746FA0000 MOV word ptr [bp-6], 0
|
035 000340 C746FA0000 MOV word ptr [bp-6], 0
|
||||||
036 000345 C746F80100 MOV word ptr [bp-8], 1
|
036 000345 C746F80100 MOV word ptr [bp-8], 1
|
||||||
|
|
||||||
038 0003B2 8B56FA L1: MOV dx, [bp-6]
|
038 0003B2 8B56FA L1: MOV dx, [bp-6]
|
||||||
039 0003B5 8B46F8 MOV ax, [bp-8]
|
039 0003B5 8B46F8 MOV ax, [bp-8]
|
||||||
@ -45,10 +45,10 @@
|
|||||||
043 0003BF 3B46FC CMP ax, [bp-4]
|
043 0003BF 3B46FC CMP ax, [bp-4]
|
||||||
044 0003C2 7688 JBE L2
|
044 0003C2 7688 JBE L2
|
||||||
|
|
||||||
045 0003C4 FF76F4 L3: PUSH word ptr [bp-0Ch]
|
045 0003C4 FF76F4 L3: PUSH word ptr [bp-0Ch]
|
||||||
046 0003C7 B8D401 MOV ax, 1D4h
|
046 0003C7 B8D401 MOV ax, 1D4h
|
||||||
047 0003CA 50 PUSH ax
|
047 0003CA 50 PUSH ax
|
||||||
048 0003CB E88D0B CALL near ptr printf
|
048 0003CB E88D0B CALL near ptr printf
|
||||||
049 0003CE 59 POP cx
|
049 0003CE 59 POP cx
|
||||||
050 0003CF 59 POP cx
|
050 0003CF 59 POP cx
|
||||||
051 0003D0 5E POP si
|
051 0003D0 5E POP si
|
||||||
@ -60,35 +60,35 @@
|
|||||||
|
|
||||||
057 0003A5 83FE28 L4: CMP si, 28h
|
057 0003A5 83FE28 L4: CMP si, 28h
|
||||||
058 0003A8 7EA7 JLE L5
|
058 0003A8 7EA7 JLE L5
|
||||||
059 0003AA 8346F801 ADD word ptr [bp-8], 1
|
059 0003AA 8346F801 ADD word ptr [bp-8], 1
|
||||||
060 0003AE 8356FA00 ADC word ptr [bp-6], 0
|
060 0003AE 8356FA00 ADC word ptr [bp-6], 0
|
||||||
061 JMP L1 ;Synthetic inst
|
061 JMP L1 ;Synthetic inst
|
||||||
|
|
||||||
062 000351 8B46F4 L5: MOV ax, [bp-0Ch]
|
062 000351 8B46F4 L5: MOV ax, [bp-0Ch]
|
||||||
063 000354 F766F4 MUL word ptr [bp-0Ch]
|
063 000354 F766F4 MUL word ptr [bp-0Ch]
|
||||||
064 000357 F766F4 MUL word ptr [bp-0Ch]
|
064 000357 F766F4 MUL word ptr [bp-0Ch]
|
||||||
065 00035A F766F4 MUL word ptr [bp-0Ch]
|
065 00035A F766F4 MUL word ptr [bp-0Ch]
|
||||||
066 00035D F766F4 MUL word ptr [bp-0Ch]
|
066 00035D F766F4 MUL word ptr [bp-0Ch]
|
||||||
067 000360 F766F4 MUL word ptr [bp-0Ch]
|
067 000360 F766F4 MUL word ptr [bp-0Ch]
|
||||||
068 000363 F766F4 MUL word ptr [bp-0Ch]
|
068 000363 F766F4 MUL word ptr [bp-0Ch]
|
||||||
069 000366 F766F4 MUL word ptr [bp-0Ch]
|
069 000366 F766F4 MUL word ptr [bp-0Ch]
|
||||||
070 000369 F766F4 MUL word ptr [bp-0Ch]
|
070 000369 F766F4 MUL word ptr [bp-0Ch]
|
||||||
071 00036C F766F4 MUL word ptr [bp-0Ch]
|
071 00036C F766F4 MUL word ptr [bp-0Ch]
|
||||||
072 00036F F766F4 MUL word ptr [bp-0Ch]
|
072 00036F F766F4 MUL word ptr [bp-0Ch]
|
||||||
073 000372 F766F4 MUL word ptr [bp-0Ch]
|
073 000372 F766F4 MUL word ptr [bp-0Ch]
|
||||||
074 000375 F766F4 MUL word ptr [bp-0Ch]
|
074 000375 F766F4 MUL word ptr [bp-0Ch]
|
||||||
075 000378 F766F4 MUL word ptr [bp-0Ch]
|
075 000378 F766F4 MUL word ptr [bp-0Ch]
|
||||||
076 00037B F766F4 MUL word ptr [bp-0Ch]
|
076 00037B F766F4 MUL word ptr [bp-0Ch]
|
||||||
077 00037E F766F4 MUL word ptr [bp-0Ch]
|
077 00037E F766F4 MUL word ptr [bp-0Ch]
|
||||||
078 000381 F766F4 MUL word ptr [bp-0Ch]
|
078 000381 F766F4 MUL word ptr [bp-0Ch]
|
||||||
079 000384 F766F4 MUL word ptr [bp-0Ch]
|
079 000384 F766F4 MUL word ptr [bp-0Ch]
|
||||||
080 000387 F766F4 MUL word ptr [bp-0Ch]
|
080 000387 F766F4 MUL word ptr [bp-0Ch]
|
||||||
081 00038A F766F4 MUL word ptr [bp-0Ch]
|
081 00038A F766F4 MUL word ptr [bp-0Ch]
|
||||||
082 00038D F766F4 MUL word ptr [bp-0Ch]
|
082 00038D F766F4 MUL word ptr [bp-0Ch]
|
||||||
083 000390 F766F4 MUL word ptr [bp-0Ch]
|
083 000390 F766F4 MUL word ptr [bp-0Ch]
|
||||||
084 000393 F766F4 MUL word ptr [bp-0Ch]
|
084 000393 F766F4 MUL word ptr [bp-0Ch]
|
||||||
085 000396 F766F4 MUL word ptr [bp-0Ch]
|
085 000396 F766F4 MUL word ptr [bp-0Ch]
|
||||||
086 000399 F766F4 MUL word ptr [bp-0Ch]
|
086 000399 F766F4 MUL word ptr [bp-0Ch]
|
||||||
087 00039C BA0300 MOV dx, 3
|
087 00039C BA0300 MOV dx, 3
|
||||||
088 00039F F7E2 MUL dx
|
088 00039F F7E2 MUL dx
|
||||||
089 0003A1 8946F4 MOV [bp-0Ch], ax
|
089 0003A1 8946F4 MOV [bp-0Ch], ax
|
||||||
|
|||||||
@ -6,25 +6,25 @@
|
|||||||
004 000301 57 PUSH di
|
004 000301 57 PUSH di
|
||||||
005 000302 B8A801 MOV ax, 1A8h
|
005 000302 B8A801 MOV ax, 1A8h
|
||||||
006 000305 50 PUSH ax
|
006 000305 50 PUSH ax
|
||||||
007 000306 E8240C CALL near ptr printf
|
007 000306 E8240C CALL near ptr printf
|
||||||
008 000309 59 POP cx
|
008 000309 59 POP cx
|
||||||
009 00030A 8D46FC LEA ax, [bp-4]
|
009 00030A 8D46FC LEA ax, [bp-4]
|
||||||
010 00030D 50 PUSH ax
|
010 00030D 50 PUSH ax
|
||||||
011 00030E B8C401 MOV ax, 1C4h
|
011 00030E B8C401 MOV ax, 1C4h
|
||||||
012 000311 50 PUSH ax
|
012 000311 50 PUSH ax
|
||||||
013 000312 E8A114 CALL near ptr scanf
|
013 000312 E8A114 CALL near ptr scanf
|
||||||
014 000315 59 POP cx
|
014 000315 59 POP cx
|
||||||
015 000316 59 POP cx
|
015 000316 59 POP cx
|
||||||
016 000317 FF76FE PUSH word ptr [bp-2]
|
016 000317 FF76FE PUSH word ptr [bp-2]
|
||||||
017 00031A FF76FC PUSH word ptr [bp-4]
|
017 00031A FF76FC PUSH word ptr [bp-4]
|
||||||
018 00031D B8C801 MOV ax, 1C8h
|
018 00031D B8C801 MOV ax, 1C8h
|
||||||
019 000320 50 PUSH ax
|
019 000320 50 PUSH ax
|
||||||
020 000321 E8090C CALL near ptr printf
|
020 000321 E8090C CALL near ptr printf
|
||||||
021 000324 83C406 ADD sp, 6
|
021 000324 83C406 ADD sp, 6
|
||||||
022 000327 BE1400 MOV si, 14h
|
022 000327 BE1400 MOV si, 14h
|
||||||
023 00032A 8976F6 MOV [bp-0Ah], si
|
023 00032A 8976F6 MOV [bp-0Ah], si
|
||||||
024 00032D C746FA0000 MOV word ptr [bp-6], 0
|
024 00032D C746FA0000 MOV word ptr [bp-6], 0
|
||||||
025 000332 C746F80100 MOV word ptr [bp-8], 1
|
025 000332 C746F80100 MOV word ptr [bp-8], 1
|
||||||
|
|
||||||
027 000385 8B56FA L1: MOV dx, [bp-6]
|
027 000385 8B56FA L1: MOV dx, [bp-6]
|
||||||
028 000388 8B46F8 MOV ax, [bp-8]
|
028 000388 8B46F8 MOV ax, [bp-8]
|
||||||
@ -37,7 +37,7 @@
|
|||||||
034 000397 56 L3: PUSH si
|
034 000397 56 L3: PUSH si
|
||||||
035 000398 B8E201 MOV ax, 1E2h
|
035 000398 B8E201 MOV ax, 1E2h
|
||||||
036 00039B 50 PUSH ax
|
036 00039B 50 PUSH ax
|
||||||
037 00039C E88E0B CALL near ptr printf
|
037 00039C E88E0B CALL near ptr printf
|
||||||
038 00039F 59 POP cx
|
038 00039F 59 POP cx
|
||||||
039 0003A0 59 POP cx
|
039 0003A0 59 POP cx
|
||||||
040 0003A1 5F POP di
|
040 0003A1 5F POP di
|
||||||
@ -50,8 +50,8 @@
|
|||||||
|
|
||||||
047 000378 83FF28 L4: CMP di, 28h
|
047 000378 83FF28 L4: CMP di, 28h
|
||||||
048 00037B 7EC1 JLE L5
|
048 00037B 7EC1 JLE L5
|
||||||
049 00037D 8346F801 ADD word ptr [bp-8], 1
|
049 00037D 8346F801 ADD word ptr [bp-8], 1
|
||||||
050 000381 8356FA00 ADC word ptr [bp-6], 0
|
050 000381 8356FA00 ADC word ptr [bp-6], 0
|
||||||
051 JMP L1 ;Synthetic inst
|
051 JMP L1 ;Synthetic inst
|
||||||
|
|
||||||
052 00033E 8BC6 L5: MOV ax, si
|
052 00033E 8BC6 L5: MOV ax, si
|
||||||
|
|||||||
@ -6,43 +6,43 @@
|
|||||||
004 000303 50 PUSH ax
|
004 000303 50 PUSH ax
|
||||||
005 000304 B89401 MOV ax, 194h
|
005 000304 B89401 MOV ax, 194h
|
||||||
006 000307 50 PUSH ax
|
006 000307 50 PUSH ax
|
||||||
007 000308 E8E914 CALL near ptr scanf
|
007 000308 E8E914 CALL near ptr scanf
|
||||||
008 00030B 59 POP cx
|
008 00030B 59 POP cx
|
||||||
009 00030C 59 POP cx
|
009 00030C 59 POP cx
|
||||||
010 00030D FF76FE PUSH word ptr [bp-2]
|
010 00030D FF76FE PUSH word ptr [bp-2]
|
||||||
011 000310 FF76FC PUSH word ptr [bp-4]
|
011 000310 FF76FC PUSH word ptr [bp-4]
|
||||||
012 000313 B89801 MOV ax, 198h
|
012 000313 B89801 MOV ax, 198h
|
||||||
013 000316 50 PUSH ax
|
013 000316 50 PUSH ax
|
||||||
014 000317 E8510C CALL near ptr printf
|
014 000317 E8510C CALL near ptr printf
|
||||||
015 00031A 83C406 ADD sp, 6
|
015 00031A 83C406 ADD sp, 6
|
||||||
016 00031D 8D46F2 LEA ax, [bp-0Eh]
|
016 00031D 8D46F2 LEA ax, [bp-0Eh]
|
||||||
017 000320 50 PUSH ax
|
017 000320 50 PUSH ax
|
||||||
018 000321 B8B201 MOV ax, 1B2h
|
018 000321 B8B201 MOV ax, 1B2h
|
||||||
019 000324 50 PUSH ax
|
019 000324 50 PUSH ax
|
||||||
020 000325 E8CC14 CALL near ptr scanf
|
020 000325 E8CC14 CALL near ptr scanf
|
||||||
021 000328 59 POP cx
|
021 000328 59 POP cx
|
||||||
022 000329 59 POP cx
|
022 000329 59 POP cx
|
||||||
023 00032A 8D46F4 LEA ax, [bp-0Ch]
|
023 00032A 8D46F4 LEA ax, [bp-0Ch]
|
||||||
024 00032D 50 PUSH ax
|
024 00032D 50 PUSH ax
|
||||||
025 00032E B8B601 MOV ax, 1B6h
|
025 00032E B8B601 MOV ax, 1B6h
|
||||||
026 000331 50 PUSH ax
|
026 000331 50 PUSH ax
|
||||||
027 000332 E8BF14 CALL near ptr scanf
|
027 000332 E8BF14 CALL near ptr scanf
|
||||||
028 000335 59 POP cx
|
028 000335 59 POP cx
|
||||||
029 000336 59 POP cx
|
029 000336 59 POP cx
|
||||||
030 000337 C746FA0000 MOV word ptr [bp-6], 0
|
030 000337 C746FA0000 MOV word ptr [bp-6], 0
|
||||||
031 00033C C746F80100 MOV word ptr [bp-8], 1
|
031 00033C C746F80100 MOV word ptr [bp-8], 1
|
||||||
|
|
||||||
033 0003BD 8B56FA L1: MOV dx, [bp-6]
|
033 0003BD 8B56FA L1: MOV dx, [bp-6]
|
||||||
034 0003C0 8B46F8 MOV ax, [bp-8]
|
034 0003C0 8B46F8 MOV ax, [bp-8]
|
||||||
035 0003C3 3B56FE CMP dx, [bp-2]
|
035 0003C3 3B56FE CMP dx, [bp-2]
|
||||||
036 0003C6 7D03 JGE L2
|
036 0003C6 7D03 JGE L2
|
||||||
|
|
||||||
038 000344 C746F60100 L3: MOV word ptr [bp-0Ah], 1
|
038 000344 C746F60100 L3: MOV word ptr [bp-0Ah], 1
|
||||||
|
|
||||||
040 0003AF 837EF628 L4: CMP word ptr [bp-0Ah], 28h
|
040 0003AF 837EF628 L4: CMP word ptr [bp-0Ah], 28h
|
||||||
041 0003B3 7E96 JLE L5
|
041 0003B3 7E96 JLE L5
|
||||||
042 0003B5 8346F801 ADD word ptr [bp-8], 1
|
042 0003B5 8346F801 ADD word ptr [bp-8], 1
|
||||||
043 0003B9 8356FA00 ADC word ptr [bp-6], 0
|
043 0003B9 8356FA00 ADC word ptr [bp-6], 0
|
||||||
044 JMP L1 ;Synthetic inst
|
044 JMP L1 ;Synthetic inst
|
||||||
|
|
||||||
045 00034B 8B46F2 L5: MOV ax, [bp-0Eh]
|
045 00034B 8B46F2 L5: MOV ax, [bp-0Eh]
|
||||||
@ -82,7 +82,7 @@
|
|||||||
079 0003A2 B80100 MOV ax, 1
|
079 0003A2 B80100 MOV ax, 1
|
||||||
|
|
||||||
081 0003A9 8946F2 L9: MOV [bp-0Eh], ax
|
081 0003A9 8946F2 L9: MOV [bp-0Eh], ax
|
||||||
082 0003AC FF46F6 INC word ptr [bp-0Ah]
|
082 0003AC FF46F6 INC word ptr [bp-0Ah]
|
||||||
083 JMP L4 ;Synthetic inst
|
083 JMP L4 ;Synthetic inst
|
||||||
|
|
||||||
084 0003A7 33C0 L8: XOR ax, ax
|
084 0003A7 33C0 L8: XOR ax, ax
|
||||||
@ -95,10 +95,10 @@
|
|||||||
089 0003CD 3B46FC CMP ax, [bp-4]
|
089 0003CD 3B46FC CMP ax, [bp-4]
|
||||||
090 0003D0 7703 JA L10
|
090 0003D0 7703 JA L10
|
||||||
|
|
||||||
092 0003D5 FF76F2 L10: PUSH word ptr [bp-0Eh]
|
092 0003D5 FF76F2 L10: PUSH word ptr [bp-0Eh]
|
||||||
093 0003D8 B8BA01 MOV ax, 1BAh
|
093 0003D8 B8BA01 MOV ax, 1BAh
|
||||||
094 0003DB 50 PUSH ax
|
094 0003DB 50 PUSH ax
|
||||||
095 0003DC E88C0B CALL near ptr printf
|
095 0003DC E88C0B CALL near ptr printf
|
||||||
096 0003DF 59 POP cx
|
096 0003DF 59 POP cx
|
||||||
097 0003E0 59 POP cx
|
097 0003E0 59 POP cx
|
||||||
098 0003E1 8BE5 MOV sp, bp
|
098 0003E1 8BE5 MOV sp, bp
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
000 0002FA 55 PUSH bp
|
000 0002FA 55 PUSH bp
|
||||||
001 0002FB 8BEC MOV bp, sp
|
001 0002FB 8BEC MOV bp, sp
|
||||||
002 0002FD 83EC02 SUB sp, 2
|
002 0002FD 83EC02 SUB sp, 2
|
||||||
003 000300 C646FEFF MOV byte ptr [bp-2], 0FFh
|
003 000300 C646FEFF MOV byte ptr [bp-2], 0FFh
|
||||||
004 000304 C646FF8F MOV byte ptr [bp-1], 8Fh
|
004 000304 C646FF8F MOV byte ptr [bp-1], 8Fh
|
||||||
005 000308 8A46FE MOV al, [bp-2]
|
005 000308 8A46FE MOV al, [bp-2]
|
||||||
006 00030B 0246FF ADD al, [bp-1]
|
006 00030B 0246FF ADD al, [bp-1]
|
||||||
007 00030E 8846FF MOV [bp-1], al
|
007 00030E 8846FF MOV [bp-1], al
|
||||||
@ -52,7 +52,7 @@
|
|||||||
050 00036D 50 PUSH ax
|
050 00036D 50 PUSH ax
|
||||||
051 00036E B89401 MOV ax, 194h
|
051 00036E B89401 MOV ax, 194h
|
||||||
052 000371 50 PUSH ax
|
052 000371 50 PUSH ax
|
||||||
053 000372 E8AB06 CALL near ptr printf
|
053 000372 E8AB06 CALL near ptr printf
|
||||||
054 000375 83C406 ADD sp, 6
|
054 000375 83C406 ADD sp, 6
|
||||||
055 000378 8BE5 MOV sp, bp
|
055 000378 8BE5 MOV sp, bp
|
||||||
056 00037A 5D POP bp
|
056 00037A 5D POP bp
|
||||||
|
|||||||
@ -8,13 +8,13 @@
|
|||||||
006 000367 8BC6 MOV ax, si
|
006 000367 8BC6 MOV ax, si
|
||||||
007 000369 48 DEC ax
|
007 000369 48 DEC ax
|
||||||
008 00036A 50 PUSH ax
|
008 00036A 50 PUSH ax
|
||||||
009 00036B E8EDFF CALL near ptr proc_1
|
009 00036B E8EDFF CALL near ptr proc_1
|
||||||
010 00036E 59 POP cx
|
010 00036E 59 POP cx
|
||||||
011 00036F 50 PUSH ax
|
011 00036F 50 PUSH ax
|
||||||
012 000370 8BC6 MOV ax, si
|
012 000370 8BC6 MOV ax, si
|
||||||
013 000372 05FEFF ADD ax, 0FFFEh
|
013 000372 05FEFF ADD ax, 0FFFEh
|
||||||
014 000375 50 PUSH ax
|
014 000375 50 PUSH ax
|
||||||
015 000376 E8E2FF CALL near ptr proc_1
|
015 000376 E8E2FF CALL near ptr proc_1
|
||||||
016 000379 59 POP cx
|
016 000379 59 POP cx
|
||||||
017 00037A 8BD0 MOV dx, ax
|
017 00037A 8BD0 MOV dx, ax
|
||||||
018 00037C 58 POP ax
|
018 00037C 58 POP ax
|
||||||
@ -37,13 +37,13 @@
|
|||||||
004 000301 57 PUSH di
|
004 000301 57 PUSH di
|
||||||
005 000302 B89401 MOV ax, 194h
|
005 000302 B89401 MOV ax, 194h
|
||||||
006 000305 50 PUSH ax
|
006 000305 50 PUSH ax
|
||||||
007 000306 E8080C CALL near ptr printf
|
007 000306 E8080C CALL near ptr printf
|
||||||
008 000309 59 POP cx
|
008 000309 59 POP cx
|
||||||
009 00030A 8D46FC LEA ax, [bp-4]
|
009 00030A 8D46FC LEA ax, [bp-4]
|
||||||
010 00030D 50 PUSH ax
|
010 00030D 50 PUSH ax
|
||||||
011 00030E B8B101 MOV ax, 1B1h
|
011 00030E B8B101 MOV ax, 1B1h
|
||||||
012 000311 50 PUSH ax
|
012 000311 50 PUSH ax
|
||||||
013 000312 E88514 CALL near ptr scanf
|
013 000312 E88514 CALL near ptr scanf
|
||||||
014 000315 59 POP cx
|
014 000315 59 POP cx
|
||||||
015 000316 59 POP cx
|
015 000316 59 POP cx
|
||||||
016 000317 BE0100 MOV si, 1
|
016 000317 BE0100 MOV si, 1
|
||||||
@ -52,7 +52,7 @@
|
|||||||
019 00034C 7ECE JLE L4
|
019 00034C 7ECE JLE L4
|
||||||
020 00034E 33C0 XOR ax, ax
|
020 00034E 33C0 XOR ax, ax
|
||||||
021 000350 50 PUSH ax
|
021 000350 50 PUSH ax
|
||||||
022 000351 E87300 CALL near ptr exit
|
022 000351 E87300 CALL near ptr exit
|
||||||
023 000354 59 POP cx
|
023 000354 59 POP cx
|
||||||
024 000355 5F POP di
|
024 000355 5F POP di
|
||||||
025 000356 5E POP si
|
025 000356 5E POP si
|
||||||
@ -62,24 +62,24 @@
|
|||||||
|
|
||||||
029 00031C B8B401 L4: MOV ax, 1B4h
|
029 00031C B8B401 L4: MOV ax, 1B4h
|
||||||
030 00031F 50 PUSH ax
|
030 00031F 50 PUSH ax
|
||||||
031 000320 E8EE0B CALL near ptr printf
|
031 000320 E8EE0B CALL near ptr printf
|
||||||
032 000323 59 POP cx
|
032 000323 59 POP cx
|
||||||
033 000324 8D46FE LEA ax, [bp-2]
|
033 000324 8D46FE LEA ax, [bp-2]
|
||||||
034 000327 50 PUSH ax
|
034 000327 50 PUSH ax
|
||||||
035 000328 B8C301 MOV ax, 1C3h
|
035 000328 B8C301 MOV ax, 1C3h
|
||||||
036 00032B 50 PUSH ax
|
036 00032B 50 PUSH ax
|
||||||
037 00032C E86B14 CALL near ptr scanf
|
037 00032C E86B14 CALL near ptr scanf
|
||||||
038 00032F 59 POP cx
|
038 00032F 59 POP cx
|
||||||
039 000330 59 POP cx
|
039 000330 59 POP cx
|
||||||
040 000331 FF76FE PUSH word ptr [bp-2]
|
040 000331 FF76FE PUSH word ptr [bp-2]
|
||||||
041 000334 E82400 CALL near ptr proc_1
|
041 000334 E82400 CALL near ptr proc_1
|
||||||
042 000337 59 POP cx
|
042 000337 59 POP cx
|
||||||
043 000338 8BF8 MOV di, ax
|
043 000338 8BF8 MOV di, ax
|
||||||
044 00033A 57 PUSH di
|
044 00033A 57 PUSH di
|
||||||
045 00033B FF76FE PUSH word ptr [bp-2]
|
045 00033B FF76FE PUSH word ptr [bp-2]
|
||||||
046 00033E B8C601 MOV ax, 1C6h
|
046 00033E B8C601 MOV ax, 1C6h
|
||||||
047 000341 50 PUSH ax
|
047 000341 50 PUSH ax
|
||||||
048 000342 E8CC0B CALL near ptr printf
|
048 000342 E8CC0B CALL near ptr printf
|
||||||
049 000345 83C406 ADD sp, 6
|
049 000345 83C406 ADD sp, 6
|
||||||
050 000348 46 INC si
|
050 000348 46 INC si
|
||||||
051 JMP L3 ;Synthetic inst
|
051 JMP L3 ;Synthetic inst
|
||||||
|
|||||||
@ -2,13 +2,13 @@
|
|||||||
000 000100 55 PUSH bp
|
000 000100 55 PUSH bp
|
||||||
001 000101 8BEC MOV bp, sp
|
001 000101 8BEC MOV bp, sp
|
||||||
002 000103 83EC02 SUB sp, 2
|
002 000103 83EC02 SUB sp, 2
|
||||||
003 000106 C746FE0000 MOV word ptr [bp-2], 0
|
003 000106 C746FE0000 MOV word ptr [bp-2], 0
|
||||||
004 00010B 8B46FE MOV ax, [bp-2]
|
004 00010B 8B46FE MOV ax, [bp-2]
|
||||||
005 00010E 3D0600 CMP ax, 6
|
005 00010E 3D0600 CMP ax, 6
|
||||||
006 000111 7735 JA L1
|
006 000111 7735 JA L1
|
||||||
007 000113 8BD8 MOV bx, ax
|
007 000113 8BD8 MOV bx, ax
|
||||||
008 000115 D1E3 SHL bx, 1
|
008 000115 D1E3 SHL bx, 1
|
||||||
009 000117 2EFFA71C00 JMP word ptr cs:[bx+1Ch] ;Switch
|
009 000117 2EFFA71C00 JMP word ptr cs:[bx+1Ch];Switch
|
||||||
|
|
||||||
010 00012A B80200 MOV ax, 2 ;Case l0
|
010 00012A B80200 MOV ax, 2 ;Case l0
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user