From 109738dca3aac8f13a426bfc012c2209e9dfe164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Tue, 9 Oct 2018 18:13:04 +0200 Subject: [PATCH] fix: ajout de fonction de debogueuage et exception 1 --- include/debug.h | 15 + include/shell.h | 3 + lib/cpu.c | 69 +++- lib/debug.c | 806 +++++++++++++++++++++++++++++++++++++++-------- lib/interrupts.c | 9 +- lib/shell.c | 86 ++++- lib/video.c | 2 +- 7 files changed, 837 insertions(+), 153 deletions(-) diff --git a/include/debug.h b/include/debug.h index a9a1967..c68a15c 100644 --- a/include/debug.h +++ b/include/debug.h @@ -35,3 +35,18 @@ return; \ } + +#define DBG_EXEC 0b00 +#define DBG_WRITE 0b01 +#define DBG_CLEAR 0b10 +#define DBG_READWRITE 0b11 + +#define DBG_ONEBYTE 0b00 +#define DBG_TWOBYTE 0b01 +#define DBG_FOURBYTE 0b11 + + +void setdebugreg(u8 number,u8 *address, u8 type); +u8* getdebugreg(u8 number); +u32 disas(u8 *a); +u32 decode(bool at, u8 *a, bool show); diff --git a/include/shell.h b/include/shell.h index 441a1c9..c043b1b 100644 --- a/include/shell.h +++ b/include/shell.h @@ -21,3 +21,6 @@ int err(); int view(); int test(void); int disasm(u8* commandline); +int bpset(u8* commandline); +int bpclr(u8* commandline); +int help(); diff --git a/lib/cpu.c b/lib/cpu.c index 7311f94..56e105b 100755 --- a/lib/cpu.c +++ b/lib/cpu.c @@ -206,6 +206,71 @@ asm(" addl %[size],%%esp \n \ /******************************************************************************/ /* Affiche les registres CPU */ +void show_lightcpu(save_stack *stack) +{ + u32 i; + printf("\33[0mEAX=%Y EBX=%Y ECX=%Y EDX=%Y\r\n", stack->eax, stack->ebx, stack->ecx, stack->edx); + printf("ESI=%Y EDI=%Y ESP=%Y EBP=%Y\r\n", stack->esi, stack->edi, stack->esp, stack->ebp); + printf("EIP=%Y EFL=%Y [%c%c%c%c%c%c%c%c%c]\r\n", stack->eip, stack->eflags, + (stack->eflags & (1 <<11)) ? 'O':'-', + (stack->eflags & (1 <<10)) ? 'D':'-', + (stack->eflags & (1 << 9)) ? 'I':'-', + (stack->eflags & (1 << 8)) ? 'T':'-', + (stack->eflags & (1 << 7)) ? 'S':'-', + (stack->eflags & (1 << 6)) ? 'Z':'-', + (stack->eflags & (1 << 4)) ? 'A':'-', + (stack->eflags & (1 << 2)) ? 'P':'-', + (stack->eflags & (1 << 0)) ? 'C':'-'); + printf("CS =%hY DS =%hY SS =%hY ES =%hY FS =%hY GS =%hY\r\n",stack->cs,stack->ds,stack->ss,stack->es,stack->fs,stack->gs); + printf("CR0=%Y CR2=%Y CR3=%Y CR4=%Y\r\n\r\n\r\n",stack->cr0,stack->cr2,stack->cr3,stack->cr4); + + u8* size; + u8* pointer; + for(i=20;i<50;i++) { + pointer=stack->eip-i; + size=pointer; + size+=50; + while(pointereip) break; + } + if (pointer==stack->eip) break; + } + if (pointer==stack->eip) + pointer=stack->eip-i; + else + pointer=stack->eip; + size=pointer; + size+=50; + while(pointereip) + print("\33[41m\33[1m"); + else + print("\33[40m\33[0m"); + pointer+=disas(pointer); + } + + printf("\33[0m\r\n\r\n\r\nSTACK\r\n"); + if (abs(KERNEL_STACK_ADDR-stack->esp)>0x10000) + printf("Pile invalide !"); + else + { + i=0; + for (u32 *pointer = stack->esp; pointer < KERNEL_STACK_ADDR; pointer ++) { + if (i>0 && i % 10 == 0) print("\033[10A"); + if (i>=10) + print("\033[25C"); + printf("+%d:%Y - %Y\r\n", i++, pointer, (u32)(*pointer)); + } + for(u32 j=0;j<10-(i % 10);j++) + print("\033[01B"); + } +} + +/******************************************************************************/ +/* Affiche les registres CPU */ + void show_cpu(save_stack *stack) { printf("EAX=%Y EBX=%Y ECX=%Y EDX=%Y\r\n", stack->eax, stack->ebx, stack->ecx, stack->edx); @@ -250,10 +315,6 @@ void show_cpu(save_stack *stack) if (i>=10) print("\033[25C"); printf("+%d:%Y - %Y\r\n", i++, pointer, (u32)(*pointer)); - if (i > 20) { - print("...\r\n"); - break; - } } for(u32 j=0;j<10-(i % 10);j++) print("\033[01B"); diff --git a/lib/debug.c b/lib/debug.c index 9aab7df..9c7159a 100644 --- a/lib/debug.c +++ b/lib/debug.c @@ -5,20 +5,68 @@ #include "video.h" #include "debug.h" -u8 *f_entry; -u16 entry; u8 *r8[] = {"al","cl","dl","bl","ah","ch","dh","bh"}; u8 *r16[] = {"ax","cx","dx","bx","sp","bp","si","di"}; u8 *r32[] = {"eax","ecx","edx","ebx","esp","ebp","esi","edi"}; u8 *rseg[] = {"ds","es","fs","gs","ss","cs","ip"}; +/*******************************************************************************/ +/* Efface un breakpoint sur une adresse */ +void cleardebugreg(u8* address) +{ + for(u8 i=0;i<4;i++) + if (getdebugreg(i)==address) + setdebugreg(i,0x0, DBG_CLEAR); +} -u16 decodeModSM(u8 *a, u8 *op, u16 order, u32 Gsz, u32 Esz){ +/*******************************************************************************/ +/* Permet de manipuler dr0-dr7 pour mettre en place des breakpoints */ + +u8* getdebugreg(u8 number) +{ + u8* address; + if (number==0) asm("mov %%eax,%%dr0; movl %%eax,%[address]":[address] "=m" (address)::); + else if (number==1) asm("mov %%eax,%%dr1; movl %%eax,%[address]":[address] "=m" (address)::); + else if (number==2) asm("mov %%eax,%%dr2; movl %%eax,%[address]":[address] "=m" (address)::); + else if (number==3) asm("mov %%eax,%%dr3; movl %%eax,%[address]":[address] "=m" (address)::); + return address; +} + +/*******************************************************************************/ +/* Permet de manipuler dr0-dr7 pour mettre en place des breakpoints */ + +void setdebugreg(u8 number,u8 *address, u8 type) +{ + u32 dr7=0; + asm("movl %%dr7,%%eax; mov %%eax,%[dr7]":[dr7] "=m" (dr7)::); + if (type==DBG_WRITE || type==DBG_READWRITE) + dr7|=0b11<<8; + if (type!=DBG_CLEAR) + dr7|=0b11<<(number<<1); + else + dr7&=~(0b11<<(number<<1)); + dr7&=~(0b11<<(16+(number<<2))); + dr7|=type<<(16+(number<<2)); + dr7&=~(0b11<<(16+((number<<2)+2))); + asm("movl %[dr7],%%eax; mov %%eax,%%dr7"::[dr7] "m" (dr7):); + if (number==0) asm("movl %[address],%%eax; mov %%eax,%%dr0"::[address] "m" (address):); + else if (number==1) asm("movl %[address],%%eax; mov %%eax,%%dr1"::[address] "m" (address):); + else if (number==2) asm("movl %[address],%%eax; mov %%eax,%%dr2"::[address] "m" (address):); + else if (number==3) asm("movl %[address],%%eax; mov %%eax,%%dr3"::[address] "m" (address):); + else + return; +} + +/*******************************************************************************/ +/* Fonctions de décodage associées à la fonction decode */ + +u16 decodeModSM(bool at,u8 *a, u8 *op, u16 order, u32 Gsz, u32 Esz){ u32 len = 0; u32 reg = 0; u32 scale = 0; u8 *b = a; u8 *E, *G, *indx, *base, *disp = "\0"; + u8 *F; u8 ebuf[32] = {0}; setG(); @@ -27,142 +75,195 @@ u16 decodeModSM(u8 *a, u8 *op, u16 order, u32 Gsz, u32 Esz){ switch(*b&0xc7){ case 0x00: E = "[bx+si]"; + F = "(%%bx,%%si)"; break; case 0x01: E = "[bx+di]"; + F = "(%%bx,%%di)"; break; case 0x02: E = "[bp+si]"; + F = "(%%bx,%%si)"; break; case 0x03: E = "[bp+di]"; + F = "(%%bp,%%di)"; break; case 0x04: E = "[si]"; + F = "(%%si)"; break; case 0x05: E = "[di]"; + F = "(%%di)"; break; case 0x06: snprintf(ebuf, sizeof(ebuf), "ds:%x", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%%ds:$%x", *(u16 *)b); + F = ebuf; ++b; break; case 0x07: E = "[bx]"; + F = "(bx)"; break; case 0x40: snprintf(ebuf, sizeof(ebuf), "[bx+si+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx,%%si)", *(s8 *)b); + F = ebuf; break; case 0x41: snprintf(ebuf, sizeof(ebuf), "[bx+di+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx,%%di)", *(s8 *)b); + F = ebuf; break; case 0x42: snprintf(ebuf, sizeof(ebuf), "[bp+si+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp,%%si)", *(s8 *)b); + F = ebuf; break; case 0x43: snprintf(ebuf, sizeof(ebuf), "[bp+di+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp,%%di)", *(s8 *)b); + F = ebuf; break; case 0x44: snprintf(ebuf, sizeof(ebuf), "[si+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%si)", *(s8 *)b); + F = ebuf; break; case 0x45: snprintf(ebuf, sizeof(ebuf), "[di+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%di)", *(s8 *)b); + F = ebuf; break; case 0x46: snprintf(ebuf, sizeof(ebuf), "[bp+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp)", *(s8 *)b); + F = ebuf; break; case 0x47: snprintf(ebuf, sizeof(ebuf), "[bx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx)", *(s8 *)b); + F = ebuf; case 0x80: snprintf(ebuf, sizeof(ebuf), "[bx+si+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx,%%si)", *(s8 *)b); + F = ebuf; ++b; break; case 0x81: snprintf(ebuf, sizeof(ebuf), "[bx+di+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx,%%di)", *(s8 *)b); + F = ebuf; ++b; break; case 0x82: snprintf(ebuf, sizeof(ebuf), "[bp+si+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp,%%si)", *(s8 *)b); + F = ebuf; ++b; break; case 0x83: snprintf(ebuf, sizeof(ebuf), "[bp+di+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp,%%di)", *(s8 *)b); + F = ebuf; ++b; break; case 0x84: snprintf(ebuf, sizeof(ebuf), "[si+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%si)", *(s8 *)b); + F = ebuf; ++b; break; case 0x85: snprintf(ebuf, sizeof(ebuf), "[di+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%di)", *(s8 *)b); + F = ebuf; ++b; break; case 0x86: snprintf(ebuf, sizeof(ebuf), "[bp+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp)", *(s8 *)b); + F = ebuf; ++b; break; case 0x87: snprintf(ebuf, sizeof(ebuf), "[bx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx)", *(s8 *)b); + F = ebuf; ++b; break; case 0xc0: E = "al"; + F = "%%al"; break; case 0xc1: E = "cl"; + F = "%%cl"; break; case 0xc2: E = "dl"; + F = "%%dl"; break; case 0xc3: E = "bl"; + F = "%%bl"; break; case 0xc4: E = "ah"; + F = "%%ah"; break; case 0xc5: E = "ch"; + F = "%%cl"; break; case 0xc6: E = "dh"; + F = "%%dh"; break; case 0xc7: E = "bh"; + F = "%%bh"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } } else{ switch(*b & 0xc7){ case 0x00: E = "[eax]"; + F = "(%%eax)"; break; case 0x01: E = "[ecx]"; + F = "(%%ecx)"; break; case 0x02: E = "[edx]"; + F = "(%%edx)"; break; case 0x03: E = "[ebx]"; + F = "(%%ebx)"; break; case 0x04: ++b; @@ -181,33 +282,59 @@ u16 decodeModSM(u8 *a, u8 *op, u16 order, u32 Gsz, u32 Esz){ snprintf(ebuf, sizeof(ebuf), "[%s+%s*%i]", base, indx, scale); } E = ebuf; + if(!indx){ + snprintf(ebuf, sizeof(ebuf), "(%s)", base); + } else if(!base){ + if(!scale){ + snprintf(ebuf, sizeof(ebuf), "(%s)", indx); + } else{ + snprintf(ebuf, sizeof(ebuf), "(,%s,%i)", indx, scale); + } + } else if(!scale){ + snprintf(ebuf, sizeof(ebuf), "(%s,%s)", base, indx); + } else{ + snprintf(ebuf, sizeof(ebuf), "(%s,%s,%i)", base, indx, scale); + } + F = ebuf; break; case 0x05: snprintf(ebuf, sizeof(ebuf), "ds:%x", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%%ds:$%x", *(u32 *)b); + F = ebuf; b += 3; break; case 0x06: E = "[esi]"; + F = "(%esi)"; break; case 0x07: E = "[edi]"; + F = "(%edi)"; break; case 0x40: snprintf(ebuf, sizeof(ebuf), "[eax+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%eax)", *(u8 *)b); + F = ebuf; break; case 0x41: snprintf(ebuf, sizeof(ebuf), "[ecx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ecx)", *(u8 *)b); + F = ebuf; break; case 0x42: snprintf(ebuf, sizeof(ebuf), "[edx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%edx)", *(u8 *)b); + F = ebuf; break; case 0x43: snprintf(ebuf, sizeof(ebuf), "[ebx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ebx)", *(u8 *)b); + F = ebuf; case 0x44: ++b; decodeSIB(); @@ -227,36 +354,67 @@ u16 decodeModSM(u8 *a, u8 *op, u16 order, u32 Gsz, u32 Esz){ len = strlen(ebuf); snprintf(ebuf+len, sizeof(ebuf)-len, "+%x]", *(u8 *)++b); E = ebuf; + + snprintf(ebuf, sizeof(ebuf), "%i", *(s8 *)b); + len = strlen(ebuf); + if(!indx){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s)", base); + } else if(!base){ + if(!scale){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s)", indx); + } else{ + snprintf(ebuf+len, sizeof(ebuf)-len, "(,%s,%i)", indx, scale); + } + } else if(!scale){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s,%s)", base, indx); + } else{ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s,%s,%i)", base, indx, scale); + } + F = ebuf; break; case 0x45: snprintf(ebuf, sizeof(ebuf), "[ebp+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ebp)", *(u8 *)b); + F = ebuf; break; case 0x46: snprintf(ebuf, sizeof(ebuf), "[esi+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%esi)", *(u8 *)b); + F = ebuf; break; case 0x47: snprintf(ebuf, sizeof(ebuf), "[edi+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%edi)", *(u8 *)b); + F = ebuf; break; case 0x80: snprintf(ebuf, sizeof(ebuf), "[eax+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%eax)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x81: snprintf(ebuf, sizeof(ebuf), "[ecx+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ecx)", *(s32 *)b); + F = ebuf; break; case 0x82: snprintf(ebuf, sizeof(ebuf), "[edx+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%edx)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x83: snprintf(ebuf, sizeof(ebuf), "[ebx+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ebx)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x84: @@ -277,74 +435,124 @@ u16 decodeModSM(u8 *a, u8 *op, u16 order, u32 Gsz, u32 Esz){ } len = strlen(ebuf); snprintf(ebuf+len, sizeof(ebuf)-len, "+%x]", *(u32 *)++b); - b += 3; E = ebuf; + + snprintf(ebuf, sizeof(ebuf), "%i", *(s8 *)b); + len = strlen(ebuf); + if(!indx){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s)", base); + } else if(!base){ + if(!scale){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s)", indx); + } else{ + snprintf(ebuf+len, sizeof(ebuf)-len, "(,%s,%i)", indx, scale); + } + } else if(!scale){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s,%s)", base, indx); + } else{ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s,%s,%i)", base, indx, scale); + } + F = ebuf; + + b += 3; break; case 0x85: snprintf(ebuf, sizeof(ebuf), "[ebp+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ebp)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x86: snprintf(ebuf, sizeof(ebuf), "[esi+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%esi)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x87: snprintf(ebuf, sizeof(ebuf), "[edi+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%edi)", *(s32 *)b); + F = ebuf; b += 3; break; case 0xc0: E = Esz == 1 ? "ax": "eax"; + F = Esz == 1 ? "%%ax": "%%eax"; break; case 0xc1: E = Esz == 1 ? "cx": "ecx"; + F = Esz == 1 ? "%%cx": "%%ecx"; break; case 0xc2: E = Esz == 1 ? "dx": "edx"; + F = Esz == 1 ? "%%dx": "%%edx"; break; case 0xc3: E = Esz == 1 ? "bx": "ebx"; + F = Esz == 1 ? "%%bx": "%%ebx"; break; case 0xc4: E = Esz == 1 ? "sp": "esp"; + F = Esz == 1 ? "%%sp": "%%esp"; break; case 0xc5: E = Esz == 1 ? "bp": "ebp"; + F = Esz == 1 ? "%%bp": "%%ebp"; break; case 0xc6: E = Esz == 1 ? "si": "esi"; + F = Esz == 1 ? "%%si": "%%esi"; break; case 0xc7: E = Esz == 1 ? "di": "edi"; + F = Esz == 1 ? "%%di": "%%edi"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } } - if(order){ - snprintf(op, opBufSz, "%s", E); - len = strlen(op); - if(Gsz){ - snprintf(op+len, opBufSz-len, ", %s", G); + if (at) + { + if(order){ + snprintf(op, opBufSz, "%s", F); + len = strlen(op); + if(Gsz) snprintf(op+len, opBufSz-len, ", %s%%", G); + } + else + { + snprintf(op, opBufSz, "%s%%, ", G); + len = strlen(op); + snprintf(op+len, opBufSz-len, "%s", F); + } + } + else + { + if(order){ + snprintf(op, opBufSz, "%s", E); + len = strlen(op); + if(Gsz) snprintf(op+len, opBufSz-len, ", %s", G); + } + else + { + snprintf(op, opBufSz, "%s, ", G); + len = strlen(op); + snprintf(op+len, opBufSz-len, "%s", E); } - } else{ - snprintf(op, opBufSz, "%s, ", G); - len = strlen(op); - snprintf(op+len, opBufSz-len, "%s", E); } return b-a; } -u32 decodeModSM_float(u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ +u32 decodeModSM_float(bool at,u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ u32 len = 0; u32 reg = 0; u32 scale = 0; u8 *b = a; u8 *E, *G, *indx, *base, *disp = "\0"; + u8 *F; u8 ebuf[32] = {0}; setG(); @@ -353,25 +561,33 @@ u32 decodeModSM_float(u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ switch(*b&0xc7){ case 0x00: E = "[bx+si]"; + F = "(%%bx,%%si)"; break; case 0x01: E = "[bx+di]"; + F = "(%%bx,%%di)"; break; case 0x02: E = "[bp+si]"; + F = "(%%bp,%%si)"; break; case 0x03: E = "[bp+di]"; + F = "(%%bp,%%di)"; break; case 0x04: E = "[si]"; + F = "(%%si)"; break; case 0x05: E = "[di]"; + F = "(%%di)"; break; case 0x06: snprintf(ebuf, sizeof(ebuf), "ds:%x", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%%ds:$%x", *(u16 *)b); + F = ebuf; ++b; break; case 0x07: @@ -380,115 +596,159 @@ u32 decodeModSM_float(u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ case 0x40: snprintf(ebuf, sizeof(ebuf), "[bx+si+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx,%%si)", *(s8 *)b); + F = ebuf; break; case 0x41: snprintf(ebuf, sizeof(ebuf), "[bx+di+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx,%%di)", *(s8 *)b); + F = ebuf; break; case 0x42: snprintf(ebuf, sizeof(ebuf), "[bp+si+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp,%%si)", *(s8 *)b); + F = ebuf; break; case 0x43: snprintf(ebuf, sizeof(ebuf), "[bp+di+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp,%%di)", *(s8 *)b); + F = ebuf; break; case 0x44: snprintf(ebuf, sizeof(ebuf), "[si+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%si)", *(s8 *)b); + F = ebuf; break; case 0x45: snprintf(ebuf, sizeof(ebuf), "[di+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%di)", *(s8 *)b); + F = ebuf; break; case 0x46: snprintf(ebuf, sizeof(ebuf), "[bp+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp)", *(s8 *)b); + F = ebuf; break; case 0x47: snprintf(ebuf, sizeof(ebuf), "[bx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx)", *(s8 *)b); + F = ebuf; case 0x80: snprintf(ebuf, sizeof(ebuf), "[bx+si+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx,%%si)", *(s16 *)b); + F = ebuf; ++b; break; case 0x81: snprintf(ebuf, sizeof(ebuf), "[bx+di+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx,%%di)", *(s16 *)b); + F = ebuf; ++b; break; case 0x82: snprintf(ebuf, sizeof(ebuf), "[bp+si+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp,%%si)", *(s16 *)b); + F = ebuf; ++b; break; case 0x83: snprintf(ebuf, sizeof(ebuf), "[bp+di+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp,%%di)", *(s16 *)b); + F = ebuf; ++b; break; case 0x84: snprintf(ebuf, sizeof(ebuf), "[si+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%si)", *(s16 *)b); + F = ebuf; ++b; break; case 0x85: snprintf(ebuf, sizeof(ebuf), "[di+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%di)", *(s16 *)b); + F = ebuf; ++b; break; case 0x86: snprintf(ebuf, sizeof(ebuf), "[bp+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp)", *(s16 *)b); + F = ebuf; ++b; break; case 0x87: snprintf(ebuf, sizeof(ebuf), "[bx+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx)", *(s16 *)b); + F = ebuf; ++b; break; case 0xc0: E = "st(0)"; + F = "%%st(0)"; break; case 0xc1: E = "st(1)"; + F = "%%st(1)"; break; case 0xc2: E = "st(2)"; + F = "%%st(1)"; break; case 0xc3: E = "st(3)"; + F = "%%st(1)"; break; case 0xc4: E = "st(4)"; + F = "%%st(1)"; break; case 0xc5: E = "st(5)"; + F = "%%st(1)"; break; case 0xc6: E = "st(6)"; + F = "%%st(1)"; break; case 0xc7: E = "st(7)"; + F = "%%st(1)"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } } else{ switch(*b & 0xc7){ case 0x00: E = "[eax]"; + F = "(%%eax)"; break; case 0x01: E = "[ecx]"; + F = "(%%ecx)"; break; case 0x02: E = "[edx]"; + F = "(%%edx)"; break; case 0x03: E = "[ebx]"; + F = "(%%ebx)"; break; case 0x04: ++b; @@ -507,33 +767,60 @@ u32 decodeModSM_float(u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ snprintf(ebuf, sizeof(ebuf), "[%s+%s*%i]", base, indx, scale); } E = ebuf; + + if(!indx){ + snprintf(ebuf, sizeof(ebuf), "(%s)", base); + } else if(!base){ + if(!scale){ + snprintf(ebuf, sizeof(ebuf), "(%s)", indx); + } else{ + snprintf(ebuf, sizeof(ebuf), "(,%s,%i)", indx, scale); + } + } else if(!scale){ + snprintf(ebuf, sizeof(ebuf), "(%s,%s)", base, indx); + } else{ + snprintf(ebuf, sizeof(ebuf), "(%s,%s,%i)", base, indx, scale); + } + F = ebuf; break; case 0x05: - snprintf(ebuf, sizeof(ebuf), "ds:%x", *(u32 *)++b); + snprintf(ebuf, sizeof(ebuf), "ds:%x", *(u32 *)b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%%ds:$%x", *(u32 *)++b); + F = ebuf; b += 3; break; case 0x06: E = "[esi]"; + F = "(%%esi)"; break; case 0x07: E = "[edi]"; + F = "(%%edi)"; break; case 0x40: snprintf(ebuf, sizeof(ebuf), "[eax+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%eax)", *(s8 *)b); + F = ebuf; break; case 0x41: snprintf(ebuf, sizeof(ebuf), "[ecx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ecx)", *(s8 *)b); + F = ebuf; break; case 0x42: snprintf(ebuf, sizeof(ebuf), "[edx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%edx)", *(s8 *)b); + F = ebuf; break; case 0x43: snprintf(ebuf, sizeof(ebuf), "[ebx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ebx)", *(s8 *)b); + F = ebuf; case 0x44: ++b; decodeSIB(); @@ -553,36 +840,68 @@ u32 decodeModSM_float(u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ len = strlen(ebuf); snprintf(ebuf+len, sizeof(ebuf)-len, "+%x]", *(u8 *)++b); E = ebuf; + + snprintf(ebuf, sizeof(ebuf), "%i", *(s8 *)b); + len = strlen(ebuf); + if(!indx){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s)", base); + } else if(!base){ + if(!scale){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s)", indx); + } else{ + snprintf(ebuf+len, sizeof(ebuf)-len, "(,%s,%i)", indx, scale); + } + } else if(!scale){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s,%s)", base, indx); + } else{ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s,%s,%i)", base, indx, scale); + } + F = ebuf; + break; case 0x45: snprintf(ebuf, sizeof(ebuf), "[ebp+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ebp)", *(s8 *)b); + F = ebuf; break; case 0x46: snprintf(ebuf, sizeof(ebuf), "[esi+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%esi)", *(s8 *)b); + F = ebuf; break; case 0x47: snprintf(ebuf, sizeof(ebuf), "[edi+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%edi)", *(s8 *)b); + F = ebuf; break; case 0x80: snprintf(ebuf, sizeof(ebuf), "[eax+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%eax)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x81: snprintf(ebuf, sizeof(ebuf), "[ecx+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ecx)", *(s32 *)b); + F = ebuf; break; case 0x82: snprintf(ebuf, sizeof(ebuf), "[edx+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%edx)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x83: snprintf(ebuf, sizeof(ebuf), "[ebx+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ebx)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x84: @@ -603,74 +922,124 @@ u32 decodeModSM_float(u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ } len = strlen(ebuf); snprintf(ebuf+len, sizeof(ebuf)-len, "+%x]", *(u32 *)++b); - b += 3; E = ebuf; + + snprintf(ebuf, sizeof(ebuf), "%i", *(s8 *)b); + len = strlen(ebuf); + if(!indx){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s)", base); + } else if(!base){ + if(!scale){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s)", indx); + } else{ + snprintf(ebuf+len, sizeof(ebuf)-len, "(,%s,%i)", indx, scale); + } + } else if(!scale){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s,%s)", base, indx); + } else{ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s,%s,%i)", base, indx, scale); + } + F = ebuf; + + b += 3; break; case 0x85: snprintf(ebuf, sizeof(ebuf), "[ebp+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ebp)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x86: snprintf(ebuf, sizeof(ebuf), "[esi+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%esi)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x87: snprintf(ebuf, sizeof(ebuf), "[edi+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%edi)", *(s32 *)b); + F = ebuf; b += 3; break; case 0xc0: E = "st(0)"; + F = "%%st(0)"; break; case 0xc1: E = "st(1)"; + F = "%%st(1)"; break; case 0xc2: E = "st(2)"; + F = "%%st(2)"; break; case 0xc3: E = "st(3)"; + F = "%%st(3)"; break; case 0xc4: E = "st(4)"; + F = "%%st(4)"; break; case 0xc5: E = "st(5)"; + F = "%%st(5)"; break; case 0xc6: E = "st(6)"; + F = "%%st(6)"; break; case 0xc7: E = "st(7)"; + F = "%%st(7)"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } } - if(order){ - snprintf(op, opBufSz, "%s", E); - len = strlen(op); - if(Gsz){ - snprintf(op+len, opBufSz-len, ", %s", G); + if (at) + { + if(order){ + snprintf(op, opBufSz, "%s", F); + len = strlen(op); + if(Gsz) snprintf(op+len, opBufSz-len, ", %s%%", G); + } + else + { + snprintf(op, opBufSz, "%s%%, ", G); + len = strlen(op); + snprintf(op+len, opBufSz-len, "%s", F); + } + } + else + { + if(order){ + snprintf(op, opBufSz, "%s", E); + len = strlen(op); + if(Gsz) snprintf(op+len, opBufSz-len, ", %s", G); + } + else + { + snprintf(op, opBufSz, "%s, ", G); + len = strlen(op); + snprintf(op+len, opBufSz-len, "%s", E); } - } else{ - snprintf(op, opBufSz, "%s, ", G); - len = strlen(op); - snprintf(op+len, opBufSz-len, "%s", E); } return b-a; } -u32 decodeModSM_memonly(u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ +u32 decodeModSM_memonly(bool at,u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ u32 len = 0; u32 reg = 0; u32 scale = 0; u8 *b = a; u8 *E, *G, *indx, *base, *disp = "\0"; + u8 *F; u8 ebuf[32] = {0}; setG(); @@ -679,118 +1048,163 @@ u32 decodeModSM_memonly(u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ switch(*b&0xc7){ case 0x00: E = "[bx+si]"; + F = "(%%bx,%%si)"; break; case 0x01: E = "[bx+di]"; + F = "(%%bx,%%di)"; break; case 0x02: E = "[bp+si]"; + F = "(%%bp,%%si)"; break; case 0x03: E = "[bp+di]"; + F = "(%%bp,%%di)"; break; case 0x04: E = "[si]"; + F = "(%%si)"; break; case 0x05: E = "[di]"; + F = "(%%di)"; break; case 0x06: snprintf(ebuf, sizeof(ebuf), "ds:%x", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%%ds:$%x", *(u16 *)b); + F = ebuf; ++b; break; case 0x07: E = "[bx]"; + F = "(%%bx)"; break; case 0x40: snprintf(ebuf, sizeof(ebuf), "[bx+si+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx,%%si)", *(s8 *)b); + F = ebuf; break; case 0x41: snprintf(ebuf, sizeof(ebuf), "[bx+di+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx,%%di)", *(s8 *)b); + F = ebuf; break; case 0x42: snprintf(ebuf, sizeof(ebuf), "[bp+si+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp,%%si)", *(s8 *)b); + F = ebuf; break; case 0x43: snprintf(ebuf, sizeof(ebuf), "[bp+di+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp,%%di)", *(s8 *)b); + F = ebuf; break; case 0x44: snprintf(ebuf, sizeof(ebuf), "[si+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%si)", *(s8 *)b); + F = ebuf; break; case 0x45: snprintf(ebuf, sizeof(ebuf), "[di+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%di)", *(s8 *)b); + F = ebuf; break; case 0x46: snprintf(ebuf, sizeof(ebuf), "[bp+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp)", *(s8 *)b); + F = ebuf; break; case 0x47: snprintf(ebuf, sizeof(ebuf), "[bx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx)", *(s8 *)b); + F = ebuf; case 0x80: snprintf(ebuf, sizeof(ebuf), "[bx+si+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx,%%si)", *(s16 *)b); + F = ebuf; ++b; break; case 0x81: snprintf(ebuf, sizeof(ebuf), "[bx+di+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx,%%di)", *(s16 *)b); + F = ebuf; ++b; break; case 0x82: snprintf(ebuf, sizeof(ebuf), "[bp+si+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp,%%si)", *(s16 *)b); + F = ebuf; ++b; break; case 0x83: snprintf(ebuf, sizeof(ebuf), "[bp+di+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp,%%di)", *(s16 *)b); + F = ebuf; ++b; break; case 0x84: snprintf(ebuf, sizeof(ebuf), "[si+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%si)", *(s16 *)b); + F = ebuf; ++b; break; case 0x85: snprintf(ebuf, sizeof(ebuf), "[di+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%di)", *(s16 *)b); + F = ebuf; ++b; break; case 0x86: snprintf(ebuf, sizeof(ebuf), "[bp+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bp)", *(s16 *)b); + F = ebuf; ++b; break; case 0x87: snprintf(ebuf, sizeof(ebuf), "[bx+%x]", *(u16 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%bx)", *(s16 *)b); + F = ebuf; ++b; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } } else{ switch(*b&0xc7){ case 0x00: E = "[eax]"; + F = "(%%eax)"; break; case 0x01: E = "[ecx]"; + F = "(%%ecx)"; break; case 0x02: E = "[edx]"; + F = "(%%edx)"; break; case 0x03: E = "[ebx]"; + F = "(%%ebx)"; break; case 0x04: ++b; @@ -809,10 +1223,28 @@ u32 decodeModSM_memonly(u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ snprintf(ebuf, sizeof(ebuf), "[%s+%s*%i]", base, indx, scale); } E = ebuf; + + if(!indx){ + snprintf(ebuf, sizeof(ebuf), "(%s)", base); + } else if(!base){ + if(!scale){ + snprintf(ebuf, sizeof(ebuf), "(%s)", indx); + } else{ + snprintf(ebuf, sizeof(ebuf), "(,%s,%i)", indx, scale); + } + } else if(!scale){ + snprintf(ebuf, sizeof(ebuf), "(%s,%s)", base, indx); + } else{ + snprintf(ebuf, sizeof(ebuf), "(%s,%s,%i)", base, indx, scale); + } + F = ebuf; + break; case 0x05: snprintf(ebuf, sizeof(ebuf), "ds:%x", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%ds:$%x", *(u32 *)b); + F = ebuf; b += 3; break; case 0x06: @@ -824,18 +1256,26 @@ u32 decodeModSM_memonly(u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ case 0x40: snprintf(ebuf, sizeof(ebuf), "[eax+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%eax)", *(s8 *)b); + F = ebuf; break; case 0x41: snprintf(ebuf, sizeof(ebuf), "[ecx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ecx)", *(s8 *)b); + F = ebuf; break; case 0x42: snprintf(ebuf, sizeof(ebuf), "[edx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%edx)", *(s8 *)b); + F = ebuf; break; case 0x43: snprintf(ebuf, sizeof(ebuf), "[ebx+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ebx)", *(s8 *)b); + F = ebuf; case 0x44: ++b; decodeSIB(); @@ -855,36 +1295,68 @@ u32 decodeModSM_memonly(u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ len = strlen(ebuf); snprintf(ebuf+len, sizeof(ebuf)-len, "+%x]", *(u8 *)++b); E = ebuf; + + snprintf(ebuf, sizeof(ebuf), "%i", *(s8 *)b); + len = strlen(ebuf); + if(!indx){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s)", base); + } else if(!base){ + if(!scale){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s)", indx); + } else{ + snprintf(ebuf+len, sizeof(ebuf)-len, "(,%s,%i)", indx, scale); + } + } else if(!scale){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s,%s)", base, indx); + } else{ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s,%s,%i)", base, indx, scale); + } + F = ebuf; + break; case 0x45: snprintf(ebuf, sizeof(ebuf), "[ebp+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ebp)", *(s8 *)b); + F = ebuf; break; case 0x46: snprintf(ebuf, sizeof(ebuf), "[esi+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%esi)", *(s8 *)b); + F = ebuf; break; case 0x47: snprintf(ebuf, sizeof(ebuf), "[edi+%x]", *(u8 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%edi)", *(s8 *)b); + F = ebuf; break; case 0x80: snprintf(ebuf, sizeof(ebuf), "[eax+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%eax)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x81: snprintf(ebuf, sizeof(ebuf), "[ecx+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ecx)", *(s32 *)b); + F = ebuf; break; case 0x82: snprintf(ebuf, sizeof(ebuf), "[edx+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%edx)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x83: snprintf(ebuf, sizeof(ebuf), "[ebx+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ebx)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x84: @@ -905,45 +1377,98 @@ u32 decodeModSM_memonly(u8 *a, u8 *op, u32 order, u32 Gsz, u32 Esz){ } len = strlen(ebuf); snprintf(ebuf+len, sizeof(ebuf)-len, "+%x]", *(u32 *)++b); - b += 3; E = ebuf; + + snprintf(ebuf, sizeof(ebuf), "%i", *(s8 *)b); + len = strlen(ebuf); + if(!indx){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s)", base); + } else if(!base){ + if(!scale){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s)", indx); + } else{ + snprintf(ebuf+len, sizeof(ebuf)-len, "(,%s,%i)", indx, scale); + } + } else if(!scale){ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s,%s)", base, indx); + } else{ + snprintf(ebuf+len, sizeof(ebuf)-len, "(%s,%s,%i)", base, indx, scale); + } + F = ebuf; + + b += 3; break; case 0x85: snprintf(ebuf, sizeof(ebuf), "[ebp+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%ebp)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x86: snprintf(ebuf, sizeof(ebuf), "[esi+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%esi)", *(s32 *)b); + F = ebuf; b += 3; break; case 0x87: snprintf(ebuf, sizeof(ebuf), "[edi+%x]", *(u32 *)++b); E = ebuf; + snprintf(ebuf, sizeof(ebuf), "%i(%%edi)", *(s32 *)b); + F = ebuf; b += 3; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } } - if(order){ - snprintf(op, opBufSz, "%s", E); - len = strlen(op); - if(Gsz){ - snprintf(op+len, opBufSz-len, ", %s", G); + if (at) + { + if(order){ + snprintf(op, opBufSz, "%s", F); + len = strlen(op); + if(Gsz) snprintf(op+len, opBufSz-len, ", %s%%", G); + } + else + { + snprintf(op, opBufSz, "%s%%, ", G); + len = strlen(op); + snprintf(op+len, opBufSz-len, "%s", F); + } + } + else + { + if(order){ + snprintf(op, opBufSz, "%s", E); + len = strlen(op); + if(Gsz) snprintf(op+len, opBufSz-len, ", %s", G); + } + else + { + snprintf(op, opBufSz, "%s, ", G); + len = strlen(op); + snprintf(op+len, opBufSz-len, "%s", E); } - } else{ - snprintf(op, opBufSz, "%s, ", G); - len = strlen(op); - snprintf(op+len, opBufSz-len, "%s", E); } return b-a; } -u32 decode(u8 *a){ +/*******************************************************************************/ +/* Desassemble une adresse mémoire au format at & t ou intel */ + +u32 disas(u8 *a) { + return decode(true, a, true); +} + +/*******************************************************************************/ +/* Desassemble une adresse mémoire au format at & t ou intel */ + +u32 decode(bool at, u8 *a, bool show){ + u8 *f_entry=0; + u16 entry=0; u8 *b = a; u32 len = 0; u32 flip_addr_sz = 0; @@ -1009,19 +1534,19 @@ u32 decode(u8 *a){ switch(*b){ case 0x00: s = "add"; - b += decodeModSM(++b, op1, 1, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 1, flip_addr_sz); break; case 0x01: s = "add"; - b += decodeModSM(++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x02: s = "add"; - b += decodeModSM(++b, op1, 0, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, 1, flip_addr_sz); break; case 0x03: s = "add"; - b += decodeModSM(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x04: s = "add"; @@ -1046,19 +1571,19 @@ u32 decode(u8 *a){ break; case 0x08: s = "or"; - b += decodeModSM(++b, op1, 1, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 1, flip_addr_sz); break; case 0x09: s = "or"; - b += decodeModSM(++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x0a: s = "or"; - b += decodeModSM(++b, op1, 0, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, 1, flip_addr_sz); break; case 0x0b: s = "or"; - b += decodeModSM(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x0c: s = "or"; @@ -1080,19 +1605,19 @@ u32 decode(u8 *a){ break; case 0x10: s = "adc"; - b += decodeModSM(++b, op1, 1, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 1, flip_addr_sz); break; case 0x11: s = "adc"; - b += decodeModSM(++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x12: s = "adc"; - b += decodeModSM(++b, op1, 0, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, 1, flip_addr_sz); break; case 0x13: s = "adc"; - b += decodeModSM(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x14: s = "adc"; @@ -1117,19 +1642,19 @@ u32 decode(u8 *a){ break; case 0x18: s = "sbb"; - b += decodeModSM(++b, op1, 1, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 1, flip_addr_sz); break; case 0x19: s = "sbb"; - b += decodeModSM(++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x1a: s = "sbb"; - b += decodeModSM(++b, op1, 0, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, 1, flip_addr_sz); break; case 0x1b: s = "sbb"; - b += decodeModSM(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x1c: s = "sbb"; @@ -1154,19 +1679,19 @@ u32 decode(u8 *a){ break; case 0x20: s = "and"; - b += decodeModSM(++b, op1, 1, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 1, flip_addr_sz); break; case 0x21: s = "and"; - b += decodeModSM(++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x22: s = "and"; - b += decodeModSM(++b, op1, 0, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, 1, flip_addr_sz); break; case 0x23: s = "and"; - b += decodeModSM(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x24: s = "and"; @@ -1188,19 +1713,19 @@ u32 decode(u8 *a){ break; case 0x28: s = "sub"; - b += decodeModSM(++b, op1, 1, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 1, flip_addr_sz); break; case 0x29: s = "sub"; - b += decodeModSM(++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x2a: s = "sub"; - b += decodeModSM(++b, op1, 0, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, 1, flip_addr_sz); break; case 0x2b: s = "sub"; - b += decodeModSM(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x2c: s = "sub"; @@ -1222,19 +1747,19 @@ u32 decode(u8 *a){ break; case 0x30: s = "xor"; - b += decodeModSM(++b, op1, 1, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 1, flip_addr_sz); break; case 0x31: s = "xor"; - b += decodeModSM(++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x32: s = "xor"; - b += decodeModSM(++b, op1, 0, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, 1, flip_addr_sz); break; case 0x33: s = "xor"; - b += decodeModSM(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x34: s = "xor"; @@ -1256,19 +1781,19 @@ u32 decode(u8 *a){ break; case 0x38: s = "cmp"; - b += decodeModSM(++b, op1, 1, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 1, flip_addr_sz); break; case 0x39: s = "cmp"; - b += decodeModSM(++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x3a: s = "cmp"; - b += decodeModSM(++b, op1, 0, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, 1, flip_addr_sz); break; case 0x3b: s = "cmp"; - b += decodeModSM(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x3c: s = "cmp"; @@ -1392,7 +1917,7 @@ u32 decode(u8 *a){ break; case 0x63: s = "arpl"; - b += decodeModSM(++b, op1, 1, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 1, flip_addr_sz); break; case 0x68: s = "push"; @@ -1406,7 +1931,7 @@ u32 decode(u8 *a){ break; case 0x69: s = "imul"; - b += decodeModSM(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); len = strlen(op1); if(flip_imm_sz){ snprintf(op1+len, sizeof(op1)-len, ", %x", *(u16 *)++b); @@ -1422,7 +1947,7 @@ u32 decode(u8 *a){ snprintf(op1, sizeof(op1), "%x", (void *)*b); case 0x6b: s = "imul"; - b += decodeModSM(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); len = strlen(op1); snprintf(op1+len, sizeof(op1)-len, ", %x", *(u8 *)++b); break; @@ -1526,7 +2051,7 @@ u32 decode(u8 *a){ snprintf(op1, sizeof(op1), "%x", (void *)entry+(u32)b-(u32)f_entry+*b+1); break; case 0x80: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); switch((*b&0x38)/8){ case 0: s = "add"; @@ -1553,14 +2078,14 @@ u32 decode(u8 *a){ s = "cmp"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } len = strlen(op1); snprintf(op1+len, sizeof(op1)-len, ", %x", *(u8 *)++b); break; case 0x81: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); switch((*b&0x38)/8){ case 0: s = "add"; @@ -1587,7 +2112,7 @@ u32 decode(u8 *a){ s = "cmp"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } len = strlen(op1); @@ -1600,7 +2125,7 @@ u32 decode(u8 *a){ } break; case 0x82: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); switch((*b&0x38)/8){ case 0: s = "add"; @@ -1627,14 +2152,14 @@ u32 decode(u8 *a){ s = "cmp"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } len = strlen(op1); snprintf(op1+len, sizeof(op1)-len, ", %x", *(u8 *)++b); break; case 0x83: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); switch((*b&0x38)/8){ case 0: s = "add"; @@ -1661,7 +2186,7 @@ u32 decode(u8 *a){ s = "cmp"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } len = strlen(op1); @@ -1669,51 +2194,51 @@ u32 decode(u8 *a){ break; case 0x84: s = "test"; - b += decodeModSM(++b, op1, 1, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 1, flip_addr_sz); break; case 0x85: s = "test"; - b += decodeModSM(++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x86: s = "xchg"; - b += decodeModSM(++b, op1, 1, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 1, flip_addr_sz); break; case 0x87: s = "xchg"; - b += decodeModSM(++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x88: s = "mov"; - b += decodeModSM(++b, op1, 1, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 1, flip_addr_sz); break; case 0x89: s = "mov"; - b += decodeModSM(++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x8a: s = "mov"; - b += decodeModSM(++b, op1, 0, 1, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, 1, flip_addr_sz); break; case 0x8b: s = "mov"; - b += decodeModSM(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x8c: s = "mov"; - b += decodeModSM(++b, op1, 1, 4, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 4, flip_addr_sz); break; case 0x8d: s = "lea"; - b += decodeModSM_memonly(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM_memonly(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0x8e: s = "mov"; - b += decodeModSM(++b, op1, 0, 4, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 0, 4, flip_addr_sz); break; case 0x8f: s = "pop"; - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); break; case 0x90: s = flip_imm_sz ? "xchg ax, ax": "nop"; @@ -1976,7 +2501,7 @@ u32 decode(u8 *a){ } break; case 0xc0: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); switch((*b&0x38)/8){ case 0: s = "rol"; @@ -2003,14 +2528,14 @@ u32 decode(u8 *a){ s = "sar"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } len = strlen(op1); snprintf(op1+len, sizeof(op1)-len, ", %x", *(u8 *)++b); break; case 0xc1: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); switch((*b&0x38)/8){ case 0: s = "rol"; @@ -2037,7 +2562,7 @@ u32 decode(u8 *a){ s = "sar"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } len = strlen(op1); @@ -2053,21 +2578,21 @@ u32 decode(u8 *a){ break; case 0xc4: s = "les"; - b += decodeModSM_memonly(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM_memonly(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0xc5: s = "lds"; - b += decodeModSM_memonly(++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); + b += decodeModSM_memonly(at, ++b, op1, 0, flip_imm_sz ? 2: 3, flip_addr_sz); break; case 0xc6: s = "mov"; - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); len = strlen(op1); snprintf(op1+len, sizeof(op1)-len, ", %x", *(u8 *)++b); break; case 0xc7: s = "mov"; - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); len = strlen(op1); if(flip_imm_sz){ snprintf(op1+len, sizeof(op1)-len, ", %x", *(u16 *)++b); @@ -2108,7 +2633,7 @@ u32 decode(u8 *a){ s = "iret"; break; case 0xd0: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); switch((*b&0x38)/8){ case 0: s = "rol"; @@ -2135,14 +2660,14 @@ u32 decode(u8 *a){ s = "sar"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } len = strlen(op1); snprintf(op1+len, sizeof(op1)-len, ", 1"); break; case 0xd1: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); switch((*b&0x38)/8){ case 0: s = "rol"; @@ -2169,14 +2694,14 @@ u32 decode(u8 *a){ s = "sar"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } len = strlen(op1); snprintf(op1+len, sizeof(op1)-len, ", 1"); break; case 0xd2: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); switch((*b&0x38)/8){ case 0: s = "rol"; @@ -2203,14 +2728,14 @@ u32 decode(u8 *a){ s = "sar"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } len = strlen(op1); snprintf(op1+len, sizeof(op1)-len, ", cl"); break; case 0xd3: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); switch((*b&0x38)/8){ case 0: s = "rol"; @@ -2237,7 +2762,7 @@ u32 decode(u8 *a){ s = "sar"; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } len = strlen(op1); @@ -2268,38 +2793,38 @@ u32 decode(u8 *a){ switch((*b&0x38)>>3){ case 0: s = "fadd"; - b += decodeModSM_float(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM_float(at, b, op1, 1, 0, flip_addr_sz); break; case 1: s = "fmul"; - b += decodeModSM_float(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM_float(at, b, op1, 1, 0, flip_addr_sz); break; case 2: s = "fcom"; - b += decodeModSM_float(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM_float(at, b, op1, 1, 0, flip_addr_sz); break; case 3: s = "fcomp"; - b += decodeModSM_float(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM_float(at, b, op1, 1, 0, flip_addr_sz); break; case 4: s = "fsub"; - b += decodeModSM_float(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM_float(at, b, op1, 1, 0, flip_addr_sz); break; case 5: s = "fsubr"; - b += decodeModSM_float(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM_float(at, b, op1, 1, 0, flip_addr_sz); break; case 6: s = "fdiv"; - b += decodeModSM_float(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM_float(at, b, op1, 1, 0, flip_addr_sz); break; case 7: s = "fdivr"; - b += decodeModSM_float(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM_float(at, b, op1, 1, 0, flip_addr_sz); break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } } @@ -2401,7 +2926,7 @@ u32 decode(u8 *a){ s = "cmc"; break; case 0xf6: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); switch((*b&0x38)/8){ case 0: s = "test"; @@ -2432,12 +2957,12 @@ u32 decode(u8 *a){ s = "idiv al, ah, ax, "; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } break; case 0xf7: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); switch((*b&0x38)/8){ case 0: s = "test"; @@ -2480,7 +3005,7 @@ u32 decode(u8 *a){ s = "idiv rdx, rax, "; break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } break; @@ -2503,13 +3028,13 @@ u32 decode(u8 *a){ s = "std"; break; case 0xfe: - b += decodeModSM(++b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, ++b, op1, 1, 0, flip_addr_sz); if(!((*b&0x38)/8)){ s = "inc"; } else if((*b&0x38)/8 == 1){ s = "dec"; } else{ - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } break; @@ -2517,34 +3042,34 @@ u32 decode(u8 *a){ switch((*++b&0x38)>>3){ case 0: s = "inc"; - b += decodeModSM(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, b, op1, 1, 0, flip_addr_sz); break; case 1: s = "dec"; - b += decodeModSM(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, b, op1, 1, 0, flip_addr_sz); break; case 2: s = "call"; - b += decodeModSM(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, b, op1, 1, 0, flip_addr_sz); break; case 3: s = "callf"; - b += decodeModSM_memonly(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM_memonly(at, b, op1, 1, 0, flip_addr_sz); break; case 4: s = "jmp"; - b += decodeModSM(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, b, op1, 1, 0, flip_addr_sz); break; case 5: s = "jmpf"; - b += decodeModSM_memonly(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM_memonly(at, b, op1, 1, 0, flip_addr_sz); break; case 6: s = "push"; - b += decodeModSM(b, op1, 1, 0, flip_addr_sz); + b += decodeModSM(at, b, op1, 1, 0, flip_addr_sz); break; default: - print("Invalid Mod R/M byte."); + print("Invalid Mod R/M byte.\r\n"); return; } break; @@ -2552,11 +3077,12 @@ u32 decode(u8 *a){ print("invalid opcode\r\n"); return; } - strcompressdelimiter(s,' '); - printf(" %X: %s %s\r\n", entry+(u32)a-(u32)f_entry, s, op1); + if (show) { + strcompressdelimiter(s,' '); + printf(" %X: %s %s\r\n", (u32)a, s, op1); + } ++b; } - return b-a; } diff --git a/lib/interrupts.c b/lib/interrupts.c index db21b4d..fc13865 100755 --- a/lib/interrupts.c +++ b/lib/interrupts.c @@ -8,6 +8,7 @@ #include "video.h" #include "gdt.h" #include "system.h" +#include "debug.h" #define IDT_SIZE 256 /* nombre de descripteurs */ @@ -188,7 +189,13 @@ void exception1() dump.eip=current->eip; dump.cs=current->cs; dump.esp=(current+1); - cpuerror("#DB Debug exception",&dump); + changevc(6); + clearscreen(); + show_lightcpu(&dump); + setdebugreg(0,0, DBG_CLEAR); + sti(); + waitascii(); + iret(); } void exception2() diff --git a/lib/shell.c b/lib/shell.c index 56b7748..f41ae6b 100644 --- a/lib/shell.c +++ b/lib/shell.c @@ -27,7 +27,10 @@ static command commands[] = { {"err" , "", &err}, {"test" , "", &test}, {"view" , "", &view}, - {"disasm" , "", &disasm} + {"disasm" , "", &disasm}, + {"bpset" , "", &bpset}, + {"bpclr" , "", &bpclr}, + {"help" , "", &help}, }; /*******************************************************************************/ @@ -49,7 +52,7 @@ void shell() strgetitem(&field, &item, ' ', 0); strtolower(&item); found = false; - for (i = 0; i < sizeof(commands); i++) { + for (i = 0; i < sizeof(commands)/sizeof(commands[0]); i++) { if (strcmp(&item, &commands[i].name) == 0) { (*commands[i].function) (&field); found = true; @@ -64,6 +67,75 @@ void shell() int test(void) { print("Fonction de test !\r\n"); + return; +} + +/*******************************************************************************/ +/* Renvoie les commandes disponibles */ + +int help() +{ + print("Commandes disponibles :\r\n\r\n"); + for(u32 i=0;i3) { + print("numero incorrect"); + return; + } + strgetitem(commandline, &arg, ' ', 2); + pointer=strtoint(&arg); + if (strgetnbitems(commandline, ' ') == 4) + { + strgetitem(commandline, &arg, ' ', 3); + type=strtoint(&arg); + } + if (type>DBG_READWRITE) + { + print("type incorrect"); + return; + } + setdebugreg(numero,pointer,type); +} + +/*******************************************************************************/ +/* Retire un breakpoint */ + +int bpclr(u8* commandline) +{ + u8 arg[] = " \000"; + u8* numero; + + if (strgetnbitems(commandline, ' ') < 2) + { + print("Syntaxe de la commande BPCLR\r\nbpclr \33[32mnumero\r\n\r\n \33[32mnumero\33[0m\33[0m\33[25D\33[10C - numero du breakpoint (0-3)\r\n"); + return; + } + strgetitem(commandline, &arg, ' ', 1); + numero=strtoint(&arg); + if (numero>3) { + print("numero incorrect"); + return; + } + setdebugreg(numero,0x0,DBG_CLEAR); } /*******************************************************************************/ @@ -81,12 +153,13 @@ int disasm(u8* commandline) return; } strgetitem(commandline, &arg, ' ', 1); - size=pointer=strtoint(&arg); + pointer=strtoint(&arg); + size=pointer; strgetitem(commandline, &arg, ' ', 2); size+=strtoint(&arg); while(pointer