📄 decoder.c
字号:
case 15: r=op(); if(!r) return 0; x=result; // wait group
i_opclass=15; i_opcode=x;
b=PeekOneByte();
if (b==217)
{
b=PeekSecondByte();
if (regTable[b]==6||regTable[b]==7)
{
r=op(); if(!r) return 0; y=result;
r=opext(); if(!r) return 0;
i_opcode=y; prefixStack[i_psp++]=x;
}
}
else if (b==219)
{
b=PeekSecondByte();
if (b==226||b==227)
{
r=op(); if(!r) return 0; y1=result;
r=op(); if(!r) return 0; y2=result;
i_opcode=y1; i_mod=y2; prefixStack[i_psp++]=x;
}
}
else if (b==221)
{
b=PeekSecondByte();
if (regTable[b]==6||regTable[b]==7)
{
r=op(); if(!r) return 0; y=result;
r=opext(); if(!r) return 0;
i_opcode=y; prefixStack[i_psp++]=x;
}
}
else if (b==223)
{
b=PeekSecondByte();
if (b==224)
{
r=op(); if(!r) return 0; y1=result;
r=op(); if(!r) return 0; y2=result;
i_opcode=y1; i_mod=y2; prefixStack[i_psp++]=x;
}
}
break;
case 16: r=op(); if(!r) return 0; x=result; // repeat group
if (x==242)
{
while(prefixes());
b=PeekOneByte();
if (repeatgroupTable[b]==1)
{
r=op(); if(!r) return 0; y=result;
i_opclass=16; i_opcode=y; prefixStack[i_psp++]=x;
}
else return 0;
}
else
{
while(prefixes());
b=PeekOneByte();
if (repeatgroupTable[b]>0)
{
r=op(); if(!r) return 0; y=result;
i_opclass=16; i_opcode=y; prefixStack[i_psp++]=x;
}
else return 0;
}
break;
default: return 0;
}
return 1;
}
int twobyteinstr()
{
int r, b, x, y;
b=PeekOneByte();
switch(opcode2Table[b])
{
case 0: r=op(); if(!r) return 0; x=result;
i_opclass=0; i_opcode=x;
break;
case 1: r=op(); if(!r) return 0; x=result;
r=adword(); if(!r) return 0; y=result;
i_opclass=1; i_opcode=x; i_dword=y;
break;
case 2: r=op(); if(!r) return 0; x=result;
r=modrm(); if(!r) return 0;
i_opclass=2; i_opcode=x;
break;
case 3: r=op(); if(!r) return 0; x=result;
r=modrm(); if(!r) return 0;
r=byte(); if(!r) return 0; y=result;
i_opclass=3; i_opcode=x; i_byte=y;
break;
case 4: r=op(); if(!r) return 0; x=result;
r=opext(); if(!r) return 0;
i_opclass=4; i_opcode=x;
break;
case 5: r=op(); if(!r) return 0; x=result;
r=opext(); if(!r) return 0;
r=byte(); if(!r) return 0; y=result;
i_opclass=5; i_opcode=x; i_byte=y;
break;
default:
return 0;
}
return 1;
}
int modrm()
{
if (addressOveride==0) return modrm1();
else if (addressOveride==1) return modrm2();
else return 0;
}
int modrm1()
{
int r, b, x, y, y1, y2;
b=PeekOneByte();
switch(modTable[b])
{
case 1: r=op(); if(!r) return 0; x=result;
i_mod=x;
break;
case 2: r=op(); if(!r) return 0; x=result;
r=op(); if(!r) return 0; y=result;
i_mod=x; i_sib=y;
if (sibTable[y]==1)
{
r=dword(); if(!r) return 0; y1=result;
m_dword=y1;
}
break;
case 3: r=op(); if(!r) return 0; x=result;
r=dword(); if(!r) return 0; y=result;
i_mod=x; m_dword=y;
break;
case 4: r=op(); if(!r) return 0; x=result;
r=byte(); if(!r) return 0; y=result;
i_mod=x; m_byte=y;
break;
case 5: r=op(); if(!r) return 0; x=result;
r=sib(); if(!r) return 0; y1=result;
r=byte(); if(!r) return 0; y2=result;
i_mod=x; i_sib=y1; m_byte=y2;
break;
case 6: r=op(); if(!r) return 0; x=result;
r=dword(); if(!r) return 0; y=result;
i_mod=x; m_dword=y;
break;
case 7: r=op(); if(!r) return 0; x=result;
r=sib(); if(!r) return 0; y1=result;
r=dword(); if(!r) return 0; y2=result;
i_mod=x; i_sib=y1; m_dword=y2;
break;
case 8: r=op(); if(!r) return 0; x=result;
i_mod=x;
break;
default: return 0;
}
return 1;
}
int modrm2()
{
int r, b, x, y;
b=PeekOneByte();
switch(mod16Table[b])
{
case 1: r=op(); if(!r) return 0; x=result;
i_mod=x;
break;
case 2: r=op(); if(!r) return 0; x=result;
r=word(); if(!r) return 0; y=result;
i_mod=x; m_dword=y;
break;
case 3: r=op(); if(!r) return 0; x=result;
r=byte(); if(!r) return 0; y=result;
i_mod=x; m_byte=y;
break;
case 4: r=op(); if(!r) return 0; x=result;
r=word(); if(!r) return 0; y=result;
i_mod=x; m_dword=y;
break;
case 5: r=op(); if(!r) return 0; x=result;
i_mod=x;
break;
default: return 0;
}
return 1;
}
int sib()
{
return byte();
}
int labelstartposition()
{
int r;
r=dword(); if(!r) return 0;
m_dword=result;
label_start_pos=(DWORD)m_dword;
opclass=1;
if(nextMode>0)bodyprint0();
return 1;
}
int label1()
{
DWORD r, rr, s;
// I like to give this guy some more priority or power to overide some constraints
// namely It is worth try to find label blocks.... I guess
r=label_start_pos+4;s=r;
while (isLabelCheckable(r))
{
rr=(DWORD)getIntFile(r);
if (!isGoodAddress(rr)) return 1;
i_col=4;
pushTrace(305);
if (nextMode>0) EnterLabel(166, rr, r);
popTrace();
r+=4;
}
return 1;
}
int opext()
{
return modrm();
}
int opextg()
{
return opext();
}
//...................................................................
/* globals */
int fatalError = 0; // flow control
int errorcount = 0; // to use counting errors
int GotEof=0;
int yyfirsttime=1;
unsigned char c;
PBYTE yyfp, yypmax;
int ReadOneByte()
{
if (yyfirsttime)
{
yyfirsttime=0; GotEof=0;
yyfp = (PBYTE)((int)lpFile + vCodeOffset);
yypmax = (PBYTE)((int)lpFile + CodeOffset + CodeSize);
}
if (GotEof) return EOF;
c = *yyfp++;
if (yyfp >= yypmax ) {GotEof = 1;}
return (int)c;
}
int PeekOneByte()
{
if (yyfirsttime)
return (int) c = *(PBYTE)((int)lpFile + vCodeOffset);
if (GotEof) return EOF;
if (yyfp >= yypmax ) return EOF;
else return (int) c = *(yyfp);
}
int PeekSecondByte()
{
if (GotEof) return EOF;
if (yyfp+1 >= yypmax ) return EOF;
else return (int) c = *(yyfp+1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -