Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /* -----------------------------------------------------------------------------
  2.  * udis86.c
  3.  *
  4.  * Copyright (c) 2004, 2005, 2006, Vivek Mohan <vivek@sig9.com>
  5.  * All rights reserved. See LICENSE
  6.  * -----------------------------------------------------------------------------
  7.  */
  8.  
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <string.h>
  12.  
  13. #include "input.h"
  14. #include "extern.h"
  15.  
  16. /* =============================================================================
  17.  * ud_init() - Initializes ud_t object.
  18.  * =============================================================================
  19.  */
  20. extern void
  21. ud_init(struct ud* u)
  22. {
  23.   memset((void*)u, 0, sizeof(struct ud));
  24.   ud_set_mode(u, 16);
  25.   u->mnemonic = UD_Iinvalid;
  26.   ud_set_pc(u, 0);
  27. #ifndef __UD_STANDALONE__
  28.   ud_set_input_file(u, stdin);
  29. #endif /* __UD_STANDALONE__ */
  30. }
  31.  
  32. /* =============================================================================
  33.  * ud_disassemble() - disassembles one instruction and returns the number of
  34.  * bytes disassembled. A zero means end of disassembly.
  35.  * =============================================================================
  36.  */
  37. extern unsigned int
  38. ud_disassemble(struct ud* u)
  39. {
  40.   if (ud_input_end(u))
  41.         return 0;
  42.  
  43.  
  44.   u->insn_buffer[0] = u->insn_hexcode[0] = 0;
  45.  
  46.  
  47.   if (ud_decode(u) == 0)
  48.         return 0;
  49.   if (u->translator)
  50.         u->translator(u);
  51.   return ud_insn_len(u);
  52. }
  53.  
  54. /* =============================================================================
  55.  * ud_set_mode() - Set Disassemly Mode.
  56.  * =============================================================================
  57.  */
  58. extern void
  59. ud_set_mode(struct ud* u, uint8_t m)
  60. {
  61.   switch(m) {
  62.         case 16:
  63.         case 32:
  64.         case 64: u->dis_mode = m ; return;
  65.         default: u->dis_mode = 16; return;
  66.   }
  67. }
  68.  
  69. /* =============================================================================
  70.  * ud_set_vendor() - Set vendor.
  71.  * =============================================================================
  72.  */
  73. extern void
  74. ud_set_vendor(struct ud* u, unsigned v)
  75. {
  76.   switch(v) {
  77.         case UD_VENDOR_INTEL:
  78.                 u->vendor = v;
  79.                 break;
  80.         default:
  81.                 u->vendor = UD_VENDOR_AMD;
  82.   }
  83. }
  84.  
  85. /* =============================================================================
  86.  * ud_set_pc() - Sets code origin.
  87.  * =============================================================================
  88.  */
  89. extern void
  90. ud_set_pc(struct ud* u, uint64_t o)
  91. {
  92.   u->pc = o;
  93. }
  94.  
  95. /* =============================================================================
  96.  * ud_set_syntax() - Sets the output syntax.
  97.  * =============================================================================
  98.  */
  99. extern void
  100. ud_set_syntax(struct ud* u, void (*t)(struct ud*))
  101. {
  102.   u->translator = t;
  103. }
  104.  
  105. /* =============================================================================
  106.  * ud_insn() - returns the disassembled instruction
  107.  * =============================================================================
  108.  */
  109. extern char*
  110. ud_insn_asm(struct ud* u)
  111. {
  112.   return u->insn_buffer;
  113. }
  114.  
  115. /* =============================================================================
  116.  * ud_insn_offset() - Returns the offset.
  117.  * =============================================================================
  118.  */
  119. extern uint64_t
  120. ud_insn_off(struct ud* u)
  121. {
  122.   return u->insn_offset;
  123. }
  124.  
  125.  
  126. /* =============================================================================
  127.  * ud_insn_hex() - Returns hex form of disassembled instruction.
  128.  * =============================================================================
  129.  */
  130. extern char*
  131. ud_insn_hex(struct ud* u)
  132. {
  133.   return u->insn_hexcode;
  134. }
  135.  
  136. /* =============================================================================
  137.  * ud_insn_ptr() - Returns code disassembled.
  138.  * =============================================================================
  139.  */
  140. extern uint8_t*
  141. ud_insn_ptr(struct ud* u)
  142. {
  143.   return u->inp_sess;
  144. }
  145.  
  146. /* =============================================================================
  147.  * ud_insn_len() - Returns the count of bytes disassembled.
  148.  * =============================================================================
  149.  */
  150. extern unsigned int
  151. ud_insn_len(struct ud* u)
  152. {
  153.   return u->inp_ctr;
  154. }
  155.