Show
Ignore:
Timestamp:
01/20/10 22:36:39 (2 years ago)
Author:
mwhitworth
Message:

Add ndisasm code, use that for printing out optimized code.

Location:
rtcg/trunk/src/disasm
Files:
1 added
1 copied

Legend:

Unmodified
Added
Removed
  • rtcg/trunk/src/disasm/print.c

    r2081 r2083  
    55#include <stdlib.h> 
    66 
    7 #include <x86/modrm.h> 
    8  
    9 char* regs[]={"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"}; 
    10  
    117void AsmPrintCode(char* code, int length, FILE* outBuffer, int outLength) 
    128{ 
    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]; 
    1910 
    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, &reg, &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"); 
    5412 
    55                         case INSTR_SUB: 
    56                         { 
    57                                 unsigned char mod, reg, rm; 
    58                                 AsmModRm(ins[1], &mod, &reg, &rm); 
     13    /* Use nasm's disasm function */ 
     14    while (length > 0) 
     15    { 
     16        int lendis; 
    5917 
    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); 
    6519 
    66                                         default: 
    67                                                 printf("INSTR_SUB: TODO\n"); 
    68                                                 exit(0); 
    69                                 } 
     20        output_ins(0, (unsigned char*)code, lendis, outbuf); 
    7021 
    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    } 
    9424}