main.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. This generates a source code file for x86 instruction formats.
  3. Thanks NASM!
  4. */
  5. #include <conio.h>
  6. #include <string>
  7. #include <fstream>
  8. #include <iostream>
  9. using namespace std;
  10. static const char *optype( const string &s ){
  11. if( s=="AL" ) return "AL";
  12. if( s=="AX" ) return "AX";
  13. if( s=="EAX" ) return "EAX";
  14. if( s=="CL" ) return "CL";
  15. if( s=="CX" ) return "CX";
  16. if( s=="ECX" ) return "ECX";
  17. if( s=="imm" ) return "IMM";
  18. if( s=="imm8" ) return "IMM8";
  19. if( s=="imm16" ) return "IMM16";
  20. if( s=="imm32" ) return "IMM32";
  21. if( s=="reg" ) return "REG";
  22. if( s=="reg8" ) return "REG8";
  23. if( s=="reg16" ) return "REG16";
  24. if( s=="reg32" ) return "REG32";
  25. if( s=="mem" ) return "MEM";
  26. if( s=="mem8" ) return "MEM8";
  27. if( s=="mem16" ) return "MEM16";
  28. if( s=="mem32" ) return "MEM32";
  29. if( s=="r/m" ) return "R_M";
  30. if( s=="r/m8" ) return "R_M8";
  31. if( s=="r/m16" ) return "R_M16";
  32. if( s=="r/m32" ) return "R_M32";
  33. if( s=="fpureg" ) return "FPUREG";
  34. if( s=="ST0" ) return "ST0";
  35. return 0;
  36. }
  37. void main(){
  38. string name,lhs,rhs,byte,bytes,flags,last;
  39. ifstream in( "nasm_insts.txt" );
  40. ofstream out( "..\\compiler\\assem_x86\\asm_insts.cpp" );
  41. out<<"//\n//This is generated code - do not modify!!!!!\n//\n";
  42. out<<"\n#include \"..\\std.h\"\n\n";
  43. out<<"\n#include \"insts.h\"\n\n";
  44. out<<"Inst insts[]={\n";
  45. for( ;!in.eof();in.ignore( INT_MAX,'\n' ) ){
  46. name.resize(0);
  47. in>>name;
  48. if( !name.size() || name[0]=='/' ) continue;
  49. lhs.resize(0);rhs.resize(0);
  50. const char *lop="NONE",*rop="NONE";
  51. while( isspace( in.peek() ) ) in.get();
  52. getline( in,lhs,';' );
  53. if( int i=lhs.size() ){
  54. while( i && isspace( lhs[i-1] ) ) --i;
  55. if( i ){
  56. lhs.resize( i );
  57. i=lhs.find( ',' );
  58. if( i!=string::npos ){
  59. rhs=lhs.substr( i+1 );
  60. lhs=lhs.substr( 0,i );
  61. }
  62. lop=optype( lhs );if( !lop ) continue;
  63. if( rhs.size() && !(rop=optype( rhs )) ) continue;
  64. }
  65. }
  66. bytes.resize(0);
  67. flags='0';
  68. bool fail=false;
  69. while( !fail ){
  70. in>>byte;
  71. if( byte[0]=='[' ) break;
  72. if( byte=="/r" ) flags+="|_R";
  73. else if( byte=="/0" ) flags+="|_0";
  74. else if( byte=="/1" ) flags+="|_1";
  75. else if( byte=="/2" ) flags+="|_2";
  76. else if( byte=="/3" ) flags+="|_3";
  77. else if( byte=="/4" ) flags+="|_4";
  78. else if( byte=="/5" ) flags+="|_5";
  79. else if( byte=="/6" ) flags+="|_6";
  80. else if( byte=="/7" ) flags+="|_7";
  81. else if( byte=="o16" ) flags+="|O16";
  82. else if( byte=="o32" ) flags+="|O32";
  83. else if( byte=="ow/od" ) flags+="|OW_OD";
  84. else if( byte=="ib" ) flags+="|IB";
  85. else if( byte=="iw" ) flags+="|IW";
  86. else if( byte=="id" ) flags+="|ID";
  87. else if( byte=="rw/rd" ) flags+="|RW_RD";
  88. else if( isxdigit( byte[0] ) ){
  89. string sub=byte.substr( 2 );
  90. if( sub.size() ){
  91. if( sub=="+r" ) flags+="|PLUSREG";
  92. else if( sub=="+cc" ) flags+="|PLUSCC";
  93. else fail=true;
  94. }
  95. bytes=bytes+"\\x"+byte[0]+byte[1];
  96. }else fail=true;
  97. }
  98. if( fail ) continue;
  99. if( flags.find( "0|" )==0 ) flags=flags.substr( 2 );
  100. for( int k=0;k<name.size();++k ) name[k]=tolower( name[k] );
  101. if( name==last ) name="0";
  102. else{
  103. last=name;
  104. name='\"'+name+'\"';
  105. }
  106. char bf[4];itoa( bytes.size()/3,bf,16 );
  107. bytes="\\x"+string( bf )+bytes;
  108. out<<name<<','<<lop<<','<<rop<<','<<flags<<",\""<<bytes<<"\",\n";
  109. }
  110. out<<"\"\",0,0,0,0\n};\n";
  111. out.flush();
  112. out.close();
  113. cout<<"All done!\n";
  114. getch();
  115. }