TempleOSCDV5.00.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:48:09 +02:00
1 parent 122df6338e
commit f6eacf7744
374 files changed
+11078 -11204

No files matched your search

+174 -166
View File
@@ -63,9 +63,9 @@ U0 DumpUAsmTables()
}
*/
CInst *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
CInst *InstEntryFind(U8 *rip,I64 opsize,I64 seg_size)
{//Binary Search
I64 i,j,n,m,k,a1,a2,o1,o2,oc_cnt;
I64 i,j,n,m,k,arg1,arg2,o1,o2,oc_cnt;
CInst *tmpins,**table;
i=0;
if (seg_size==64) {
@@ -82,13 +82,13 @@ CInst *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
m=0;
n=0;
while (TRUE) { //ief_compare_start
a1=tmpins->arg1;
a2=tmpins->arg2;
arg1=tmpins->arg1;
arg2=tmpins->arg2;
oc_cnt=tmpins->opcode_cnt;
if (tmpins->flags&IEF_STI_LIKE)
oc_cnt--;
if (n<oc_cnt) {
o1=ip[n];
o1=rip[n];
if (n==tmpins->opcode_cnt-1 && tmpins->flags & IEF_PLUS_OPCODE)
o1&=-8;
o2=tmpins->opcode[n++];
@@ -97,9 +97,10 @@ CInst *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
} else
switch [tmpins->uasm_slash_val] {
case 0...7:
if (!(m=ip[n]>>3&7-tmpins->slash_val)) {
if ((Bt(&uasm.mem_arg_mask,a1) || Bt(&uasm.mem_arg_mask,a2)) &&
ip[n]&0xC0==0xC0) {
if (!(m=rip[n]>>3&7-tmpins->slash_val)) {
if ((Bt(&uasm.mem_arg_mask,arg1) ||
Bt(&uasm.mem_arg_mask,arg2)) &&
rip[n]&0xC0==0xC0) {
m=1;
goto ief_compare_done;
}
@@ -114,25 +115,28 @@ CInst *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
goto ief_compare_done;
}
}
if (opsize==64||a1==ARGT_M64||a2==ARGT_M64) {
if (!Bt(&uasm.ins64_arg_mask,a1)&&
!Bt(&uasm.ins64_arg_mask,a2)&&!(tmpins->flags&IEF_48_REX))
if (opsize==64||arg1==ARGT_M64||arg2==ARGT_M64) {
if (!Bt(&uasm.ins64_arg_mask,arg1)&&
!Bt(&uasm.ins64_arg_mask,arg2)&&
!(tmpins->flags&IEF_48_REX))
m=1;
} else {
if (Bt(&uasm.ins64_arg_mask,a1)||Bt(&uasm.ins64_arg_mask,a2) ||
if (Bt(&uasm.ins64_arg_mask,arg1)||
Bt(&uasm.ins64_arg_mask,arg2) ||
tmpins->flags&IEF_48_REX)
m=-1;
}
} else if ((Bt(&uasm.mem_arg_mask,a1)||Bt(&uasm.mem_arg_mask,a2)) &&
ip[n]&0xC0==0xC0)
} else if ((Bt(&uasm.mem_arg_mask,arg1)||
Bt(&uasm.mem_arg_mask,arg2)) &&
rip[n]&0xC0==0xC0)
m=1;
goto ief_compare_done;
case SV_I_REG:
m=ip[n]>>3-tmpins->opcode[tmpins->opcode_cnt-1]>>3;
m=rip[n]>>3-tmpins->opcode[tmpins->opcode_cnt-1]>>3;
goto ief_compare_done;
case SV_STI_LIKE:
if (!(m=ip[n]>>3-tmpins->opcode[tmpins->opcode_cnt-1]>>3))
m=ip[n]-tmpins->opcode[tmpins->opcode_cnt-1];
if (!(m=rip[n]>>3-tmpins->opcode[tmpins->opcode_cnt-1]>>3))
m=rip[n]-tmpins->opcode[tmpins->opcode_cnt-1];
goto ief_compare_done;
case SV_R_REG:
case SV_NONE:
@@ -148,18 +152,21 @@ CInst *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
goto ief_compare_done;
}
}
if (opsize==64 || a1==ARGT_M64 || a2==ARGT_M64) {
if (!Bt(&uasm.ins64_arg_mask,a1) &&!Bt(&uasm.ins64_arg_mask,a2) &&
!(tmpins->flags&IEF_48_REX)&& !(a2==ARGT_NONE &&
(ARGT_UIMM8<=a1<=ARGT_UIMM64 || ARGT_IMM8<=a1<=ARGT_IMM64)))
if (opsize==64 || arg1==ARGT_M64 || arg2==ARGT_M64) {
if (!Bt(&uasm.ins64_arg_mask,arg1) &&
!Bt(&uasm.ins64_arg_mask,arg2) &&
!(tmpins->flags&IEF_48_REX)&& !(arg2==ARGT_NONE &&
(ARGT_UIMM8<=arg1<=ARGT_UIMM64 ||
ARGT_IMM8<=arg1<=ARGT_IMM64)))
m=1;
else if (tmpins->arg2==ARGT_IMM64 || tmpins->arg2==ARGT_UIMM64) {
if (a2!=ARGT_IMM64&&a2!=ARGT_UIMM64)
if (arg2!=ARGT_IMM64&&arg2!=ARGT_UIMM64)
m=1;
} else if (a2==ARGT_IMM64||a2==ARGT_UIMM64)
} else if (arg2==ARGT_IMM64||arg2==ARGT_UIMM64)
m=-1;
} else {
if (Bt(&uasm.ins64_arg_mask,a1) || Bt(&uasm.ins64_arg_mask,a2) ||
if (Bt(&uasm.ins64_arg_mask,arg1) ||
Bt(&uasm.ins64_arg_mask,arg2) ||
tmpins->flags&IEF_48_REX)
m=-1;
}
@@ -235,19 +242,20 @@ U0 UAsmHashLoad()
QSortI64(uasm.table_64 ,uasm.table_64_entries ,&InstEntriesCompare);
}
U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
U0 Ui(U8 *buf,U8 **_rip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
{//Unassembles one inst
I64 i,disp,imm,opsize,opadd,
a1,a2,reloced_a1,reloced_a2,
a1_size=0,a2_size=0,reloced_a1_size,reloced_a2_size,
arg1,arg2,reloced_arg1,reloced_arg2,
arg1_size=0,arg2_size=0,reloced_arg1_size,reloced_arg2_size,
ModrM=-1,SIB=-1,scale,r1,r2,
Mod=-1,RM1=-1,RM2=-1,REX=-1,REX_r=0,REX_x=0,REX_b=0;
Bool cont;
CInst *tmpins,*tmpins2;
CHashOpcode *tmpo;
U8 *ip=*_ip,*ptr,*reloced_a1_st,*reloced_a2_st,
U8 *rip=*_rip,*ptr,*reloced_arg1_st,*reloced_arg2_st,
*bin_data_area1,*bin_data_area2,
line1[512],line2[512],buf2[512],a1_st[512],a2_st[512],seg_overrides[32];
line1[512],line2[512],buf2[512],arg1_st[512],
arg2_st[512],seg_overrides[32];
if (_jmp_dst) *_jmp_dst=-1;
if (seg_size==16) {
@@ -260,28 +268,28 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
opsize=32;
opadd=64;
}
*a1_st=0;
*a2_st=0;
if (!IsRaw && PutSrcLink(ip,1,line1))
*arg1_st=0;
*arg2_st=0;
if (!IsRaw && PutSrcLink(rip,1,line1))
CatPrint(line1,"\n");
else
*line1=0;
StrPrint(line1+StrLen(line1),"%24tp ",ip);
StrPrint(line1+StrLen(line1),"%24tp ",rip);
bin_data_area1=line1+StrLen(line1);
for (i=0;i<6;i++)
CatPrint(line1,"%02X",ip[i]);
CatPrint(line1,"%02X",rip[i]);
CatPrint(line1," ");
StrPrint(line2,"%24tp ",ip+6);
StrPrint(line2,"%24tp ",rip+6);
bin_data_area2=line2+StrLen(line2);
for (i=6;i<12;i++)
CatPrint(line2,"%02X",ip[i]);
CatPrint(line2,"%02X",rip[i]);
*seg_overrides=0;
cont=TRUE;
while (TRUE) {
switch (*ip) {
switch (*rip) {
case 0x2E: if (StrLen(seg_overrides)<24)
CatPrint(seg_overrides,"CS:"); break;
case 0x36: if (StrLen(seg_overrides)<24)
@@ -308,7 +316,7 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
break;
case 0x40...0x4F:
if (seg_size==64) {
REX=*ip;
REX=*rip;
if (REX>=0x48)
opsize=64;
REX_b=Bt(&REX,0)<<3;
@@ -320,148 +328,148 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
cont=FALSE;
}
if (cont)
ip++;
rip++;
else
break;
}
tmpins=InstEntryFind(ip,opsize,seg_size);
tmpins=InstEntryFind(rip,opsize,seg_size);
if (opsize==32 && seg_size==64) {
tmpins2=InstEntryFind(ip,64,seg_size);
tmpins2=InstEntryFind(rip,64,seg_size);
if (tmpins2!=tmpins && tmpins2->flags&IEF_REX_ONLY_R8_R15 ||
tmpins2->flags&IEF_REX_XOR_LIKE&& ip[1]>>3&7==ip[1]&7)
tmpins2->flags&IEF_REX_XOR_LIKE&& rip[1]>>3&7==rip[1]&7)
tmpins=tmpins2;
}
ip+=tmpins->opcode_cnt;
rip+=tmpins->opcode_cnt;
tmpo=tmpins(U8 *)-tmpins->ins_entry_num*sizeof(CInst)
-offset(CHashOpcode.ins);
if (just_ins)
*line1=0;
CatPrint(line1,tmpo->str);
a1=tmpins->arg1;
a2=tmpins->arg2;
arg1=tmpins->arg1;
arg2=tmpins->arg2;
if (a1_size=tmpins->size1) {
if (Bt(&uasm.signed_arg_mask,a1))
CatPrint(a1_st,"I%d ",a1_size);
if (arg1_size=tmpins->size1) {
if (Bt(&uasm.signed_arg_mask,arg1))
CatPrint(arg1_st,"I%d ",arg1_size);
else
CatPrint(a1_st,"U%d ",a1_size);
CatPrint(arg1_st,"U%d ",arg1_size);
}
if (a2_size=tmpins->size2) {
if (Bt(&uasm.signed_arg_mask,a2))
CatPrint(a2_st,"I%d ",a2_size);
if (arg2_size=tmpins->size2) {
if (Bt(&uasm.signed_arg_mask,arg2))
CatPrint(arg2_st,"I%d ",arg2_size);
else
CatPrint(a2_st,"U%d ",a2_size);
CatPrint(arg2_st,"U%d ",arg2_size);
}
if (tmpins->flags & IEF_PLUS_OPCODE) {
ip--;
RM1=*ip++ - tmpins->opcode[tmpins->opcode_cnt-1]+REX_b;
rip--;
RM1=*rip++ - tmpins->opcode[tmpins->opcode_cnt-1]+REX_b;
ptr=NULL;
if (ARGT_R8<=a1<=ARGT_R64) {
if (a1_size==8) {
if (ARGT_R8<=arg1<=ARGT_R64) {
if (arg1_size==8) {
if (REX!=-1)
ptr="ST_U8_REX_REGS";
else
ptr="ST_U8_REGS";
} else if (a1_size==16)
} else if (arg1_size==16)
ptr="ST_U16_REGS";
else if (a1_size==32)
else if (arg1_size==32)
ptr="ST_U32_REGS";
else if (a1_size==64)
else if (arg1_size==64)
ptr="ST_U64_REGS";
if (ptr)
CatPrint(a1_st,"%Z",RM1,ptr);
CatPrint(arg1_st,"%Z",RM1,ptr);
} else {
if (a2_size==8) {
if (arg2_size==8) {
if (REX!=-1)
ptr="ST_U8_REX_REGS";
else
ptr="ST_U8_REGS";
} else if (a2_size==16)
} else if (arg2_size==16)
ptr="ST_U16_REGS";
else if (a2_size==32)
else if (arg2_size==32)
ptr="ST_U32_REGS";
else if (a2_size==64)
else if (arg2_size==64)
ptr="ST_U64_REGS";
if (ptr)
CatPrint(a2_st,"%Z",RM1,ptr);
CatPrint(arg2_st,"%Z",RM1,ptr);
}
}
if (ARGT_RM8<=a1<=ARGT_RM64 || ARGT_M8<=a1<=ARGT_M64 ||
ARGT_RM8<=a2<=ARGT_RM64 || ARGT_M8<=a2<=ARGT_M64) {
if (ARGT_RM8<=a2<=ARGT_RM64 || ARGT_M8<=a2<=ARGT_M64) {
reloced_a1=a2;
reloced_a2=a1;
reloced_a1_size=a2_size;
reloced_a2_size=a1_size;
reloced_a1_st=a2_st;
reloced_a2_st=a1_st;
if (ARGT_RM8<=arg1<=ARGT_RM64 || ARGT_M8<=arg1<=ARGT_M64 ||
ARGT_RM8<=arg2<=ARGT_RM64 || ARGT_M8<=arg2<=ARGT_M64) {
if (ARGT_RM8<=arg2<=ARGT_RM64 || ARGT_M8<=arg2<=ARGT_M64) {
reloced_arg1=arg2;
reloced_arg2=arg1;
reloced_arg1_size=arg2_size;
reloced_arg2_size=arg1_size;
reloced_arg1_st=arg2_st;
reloced_arg2_st=arg1_st;
} else {
reloced_a1=a1;
reloced_a2=a2;
reloced_a1_size=a1_size;
reloced_a2_size=a2_size;
reloced_a1_st=a1_st;
reloced_a2_st=a2_st;
reloced_arg1=arg1;
reloced_arg2=arg2;
reloced_arg1_size=arg1_size;
reloced_arg2_size=arg2_size;
reloced_arg1_st=arg1_st;
reloced_arg2_st=arg2_st;
}
CatPrint(reloced_a1_st,seg_overrides);
ModrM=*ip++;
CatPrint(reloced_arg1_st,seg_overrides);
ModrM=*rip++;
Mod=ModrM>>6 & 3;
RM1=ModrM & 7+REX_b;
RM2=ModrM>>3 & 7+REX_r;
if (Mod<3 && RM1&7==4)
SIB=*ip++;
SIB=*rip++;
if (Mod==1) {
disp=*ip(U8 *)++;
CatPrint(reloced_a1_st,"%02X",disp);
disp=*rip(U8 *)++;
CatPrint(reloced_arg1_st,"%02X",disp);
} else if (Mod==2) {
disp=*ip(U32 *)++;
CatPrint(reloced_a1_st,"%08X",disp);
disp=*rip(U32 *)++;
CatPrint(reloced_arg1_st,"%08X",disp);
}
if (tmpins->slash_val<8)
RM2=-1;
else {
ptr=NULL;
if (reloced_a2==ARGT_SREG) {
if (reloced_arg2==ARGT_SREG) {
if (RM2<=5)
ptr="ST_SEG_REGS";
} else if (!(ARGT_IMM8<=reloced_a2<=ARGT_IMM64) &&
!(ARGT_UIMM8<=reloced_a2<=ARGT_UIMM64)) {
if (reloced_a2_size==8) {
} else if (!(ARGT_IMM8<=reloced_arg2<=ARGT_IMM64) &&
!(ARGT_UIMM8<=reloced_arg2<=ARGT_UIMM64)) {
if (reloced_arg2_size==8) {
if (REX!=-1)
ptr="ST_U8_REX_REGS";
else
ptr="ST_U8_REGS";
} else if (reloced_a2_size==16)
} else if (reloced_arg2_size==16)
ptr="ST_U16_REGS";
else if (reloced_a2_size==32)
else if (reloced_arg2_size==32)
ptr="ST_U32_REGS";
else if (reloced_a2_size==64)
else if (reloced_arg2_size==64)
ptr="ST_U64_REGS";
}
if (ptr)
CatPrint(reloced_a2_st,"%Z",RM2,ptr);
CatPrint(reloced_arg2_st,"%Z",RM2,ptr);
}
if (RM1&7==5 && !Mod) {
disp=*ip(I32 *)++;
disp=*rip(I32 *)++;
if (seg_size==64) {
disp+=ip;
if (reloced_a2==ARGT_IMM8 || reloced_a2==ARGT_UIMM8)
disp+=rip;
if (reloced_arg2==ARGT_IMM8 || reloced_arg2==ARGT_UIMM8)
disp++;
else if (reloced_a2==ARGT_IMM16 || reloced_a2==ARGT_UIMM16)
else if (reloced_arg2==ARGT_IMM16 || reloced_arg2==ARGT_UIMM16)
disp+=2;
else if (reloced_a2==ARGT_IMM32 || reloced_a2==ARGT_UIMM32)
else if (reloced_arg2==ARGT_IMM32 || reloced_arg2==ARGT_UIMM32)
disp+=4;
else if (reloced_a2==ARGT_IMM64 || reloced_a2==ARGT_UIMM64)
else if (reloced_arg2==ARGT_IMM64 || reloced_arg2==ARGT_UIMM64)
disp+=8;
}
CatPrint(reloced_a1_st,"[%X]",disp);
CatPrint(reloced_arg1_st,"[%X]",disp);
RM1=-1;
} else {
if (Mod<3) {
@@ -483,12 +491,12 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
else
ptr="ST_U32_REGS";
if (r1==REG_RBP && !Mod) {
disp=*ip(U32 *)++;
CatPrint(reloced_a1_st,"%08X[%Z*%d]",disp,r2,ptr,scale);
disp=*rip(U32 *)++;
CatPrint(reloced_arg1_st,"%08X[%Z*%d]",disp,r2,ptr,scale);
} else if (r2==4)
CatPrint(reloced_a1_st,"[%Z]",r1,ptr);
CatPrint(reloced_arg1_st,"[%Z]",r1,ptr);
else
CatPrint(reloced_a1_st,"[%Z+%Z*%d]",r1,ptr,r2,ptr,scale);
CatPrint(reloced_arg1_st,"[%Z+%Z*%d]",r1,ptr,r2,ptr,scale);
} else {
if (opadd==16)
ptr="ST_U16_REGS";
@@ -496,153 +504,153 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
ptr="ST_U32_REGS";
else
ptr="ST_U64_REGS";
CatPrint(reloced_a1_st,"[%Z]",RM1,ptr);
CatPrint(reloced_arg1_st,"[%Z]",RM1,ptr);
}
} else {
ptr=NULL;
if (reloced_a1_size==8) {
if (reloced_arg1_size==8) {
if (REX!=-1)
ptr="ST_U8_REX_REGS";
else
ptr="ST_U8_REGS";
} else if (reloced_a1_size==16)
} else if (reloced_arg1_size==16)
ptr="ST_U16_REGS";
else if (reloced_a1_size==32)
else if (reloced_arg1_size==32)
ptr="ST_U32_REGS";
else if (reloced_a1_size==64)
else if (reloced_arg1_size==64)
ptr="ST_U64_REGS";
if (ptr)
CatPrint(reloced_a1_st,DefineSub(RM1,ptr));
CatPrint(reloced_arg1_st,DefineSub(RM1,ptr));
}
}
}
switch (a1) {
switch (arg1) {
case ARGT_IMM8:
case ARGT_UIMM8:
imm=*ip(U8 *)++;
CatPrint(a1_st,"%02X",imm);
imm=*rip(U8 *)++;
CatPrint(arg1_st,"%02X",imm);
if (tmpins->opcode[0]==0xCD && (ptr=DefineSub(imm,"ST_INT_NAMES")))
CatPrint(a1_st," %s",ptr);
CatPrint(arg1_st," %s",ptr);
break;
case ARGT_IMM16:
case ARGT_UIMM16:
CatPrint(a1_st,"%04X",*ip(U16 *)++);
CatPrint(arg1_st,"%04X",*rip(U16 *)++);
break;
case ARGT_IMM32:
case ARGT_UIMM32:
CatPrint(a1_st,"%08X",*ip(U32 *)++);
CatPrint(arg1_st,"%08X",*rip(U32 *)++);
break;
case ARGT_IMM64:
case ARGT_UIMM64:
CatPrint(a1_st,"%016X",*ip(I64 *)++);
CatPrint(arg1_st,"%016X",*rip(I64 *)++);
break;
start:
case ARGT_REL8:
disp=*ip(I8 *)++;
disp=*rip(I8 *)++;
break;
case ARGT_REL16:
disp=*ip(I16 *)++;
disp=*rip(I16 *)++;
break;
case ARGT_REL32:
disp=*ip(I32 *)++;
disp=*rip(I32 *)++;
break;
end:
disp+=ip;
disp+=rip;
if (IsDbgMode)
CatPrint(a1_st,"%p ",disp);
CatPrint(arg1_st,"%p ",disp);
else if (PutSrcLink(disp,512,buf2))
CatPrint(a1_st,"%s ",buf2);
CatPrint(arg1_st,"%s ",buf2);
else
CatPrint(a1_st,"%P ",disp);
CatPrint(arg1_st,"%P ",disp);
if (_jmp_dst) *_jmp_dst=disp;
break;
case ARGT_MOFFS8...ARGT_MOFFS64:
CatPrint(a1_st,seg_overrides);
if (a1_size==8)
disp=*ip(U8 *)++;
CatPrint(arg1_st,seg_overrides);
if (arg1_size==8)
disp=*rip(U8 *)++;
else if (opadd==16)
disp=*ip(U16 *)++;
disp=*rip(U16 *)++;
else
disp=*ip(U32 *)++;
CatPrint(a1_st,"[%X]",disp);
disp=*rip(U32 *)++;
CatPrint(arg1_st,"[%X]",disp);
break;
case ARGT_AL ... ARGT_DX:
case ARGT_SS ... ARGT_ST0:
CatPrint(a1_st,"%z",a1-ARGT_AL,
CatPrint(arg1_st,"%z",arg1-ARGT_AL,
"AL\0AX\0EAX\0RAX\0CL\0DX\0 \0 \0SS\0DS\0ES\0FS\0GS\0CS\0ST0\0");
break;
case ARGT_STI:
ip--;
CatPrint(a1_st,"%Z",*ip++ - tmpins->opcode[tmpins->opcode_cnt-1],
rip--;
CatPrint(arg1_st,"%Z",*rip++ - tmpins->opcode[tmpins->opcode_cnt-1],
"ST_FSTK_REGS");
break;
}
switch (a2) {
switch (arg2) {
case ARGT_IMM8:
case ARGT_UIMM8:
CatPrint(a2_st,"%02X",*ip(U8 *)++);
CatPrint(arg2_st,"%02X",*rip(U8 *)++);
break;
case ARGT_IMM16:
case ARGT_UIMM16:
CatPrint(a2_st,"%04X",*ip(U16 *)++);
CatPrint(arg2_st,"%04X",*rip(U16 *)++);
break;
case ARGT_IMM32:
case ARGT_UIMM32:
CatPrint(a2_st,"%08X",*ip(U32 *)++);
CatPrint(arg2_st,"%08X",*rip(U32 *)++);
break;
case ARGT_IMM64:
case ARGT_UIMM64:
CatPrint(a2_st,"%016X",*ip(I64 *)++);
CatPrint(arg2_st,"%016X",*rip(I64 *)++);
break;
case ARGT_MOFFS8...ARGT_MOFFS64:
CatPrint(a2_st,seg_overrides);
if (a2_size==8)
disp=*ip(U8 *)++;
CatPrint(arg2_st,seg_overrides);
if (arg2_size==8)
disp=*rip(U8 *)++;
else if (opadd==16)
disp=*ip(U16 *)++;
disp=*rip(U16 *)++;
else
disp=*ip(U32 *)++;
CatPrint(a2_st,"[%X]",disp);
disp=*rip(U32 *)++;
CatPrint(arg2_st,"[%X]",disp);
break;
case ARGT_AL ... ARGT_DX:
case ARGT_SS ... ARGT_ST0:
CatPrint(a2_st,"%z",a2-ARGT_AL,
CatPrint(arg2_st,"%z",arg2-ARGT_AL,
"AL\0AX\0EAX\0RAX\0CL\0DX\0 \0 \0SS\0DS\0ES\0FS\0GS\0CS\0ST0\0");
break;
case ARGT_STI:
ip--;
CatPrint(a2_st,"%Z",*ip++ -tmpins->opcode[tmpins->opcode_cnt-1],
rip--;
CatPrint(arg2_st,"%Z",*rip++ -tmpins->opcode[tmpins->opcode_cnt-1],
"ST_FSTK_REGS");
break;
}
if (tmpins->flags&IEF_ENDING_ZERO)
ip++;
rip++;
if (*a1_st)
CatPrint(line1,"\t%s",a1_st);
if (*a2_st)
CatPrint(line1,",%s",a2_st);
if (*arg1_st)
CatPrint(line1,"\t%s",arg1_st);
if (*arg2_st)
CatPrint(line1,",%s",arg2_st);
CatPrint(line1,"\n");
CatPrint(line2,"\n");
if (!just_ins) {
for (i=ip-(*_ip)(I64);i<6;i++) {
for (i=rip-(*_rip)(I64);i<6;i++) {
bin_data_area1[i<<1]=CH_SPACE;
bin_data_area1[i<<1+1]=CH_SPACE;
}
for (i=ip-(*_ip)(I64);i<12;i++) {
for (i=rip-(*_rip)(I64);i<12;i++) {
bin_data_area2[(i-6)<<1]=CH_SPACE;
bin_data_area2[(i-6)<<1+1]=CH_SPACE;
}
}
StrCpy(buf,line1);
if (!just_ins && ip-(*_ip)(I64)>6)
if (!just_ins && rip-(*_rip)(I64)>6)
CatPrint(buf,line2);
*_ip=ip;
*_rip=rip;
}
U8 *U(U8 *ip,I64 cnt=20,I64 seg_size=64)
U8 *U(U8 *rip,I64 cnt=20,I64 seg_size=64)
{//Unassembles a num of insts.
I64 i;
U8 buf[1024];
@@ -650,22 +658,22 @@ U8 *U(U8 *ip,I64 cnt=20,I64 seg_size=64)
PrintWarn("16-bit unassembly is not well supported.\n");
"$$HL,1$$";
for (i=0;i<cnt;i++) {
Ui(buf,&ip,seg_size);
Ui(buf,&rip,seg_size);
"%s",buf;
}
"$$HL,0$$";
return ip;
return rip;
}
I64 Un(U8 *ip,I64 cnt=0x80,I64 seg_size=64)
I64 Un(U8 *rip,I64 cnt=0x80,I64 seg_size=64)
{//Unassembles a num of bytes
I64 i=0;
U8 buf[1024],*end_ip=ip(I64)+cnt;
U8 buf[1024],*end_rip=rip(I64)+cnt;
if (seg_size==16)
PrintWarn("16-bit unassembly is not well supported.\n");
"$$HL,1$$";
while (ip<end_ip) {
Ui(buf,&ip,seg_size);
while (rip<end_rip) {
Ui(buf,&rip,seg_size);
"%s",buf;
i++;
}