Changeset 2083 for rtcg/trunk
- Timestamp:
- 01/20/10 22:36:39 (2 years ago)
- Location:
- rtcg/trunk/src/disasm
- Files:
-
- 9 added
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
rtcg/trunk/src/disasm/print.c
r2081 r2083 5 5 #include <stdlib.h> 6 6 7 #include <x86/modrm.h>8 9 char* regs[]={"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"};10 11 7 void AsmPrintCode(char* code, int length, FILE* outBuffer, int outLength) 12 8 { 13 int i=0; 14 unsigned char* ins=(unsigned char*)code; 15 16 while (ins < (unsigned char*)code+length) 17 { 18 printf("\t"); 9 char outbuf[256]; 19 10 20 switch (*ins) 21 { 22 case 0: 23 ins++; 24 break; 25 26 case INSTR_XOR: 27 { 28 unsigned char mod, reg, rm; 29 AsmModRm(ins[1], &mod, ®, &rm); 30 printf("xor\t%s, %s\n", regs[reg], regs[rm]); 31 ins+=2; 32 break; 33 } 34 35 case INSTR_TEST: 36 printf("test ecx, ecx\n"); 37 ins+=2; 38 break; 39 40 case 0xB8 ... 0xBB: 41 { 42 char regs[]="acdb"; 43 printf("mov\te%cx, %#lx\n", regs[*ins-0xB8], *(unsigned long*)&ins[1]); 44 ins+=5; 45 break; 46 } 47 48 case INSTR_PUSH_START ... INSTR_PUSH_STOP: 49 { 50 printf("push\t%s\n", regs[*ins-INSTR_PUSH_START]); 51 ins+=1; 52 break; 53 } 11 printf("PRINTING OPTIMIZED CODE:\n"); 54 12 55 case INSTR_SUB: 56 { 57 unsigned char mod, reg, rm; 58 AsmModRm(ins[1], &mod, ®, &rm);13 /* Use nasm's disasm function */ 14 while (length > 0) 15 { 16 int lendis; 59 17 60 switch (mod) 61 { 62 case MOD_REG: 63 printf("sub [%s], %#X", regs[rm], ins[3]); 64 break; 18 lendis = disasm((unsigned char*)code, outbuf, sizeof(outbuf), 64, 0, 0); 65 19 66 default: 67 printf("INSTR_SUB: TODO\n"); 68 exit(0); 69 } 20 output_ins(0, (unsigned char*)code, lendis, outbuf); 70 21 71 ins += 4; 72 break; 73 } 74 75 case INSTR_POP_START ... INSTR_POP_STOP: 76 { 77 printf("pop\t%s", regs[*ins-INSTR_POP_START]); 78 ins+=1; 79 break; 80 } 81 82 case INSTR_RET: 83 printf("ret"); 84 ins++; 85 break; 86 87 default: 88 printf("TODO: *ins = %#X\n", *ins); 89 ins++; 90 } 91 92 printf("\n"); 93 } 22 length -= lendis; 23 } 94 24 }
