syntax.cc 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. /////////////////////////////////////////////////////////////////////////
  2. // $Id: syntax.cc 11968 2013-11-29 20:49:20Z sshwarts $
  3. /////////////////////////////////////////////////////////////////////////
  4. //
  5. // Copyright (c) 2005-2011 Stanislav Shwartsman
  6. // Written by Stanislav Shwartsman [sshwarts at sourceforge net]
  7. //
  8. // This library is free software; you can redistribute it and/or
  9. // modify it under the terms of the GNU Lesser General Public
  10. // License as published by the Free Software Foundation; either
  11. // version 2 of the License, or (at your option) any later version.
  12. //
  13. // This library is distributed in the hope that it will be useful,
  14. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. // Lesser General Public License for more details.
  17. //
  18. // You should have received a copy of the GNU Lesser General Public
  19. // License along with this library; if not, write to the Free Software
  20. // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  21. //
  22. /////////////////////////////////////////////////////////////////////////
  23. #include <stdio.h>
  24. #include "disasm.h"
  25. //////////////////
  26. // Intel STYLE
  27. //////////////////
  28. static const char *intel_general_16bit_regname[16] = {
  29. "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
  30. "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
  31. };
  32. static const char *intel_general_32bit_regname[16] = {
  33. "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
  34. "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
  35. };
  36. static const char *intel_general_64bit_regname[16] = {
  37. "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
  38. "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
  39. };
  40. static const char *intel_general_8bit_regname_rex[16] = {
  41. "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
  42. "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
  43. };
  44. static const char *intel_general_8bit_regname[8] = {
  45. "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"
  46. };
  47. static const char *intel_segment_name[8] = {
  48. "es", "cs", "ss", "ds", "fs", "gs", "??", "??"
  49. };
  50. static const char *intel_index16[8] = {
  51. "bx+si",
  52. "bx+di",
  53. "bp+si",
  54. "bp+di",
  55. "si",
  56. "di",
  57. "bp",
  58. "bx"
  59. };
  60. static const char *intel_vector_reg_name[4] = {
  61. "xmm", "ymm", "???", "zmm"
  62. };
  63. //////////////////
  64. // AT&T STYLE
  65. //////////////////
  66. static const char *att_general_16bit_regname[16] = {
  67. "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
  68. "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
  69. };
  70. static const char *att_general_32bit_regname[16] = {
  71. "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
  72. "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
  73. };
  74. static const char *att_general_64bit_regname[16] = {
  75. "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
  76. "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
  77. };
  78. static const char *att_general_8bit_regname_rex[16] = {
  79. "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
  80. "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
  81. };
  82. static const char *att_general_8bit_regname[8] = {
  83. "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh"
  84. };
  85. static const char *att_segment_name[8] = {
  86. "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%??", "%??"
  87. };
  88. static const char *att_index16[8] = {
  89. "%bx,%si",
  90. "%bx,%di",
  91. "%bp,%si",
  92. "%bp,%di",
  93. "%si",
  94. "%di",
  95. "%bp",
  96. "%bx"
  97. };
  98. static const char *att_vector_reg_name[4] = {
  99. "%xmm", "%ymm", "%???", "%zmm"
  100. };
  101. #define NULL_SEGMENT_REGISTER 7
  102. void disassembler::initialize_modrm_segregs()
  103. {
  104. sreg_mod00_rm16[0] = segment_name[DS_REG];
  105. sreg_mod00_rm16[1] = segment_name[DS_REG];
  106. sreg_mod00_rm16[2] = segment_name[SS_REG];
  107. sreg_mod00_rm16[3] = segment_name[SS_REG];
  108. sreg_mod00_rm16[4] = segment_name[DS_REG];
  109. sreg_mod00_rm16[5] = segment_name[DS_REG];
  110. sreg_mod00_rm16[6] = segment_name[DS_REG];
  111. sreg_mod00_rm16[7] = segment_name[DS_REG];
  112. sreg_mod01or10_rm16[0] = segment_name[DS_REG];
  113. sreg_mod01or10_rm16[1] = segment_name[DS_REG];
  114. sreg_mod01or10_rm16[2] = segment_name[SS_REG];
  115. sreg_mod01or10_rm16[3] = segment_name[SS_REG];
  116. sreg_mod01or10_rm16[4] = segment_name[DS_REG];
  117. sreg_mod01or10_rm16[5] = segment_name[DS_REG];
  118. sreg_mod01or10_rm16[6] = segment_name[SS_REG];
  119. sreg_mod01or10_rm16[7] = segment_name[DS_REG];
  120. sreg_mod00_base32[0] = segment_name[DS_REG];
  121. sreg_mod00_base32[1] = segment_name[DS_REG];
  122. sreg_mod00_base32[2] = segment_name[DS_REG];
  123. sreg_mod00_base32[3] = segment_name[DS_REG];
  124. sreg_mod00_base32[4] = segment_name[SS_REG];
  125. sreg_mod00_base32[5] = segment_name[DS_REG];
  126. sreg_mod00_base32[6] = segment_name[DS_REG];
  127. sreg_mod00_base32[7] = segment_name[DS_REG];
  128. sreg_mod00_base32[8] = segment_name[DS_REG];
  129. sreg_mod00_base32[9] = segment_name[DS_REG];
  130. sreg_mod00_base32[10] = segment_name[DS_REG];
  131. sreg_mod00_base32[11] = segment_name[DS_REG];
  132. sreg_mod00_base32[12] = segment_name[DS_REG];
  133. sreg_mod00_base32[13] = segment_name[DS_REG];
  134. sreg_mod00_base32[14] = segment_name[DS_REG];
  135. sreg_mod00_base32[15] = segment_name[DS_REG];
  136. sreg_mod01or10_base32[0] = segment_name[DS_REG];
  137. sreg_mod01or10_base32[1] = segment_name[DS_REG];
  138. sreg_mod01or10_base32[2] = segment_name[DS_REG];
  139. sreg_mod01or10_base32[3] = segment_name[DS_REG];
  140. sreg_mod01or10_base32[4] = segment_name[SS_REG];
  141. sreg_mod01or10_base32[5] = segment_name[SS_REG];
  142. sreg_mod01or10_base32[6] = segment_name[DS_REG];
  143. sreg_mod01or10_base32[7] = segment_name[DS_REG];
  144. sreg_mod01or10_base32[8] = segment_name[DS_REG];
  145. sreg_mod01or10_base32[9] = segment_name[DS_REG];
  146. sreg_mod01or10_base32[10] = segment_name[DS_REG];
  147. sreg_mod01or10_base32[11] = segment_name[DS_REG];
  148. sreg_mod01or10_base32[12] = segment_name[DS_REG];
  149. sreg_mod01or10_base32[13] = segment_name[DS_REG];
  150. sreg_mod01or10_base32[14] = segment_name[DS_REG];
  151. sreg_mod01or10_base32[15] = segment_name[DS_REG];
  152. }
  153. //////////////////
  154. // Intel STYLE
  155. //////////////////
  156. void disassembler::set_syntax_intel()
  157. {
  158. intel_mode = 1;
  159. general_16bit_regname = intel_general_16bit_regname;
  160. general_8bit_regname = intel_general_8bit_regname;
  161. general_32bit_regname = intel_general_32bit_regname;
  162. general_8bit_regname_rex = intel_general_8bit_regname_rex;
  163. general_64bit_regname = intel_general_64bit_regname;
  164. segment_name = intel_segment_name;
  165. index16 = intel_index16;
  166. vector_reg_name = intel_vector_reg_name;
  167. initialize_modrm_segregs();
  168. }
  169. void disassembler::print_disassembly_intel(const x86_insn *insn, const BxDisasmOpcodeInfo_t *entry)
  170. {
  171. // print opcode
  172. dis_sprintf("%s ", entry->IntelOpcode);
  173. if (entry->Operand1) {
  174. (this->*entry->Operand1)(insn);
  175. }
  176. if (entry->Operand2) {
  177. dis_sprintf(", ");
  178. (this->*entry->Operand2)(insn);
  179. }
  180. if (entry->Operand3) {
  181. dis_sprintf(", ");
  182. (this->*entry->Operand3)(insn);
  183. }
  184. if (entry->Operand4) {
  185. dis_sprintf(", ");
  186. (this->*entry->Operand4)(insn);
  187. }
  188. }
  189. //////////////////
  190. // AT&T STYLE
  191. //////////////////
  192. void disassembler::set_syntax_att()
  193. {
  194. intel_mode = 0;
  195. general_16bit_regname = att_general_16bit_regname;
  196. general_8bit_regname = att_general_8bit_regname;
  197. general_32bit_regname = att_general_32bit_regname;
  198. general_8bit_regname_rex = att_general_8bit_regname_rex;
  199. general_64bit_regname = att_general_64bit_regname;
  200. segment_name = att_segment_name;
  201. index16 = att_index16;
  202. vector_reg_name = att_vector_reg_name;
  203. initialize_modrm_segregs();
  204. }
  205. void disassembler::toggle_syntax_mode()
  206. {
  207. if (intel_mode) set_syntax_att();
  208. else set_syntax_intel();
  209. }
  210. void disassembler::print_disassembly_att(const x86_insn *insn, const BxDisasmOpcodeInfo_t *entry)
  211. {
  212. // print opcode
  213. dis_sprintf("%s ", entry->AttOpcode);
  214. if (entry->Operand4) {
  215. (this->*entry->Operand4)(insn);
  216. dis_sprintf(", ");
  217. }
  218. if (entry->Operand3) {
  219. (this->*entry->Operand3)(insn);
  220. dis_sprintf(", ");
  221. }
  222. if (entry->Operand2) {
  223. (this->*entry->Operand2)(insn);
  224. dis_sprintf(", ");
  225. }
  226. if (entry->Operand1) {
  227. (this->*entry->Operand1)(insn);
  228. }
  229. }