Show
Ignore:
Timestamp:
01/19/10 14:59:03 (2 years ago)
Author:
mwhitworth
Message:

Add other new files to SVN.

Files:
1 modified

Legend:

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

    r2079 r2081  
    11#include "asm.h" 
    22 
    3 char* regs[]={"eax", "ecx", "edx", "ebx"}; 
     3#define _GNU_SOURCE 
     4#include <stdio.h> 
     5#include <stdlib.h> 
    46 
    5 void AsmPrintCode(char* out, int length) 
     7#include <x86/modrm.h> 
     8 
     9char* regs[]={"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"}; 
     10 
     11void AsmPrintCode(char* code, int length, FILE* outBuffer, int outLength) 
    612{ 
    713        int i=0; 
    8         unsigned char* ins=(unsigned char*)out; 
     14        unsigned char* ins=(unsigned char*)code; 
    915         
    10         printf("optimizedCode:\n"); 
    11          
    12         while (ins < out+length) 
     16        while (ins < (unsigned char*)code+length) 
    1317        { 
     18                printf("\t"); 
     19 
    1420                switch (*ins) 
    1521                { 
     
    2228                                unsigned char mod, reg, rm; 
    2329                                AsmModRm(ins[1], &mod, &reg, &rm); 
    24                                 printf("\txor\t%s, %s\n", regs[reg], regs[rm]); 
     30                                printf("xor\t%s, %s\n", regs[reg], regs[rm]); 
    2531                                ins+=2; 
    2632                                break; 
     
    2834                                 
    2935                        case INSTR_TEST: 
    30                                 printf("\ttest ecx, ecx\n"); 
     36                                printf("test ecx, ecx\n"); 
    3137                                ins+=2; 
    3238                                break; 
     
    3541                        { 
    3642                                char regs[]="acdb"; 
    37                                 printf("\tmov\te%cx, %#x\n", regs[*ins-0xB8], *(unsigned long*)&ins[1]); 
     43                                printf("mov\te%cx, %#lx\n", regs[*ins-0xB8], *(unsigned long*)&ins[1]); 
    3844                                ins+=5; 
    3945                                break; 
     
    4248                        case INSTR_PUSH_START ... INSTR_PUSH_STOP: 
    4349                        { 
    44                                 printf("\tpush\t%s\n", regs[*ins-INSTR_PUSH_START]); 
     50                                printf("push\t%s\n", regs[*ins-INSTR_PUSH_START]); 
    4551                                ins+=1; 
     52                                break; 
     53                        } 
     54 
     55                        case INSTR_SUB: 
     56                        { 
     57                                unsigned char mod, reg, rm; 
     58                                AsmModRm(ins[1], &mod, &reg, &rm); 
     59 
     60                                switch (mod) 
     61                                { 
     62                                        case MOD_REG: 
     63                                                printf("sub [%s], %#X", regs[rm], ins[3]); 
     64                                                break; 
     65 
     66                                        default: 
     67                                                printf("INSTR_SUB: TODO\n"); 
     68                                                exit(0); 
     69                                } 
     70 
     71                                ins += 4; 
    4672                                break; 
    4773                        } 
     
    4975                        case INSTR_POP_START ... INSTR_POP_STOP: 
    5076                        { 
    51                                 char* regs[]={"eax", "ecx", "edx", "ebx"}; 
    52                                 printf("\tpop\t%s\n", regs[*ins-INSTR_POP_START]); 
     77                                printf("pop\t%s", regs[*ins-INSTR_POP_START]); 
    5378                                ins+=1; 
    5479                                break; 
     
    5681                                 
    5782                        case INSTR_RET: 
    58                                 printf("\tret\n"); 
     83                                printf("ret"); 
    5984                                ins++; 
    6085                                break; 
     
    6489                                ins++; 
    6590                } 
     91 
     92                printf("\n"); 
    6693        } 
    6794}