metasm 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +3 -0
  3. data.tar.gz.sig +0 -0
  4. data/Gemfile +3 -2
  5. data/metasm.gemspec +3 -2
  6. data/metasm.rb +4 -1
  7. data/metasm/compile_c.rb +2 -2
  8. data/metasm/cpu/arc/decode.rb +0 -21
  9. data/metasm/cpu/arc/main.rb +4 -4
  10. data/metasm/cpu/arm/decode.rb +1 -5
  11. data/metasm/cpu/arm/main.rb +3 -3
  12. data/metasm/cpu/arm64/decode.rb +2 -6
  13. data/metasm/cpu/arm64/main.rb +5 -5
  14. data/metasm/cpu/bpf/decode.rb +3 -35
  15. data/metasm/cpu/bpf/main.rb +5 -5
  16. data/metasm/cpu/bpf/render.rb +1 -12
  17. data/metasm/cpu/cy16/decode.rb +0 -6
  18. data/metasm/cpu/cy16/main.rb +3 -3
  19. data/metasm/cpu/cy16/render.rb +0 -11
  20. data/metasm/cpu/dalvik/decode.rb +4 -26
  21. data/metasm/cpu/dalvik/main.rb +20 -2
  22. data/metasm/cpu/dalvik/opcodes.rb +3 -2
  23. data/metasm/cpu/{mips/compile_c.rb → ebpf.rb} +5 -2
  24. data/metasm/cpu/ebpf/debug.rb +61 -0
  25. data/metasm/cpu/ebpf/decode.rb +142 -0
  26. data/metasm/cpu/ebpf/main.rb +58 -0
  27. data/metasm/cpu/ebpf/opcodes.rb +97 -0
  28. data/metasm/cpu/ebpf/render.rb +36 -0
  29. data/metasm/cpu/ia32/debug.rb +39 -1
  30. data/metasm/cpu/ia32/decode.rb +111 -90
  31. data/metasm/cpu/ia32/decompile.rb +45 -37
  32. data/metasm/cpu/ia32/main.rb +10 -0
  33. data/metasm/cpu/ia32/parse.rb +6 -0
  34. data/metasm/cpu/mcs51/decode.rb +1 -1
  35. data/metasm/cpu/mcs51/main.rb +11 -0
  36. data/metasm/cpu/mips/decode.rb +8 -18
  37. data/metasm/cpu/mips/main.rb +3 -3
  38. data/metasm/cpu/mips/opcodes.rb +1 -1
  39. data/metasm/cpu/msp430/decode.rb +2 -6
  40. data/metasm/cpu/msp430/main.rb +3 -3
  41. data/metasm/cpu/openrisc.rb +11 -0
  42. data/metasm/cpu/openrisc/debug.rb +106 -0
  43. data/metasm/cpu/openrisc/decode.rb +182 -0
  44. data/metasm/cpu/openrisc/decompile.rb +350 -0
  45. data/metasm/cpu/openrisc/main.rb +70 -0
  46. data/metasm/cpu/openrisc/opcodes.rb +109 -0
  47. data/metasm/cpu/openrisc/render.rb +37 -0
  48. data/metasm/cpu/ppc/decode.rb +0 -25
  49. data/metasm/cpu/ppc/main.rb +6 -6
  50. data/metasm/cpu/ppc/opcodes.rb +3 -4
  51. data/metasm/cpu/python/decode.rb +0 -20
  52. data/metasm/cpu/python/main.rb +1 -1
  53. data/metasm/cpu/sh4/decode.rb +2 -6
  54. data/metasm/cpu/sh4/main.rb +25 -23
  55. data/metasm/cpu/st20/decode.rb +0 -7
  56. data/metasm/cpu/webasm.rb +11 -0
  57. data/metasm/cpu/webasm/debug.rb +31 -0
  58. data/metasm/cpu/webasm/decode.rb +321 -0
  59. data/metasm/cpu/webasm/decompile.rb +386 -0
  60. data/metasm/cpu/webasm/encode.rb +104 -0
  61. data/metasm/cpu/webasm/main.rb +81 -0
  62. data/metasm/cpu/webasm/opcodes.rb +214 -0
  63. data/metasm/cpu/x86_64/compile_c.rb +13 -9
  64. data/metasm/cpu/x86_64/parse.rb +1 -1
  65. data/metasm/cpu/z80/decode.rb +0 -27
  66. data/metasm/cpu/z80/main.rb +3 -3
  67. data/metasm/cpu/z80/render.rb +0 -11
  68. data/metasm/debug.rb +43 -8
  69. data/metasm/decode.rb +62 -14
  70. data/metasm/decompile.rb +793 -466
  71. data/metasm/disassemble.rb +188 -131
  72. data/metasm/disassemble_api.rb +30 -17
  73. data/metasm/dynldr.rb +2 -2
  74. data/metasm/encode.rb +8 -2
  75. data/metasm/exe_format/autoexe.rb +2 -0
  76. data/metasm/exe_format/coff.rb +21 -3
  77. data/metasm/exe_format/coff_decode.rb +12 -0
  78. data/metasm/exe_format/coff_encode.rb +6 -3
  79. data/metasm/exe_format/dex.rb +13 -3
  80. data/metasm/exe_format/elf.rb +12 -2
  81. data/metasm/exe_format/elf_decode.rb +59 -1
  82. data/metasm/exe_format/main.rb +2 -0
  83. data/metasm/exe_format/mz.rb +1 -0
  84. data/metasm/exe_format/pe.rb +25 -3
  85. data/metasm/exe_format/wasm.rb +402 -0
  86. data/metasm/gui/dasm_decomp.rb +171 -95
  87. data/metasm/gui/dasm_graph.rb +61 -2
  88. data/metasm/gui/dasm_hex.rb +2 -2
  89. data/metasm/gui/dasm_main.rb +45 -19
  90. data/metasm/gui/debug.rb +13 -4
  91. data/metasm/gui/gtk.rb +12 -4
  92. data/metasm/main.rb +108 -103
  93. data/metasm/os/emulator.rb +175 -0
  94. data/metasm/os/main.rb +11 -6
  95. data/metasm/parse.rb +23 -12
  96. data/metasm/parse_c.rb +189 -135
  97. data/metasm/preprocessor.rb +16 -1
  98. data/misc/openrisc-parser.rb +79 -0
  99. data/samples/dasm-plugins/scanxrefs.rb +6 -4
  100. data/samples/dasm-plugins/selfmodify.rb +8 -8
  101. data/samples/dbg-plugins/trace_func.rb +1 -1
  102. data/samples/disassemble-gui.rb +14 -3
  103. data/samples/emubios.rb +251 -0
  104. data/samples/emudbg.rb +127 -0
  105. data/samples/lindebug.rb +79 -78
  106. data/samples/metasm-shell.rb +8 -8
  107. data/tests/all.rb +1 -1
  108. data/tests/expression.rb +2 -0
  109. data/tests/graph_layout.rb +1 -1
  110. data/tests/ia32.rb +1 -0
  111. data/tests/mips.rb +1 -1
  112. data/tests/preprocessor.rb +18 -0
  113. metadata +124 -6
  114. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8a5dcb50d2a38105adee7c8249698e2f675af544
4
- data.tar.gz: 0476236904d2bc2b8d45013446a58d053f0f24aa
3
+ metadata.gz: 474c2cb9b50af29f462619d47eb2c5ed062770ad
4
+ data.tar.gz: 9c82c356ea5d83f49c46a124289dd6d8c48a775e
5
5
  SHA512:
6
- metadata.gz: ad41d74f97fab2567509acddb90ea7124c317519e84af509c6e68d07839ff1015a2c4512286e76eb16db22efa481aa60531beeb66e5ec9c0677727ba6cf81571
7
- data.tar.gz: 333a45fd258674ead5f2b036e56e8e87ad06b4aa74b5f655495d05b902394527dad0abf78e614c7d6f715caa3d92c05b322166bfed74fb611ad3ddabbd4f7a1c
6
+ metadata.gz: 13d4f03ef8be7f1b793fb5e8fcc9e555894c6341042e996dd4bf11caaf1c9da4984a019d7244ea6df4137f7a790f5894b73a5e5d8b26915a6e027664debda1ce
7
+ data.tar.gz: ffc8f18dd425e81eff43f08a03d89590c4705fd27db3fd43f3b5ea956063436003aa423bf7ae92c400dbf068509173cf8ce3068f83a971bf2934a2c28a4a35ff
@@ -0,0 +1,3 @@
1
+ ��=���^�� 8�W�
2
+ ��*�O?2�!�O�)��}�e���-��ǹ��@s$�9�F`lo���ՙ�3�.O�o9S�����1b���~6����G���p(�
3
+ V���F�4��G9a-H()s�ٌ�<�>SyHLSY�7�@�w�}38QP�Z��Bl�5��8�t�����0��Q�P�=� pfj\p���>芉�?�ḡ��POţ�ι7Ա���RQD(mi�1.K5»K��P��y��i.h\:�a�>
Binary file
data/Gemfile CHANGED
@@ -1,2 +1,3 @@
1
- source 'https://rubygems.org'
2
- gemspec
1
+ source 'https://rubygems.org' do
2
+ gemspec
3
+ end
@@ -4,7 +4,7 @@ require 'metasm'
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'metasm'
7
- s.version = '1.0.3'
7
+ s.version = '1.0.4'
8
8
  s.summary =
9
9
  "Metasm is a cross-architecture assembler, disassembler, linker, and debugger."
10
10
  s.description = ""
@@ -14,9 +14,10 @@ Gem::Specification.new do |s|
14
14
  s.test_files = s.files.grep(%r{^tests/})
15
15
  s.require_paths = ["."]
16
16
  s.homepage = 'http://metasm.cr0.org'
17
- s.license = 'LGPL'
17
+ s.license = 'LGPL-2.1'
18
18
 
19
19
  s.add_development_dependency "bundler", "~> 1.7"
20
20
  s.add_development_dependency "rake"
21
+ s.add_development_dependency "test-unit"
21
22
  end
22
23
 
data/metasm.rb CHANGED
@@ -36,8 +36,9 @@ module Metasm
36
36
  Const_autorequire = {
37
37
  'Ia32' => 'cpu/ia32', 'MIPS' => 'cpu/mips', 'PowerPC' => 'cpu/ppc', 'ARM' => 'cpu/arm',
38
38
  'X86_64' => 'cpu/x86_64', 'Sh4' => 'cpu/sh4', 'Dalvik' => 'cpu/dalvik', 'ARC' => 'cpu/arc',
39
- 'Python' => 'cpu/python', 'Z80' => 'cpu/z80', 'CY16' => 'cpu/cy16', 'BPF' => 'cpu/bpf',
39
+ 'Python' => 'cpu/python', 'Z80' => 'cpu/z80', 'CY16' => 'cpu/cy16', 'BPF' => 'cpu/bpf', 'EBPF' => 'cpu/ebpf',
40
40
  'MSP430' => 'cpu/msp430', 'ARM64' => 'cpu/arm64', 'ST20' => 'cpu/st20', 'MCS51' => 'cpu/mcs51',
41
+ 'OpenRisc' => 'cpu/openrisc', 'WebAsm' => 'cpu/webasm',
41
42
  'C' => 'compile_c',
42
43
  'MZ' => 'exe_format/mz', 'PE' => 'exe_format/pe',
43
44
  'ELF' => 'exe_format/elf', 'COFF' => 'exe_format/coff',
@@ -49,6 +50,7 @@ module Metasm
49
50
  'Bflt' => 'exe_format/bflt', 'Dol' => 'exe_format/dol',
50
51
  'PYC' => 'exe_format/pyc', 'JavaClass' => 'exe_format/javaclass',
51
52
  'SWF' => 'exe_format/swf', 'ZIP' => 'exe_format/zip',
53
+ 'WasmFile' => 'exe_format/wasm',
52
54
  'Shellcode_RWX' => 'exe_format/shellcode_rwx',
53
55
  'Gui' => 'gui',
54
56
  'WindowsExports' => 'os/windows_exports',
@@ -56,6 +58,7 @@ module Metasm
56
58
  'Debugger' => 'debug',
57
59
  'LinOS' => 'os/linux', 'WinOS' => 'os/windows',
58
60
  'GdbClient' => 'os/gdbremote',
61
+ 'EmuDebugger' => 'os/emulator',
59
62
  'Disassembler' => 'disassemble',
60
63
  'Decompiler' => 'decompile',
61
64
  'DynLdr' => 'dynldr',
@@ -864,7 +864,7 @@ module C
864
864
  blk.statements.each_with_index { |s, i|
865
865
  case s
866
866
  when Case
867
- label = compiler.new_label('case')
867
+ label = compiler.new_label("case_#{s.expr}")
868
868
  if s.expr == 'default'
869
869
  default = label
870
870
  elsif s.exprup
@@ -1063,7 +1063,7 @@ module C
1063
1063
  @lexpr = nil
1064
1064
  precompile_inner(compiler, scope)
1065
1065
  when :'?:'
1066
- # cannot precompile in place, a conditionnal expression may have a coma: must turn into If
1066
+ # cannot precompile in place, a conditional expression may have a coma: must turn into If
1067
1067
  if @lexpr.kind_of? CExpression
1068
1068
  @lexpr = @lexpr.precompile_inner(compiler, scope)
1069
1069
  if not @lexpr.lexpr and not @lexpr.op and @lexpr.rexpr.kind_of? ::Numeric
@@ -313,10 +313,6 @@ class ARC
313
313
  REG_SYMS
314
314
  end
315
315
 
316
- def backtrace_binding
317
- @backtrace_binding ||= init_backtrace_binding
318
- end
319
-
320
316
  def opshift(op)
321
317
  op[/\d/].to_i
322
318
  end
@@ -382,23 +378,6 @@ class ARC
382
378
  @backtrace_binding
383
379
  end
384
380
 
385
- def get_backtrace_binding(di)
386
- a = di.instruction.args.map { |arg|
387
- case arg
388
- when GPR; arg.symbolic
389
- when Memref; arg.symbolic(di.address)
390
- else arg
391
- end
392
- }
393
-
394
- if binding = backtrace_binding[di.opcode.basename]
395
- binding[di, *a]
396
- else
397
- puts "unhandled instruction to backtrace: #{di}" if $VERBOSE
398
- { :incomplete_binding => Expression[1] }
399
- end
400
- end
401
-
402
381
  def get_xrefs_x(dasm, di)
403
382
  return [] if not di.opcode.props[:setip]
404
383
 
@@ -40,7 +40,7 @@ class ARC < CPU
40
40
  # Branch Link Register R31 (BLINK)
41
41
  class GPR < Reg
42
42
  Sym = (0..64).map { |i| "r#{i}".to_sym }
43
- def symbolic; Sym[@i] end
43
+ def symbolic(di=nil); Sym[@i] end
44
44
 
45
45
  Render = {
46
46
  26 => 'gp', # global pointer, used to point to small sets of shared data throughout execution of a program
@@ -69,7 +69,7 @@ class ARC < CPU
69
69
  end
70
70
 
71
71
  class AUX < Reg
72
- def symbolic; "aux#{i}".to_sym end
72
+ def symbolic(di=nil); "aux#{i}".to_sym end
73
73
 
74
74
  Render = {
75
75
  0x00 => 'status', # Status register (Original ARCtangent-A4 processor format)
@@ -162,7 +162,7 @@ class ARC < CPU
162
162
  @base, @disp, @size = base, disp, sz
163
163
  end
164
164
 
165
- def symbolic(orig)
165
+ def symbolic(di=nil)
166
166
  b = @base
167
167
  b = b.symbolic if b.kind_of? Reg
168
168
 
@@ -174,7 +174,7 @@ class ARC < CPU
174
174
  e = Expression[b].reduce
175
175
  end
176
176
 
177
- Indirection[e, @size, orig]
177
+ Indirection[e, @size, (di.address if di)]
178
178
  end
179
179
 
180
180
  include Renderable
@@ -125,10 +125,6 @@ class ARM
125
125
  di
126
126
  end
127
127
 
128
- def backtrace_binding
129
- @backtrace_binding ||= init_backtrace_binding
130
- end
131
-
132
128
  def init_backtrace_binding
133
129
  @backtrace_binding ||= {}
134
130
  end
@@ -137,7 +133,7 @@ class ARM
137
133
  a = di.instruction.args.map { |arg|
138
134
  case arg
139
135
  when Reg; arg.symbolic
140
- when Memref; arg.symbolic(di.address)
136
+ when Memref; arg.symbolic(di)
141
137
  else arg
142
138
  end
143
139
  }
@@ -25,7 +25,7 @@ class ARM < CPU
25
25
  @shift = shift
26
26
  end
27
27
 
28
- def symbolic
28
+ def symbolic(di=nil)
29
29
  r = self.class.i_to_s[@i].to_sym
30
30
  if @stype == :lsl and @shift == 0
31
31
  r
@@ -41,11 +41,11 @@ class ARM < CPU
41
41
  @base, @offset, @sign, @incr = base, offset, sign, incr
42
42
  end
43
43
 
44
- def symbolic(len=4, orig=nil)
44
+ def symbolic(di=nil)
45
45
  o = @offset
46
46
  o = o.symbolic if o.kind_of? Reg
47
47
  p = Expression[@base.symbolic, @sign, o].reduce
48
- Indirection[p, len, orig]
48
+ Indirection[p, 4, (di.address if di)]
49
49
  end
50
50
  end
51
51
 
@@ -165,10 +165,6 @@ class ARM64
165
165
  di
166
166
  end
167
167
 
168
- def backtrace_binding
169
- @backtrace_binding ||= init_backtrace_binding
170
- end
171
-
172
168
  def init_backtrace_binding
173
169
  @backtrace_binding ||= {}
174
170
 
@@ -211,7 +207,7 @@ class ARM64
211
207
  a = di.instruction.args.map { |arg|
212
208
  case arg
213
209
  when Reg, RegShift, RegCC; arg.symbolic
214
- when Memref; arg.symbolic(di.address)
210
+ when Memref; arg.symbolic(di)
215
211
  else arg
216
212
  end
217
213
  }
@@ -269,7 +265,7 @@ class ARM64
269
265
  raise 'internal error: no jmp target' if di.opcode.name != 'ret'
270
266
  tg = :x30
271
267
  when Expression
272
- else tg = tg.symbolic
268
+ else tg = tg.symbolic(di)
273
269
  end
274
270
  [tg]
275
271
  else
@@ -24,7 +24,7 @@ class ARM64 < CPU
24
24
 
25
25
  Sym = @i_to_s[64].inject({}) { |h, (k, v)| h.update k => v.to_sym }
26
26
 
27
- def symbolic
27
+ def symbolic(di=nil)
28
28
  if @sz == 64
29
29
  Sym[@i]
30
30
  else
@@ -41,7 +41,7 @@ class ARM64 < CPU
41
41
  @shift = shift
42
42
  end
43
43
 
44
- def symbolic
44
+ def symbolic(di=nil)
45
45
  sym = @reg.symbolic
46
46
  if shift != 0
47
47
  case @mode
@@ -59,7 +59,7 @@ class ARM64 < CPU
59
59
  def initialize(cc)
60
60
  @cc = cc
61
61
  end
62
- def symbolic
62
+ def symbolic(di=nil)
63
63
  0
64
64
  end
65
65
  end
@@ -70,7 +70,7 @@ class ARM64 < CPU
70
70
  @base, @index, @scale, @offset, @sz, @incr = base, index, scale, offset, sz, incr
71
71
  end
72
72
 
73
- def symbolic(orig=nil)
73
+ def symbolic(di=nil)
74
74
  o = Expression[@base.symbolic]
75
75
  if @index
76
76
  si = @index.symbolic
@@ -78,7 +78,7 @@ class ARM64 < CPU
78
78
  o = Expression[o, :+, si]
79
79
  end
80
80
  o = Expression[o, :+, @offset] if @offset and @incr != :post
81
- Indirection[o.reduce, @sz, orig]
81
+ Indirection[o.reduce, @sz, (di.address if di)]
82
82
  end
83
83
  end
84
84
 
@@ -33,9 +33,9 @@ class BPF
33
33
  when :x; Reg.new(:x)
34
34
  when :a; Reg.new(:a)
35
35
  when :len; Reg.new(:len)
36
- when :p_k; PktRef.new(nil, Expression[k], op.props[:msz])
37
- when :p_xk; PktRef.new(Reg.new(:x), Expression[k], op.props[:msz])
38
- when :m_k; MemRef.new(nil, Expression[4*k], 4)
36
+ when :p_k; Pktref.new(nil, Expression[k], op.props[:msz])
37
+ when :p_xk; Pktref.new(Reg.new(:x), Expression[k], op.props[:msz])
38
+ when :m_k; Memref.new(nil, Expression[4*k], 4)
39
39
  when :jt; Expression[jt]
40
40
  when :jf; Expression[jf]
41
41
  else raise "unhandled arg #{a}"
@@ -74,12 +74,6 @@ class BPF
74
74
  di
75
75
  end
76
76
 
77
- # hash opcode_name => lambda { |dasm, di, *symbolic_args| instr_binding }
78
- def backtrace_binding
79
- @backtrace_binding ||= init_backtrace_binding
80
- end
81
- def backtrace_binding=(b) @backtrace_binding = b end
82
-
83
77
  # populate the @backtrace_binding hash with default values
84
78
  def init_backtrace_binding
85
79
  @backtrace_binding ||= {}
@@ -103,22 +97,6 @@ class BPF
103
97
  @backtrace_binding
104
98
  end
105
99
 
106
- def get_backtrace_binding(di)
107
- a = di.instruction.args.map { |arg|
108
- case arg
109
- when PktRef, MemRef, Reg; arg.symbolic(di)
110
- else arg
111
- end
112
- }
113
-
114
- if binding = backtrace_binding[di.opcode.name]
115
- binding[di, *a]
116
- else
117
- puts "unhandled instruction to backtrace: #{di}" if $VERBOSE
118
- {:incomplete_binding => Expression[1]}
119
- end
120
- end
121
-
122
100
  def get_xrefs_x(dasm, di)
123
101
  return [] if not di.opcode.props[:setip]
124
102
 
@@ -128,15 +106,5 @@ class BPF
128
106
  di.instruction.args[-1, 1]
129
107
  end
130
108
  end
131
-
132
- # updates an instruction's argument replacing an expression with another (eg label renamed)
133
- def replace_instr_arg_immediate(i, old, new)
134
- i.args.map! { |a|
135
- case a
136
- when Expression; a == old ? new : Expression[a.bind(old => new).reduce]
137
- else a
138
- end
139
- }
140
- end
141
109
  end
142
110
  end
@@ -14,10 +14,10 @@ class BPF < CPU
14
14
  @v = v
15
15
  end
16
16
 
17
- def symbolic(orig=nil) ; @v ; end
17
+ def symbolic(di=nil) ; @v ; end
18
18
  end
19
19
 
20
- class MemRef
20
+ class Memref
21
21
  attr_accessor :base, :offset, :msz
22
22
 
23
23
  def memtype
@@ -30,15 +30,15 @@ class BPF < CPU
30
30
  @msz = msz
31
31
  end
32
32
 
33
- def symbolic(orig)
33
+ def symbolic(di=nil)
34
34
  p = Expression[memtype]
35
35
  p = Expression[p, :+, @base.symbolic] if base
36
36
  p = Expression[p, :+, @offset] if offset
37
- Indirection[p, @msz, orig]
37
+ Indirection[p, @msz, (di.address if di)]
38
38
  end
39
39
  end
40
40
 
41
- class PktRef < MemRef
41
+ class Pktref < Memref
42
42
  def memtype
43
43
  :pkt
44
44
  end
@@ -13,7 +13,7 @@ class BPF
13
13
  include Renderable
14
14
  def render ; [@v.to_s] end
15
15
  end
16
- class MemRef
16
+ class Memref
17
17
  include Renderable
18
18
  def render
19
19
  r = []
@@ -26,16 +26,5 @@ class BPF
26
26
  r << ']'
27
27
  end
28
28
  end
29
-
30
- def render_instruction(i)
31
- r = []
32
- r << i.opname
33
- if not i.args.empty?
34
- r << ' '
35
- i.args.each { |a_| r << a_ << ', ' }
36
- r.pop
37
- end
38
- r
39
- end
40
29
  end
41
30
  end
@@ -107,12 +107,6 @@ class CY16
107
107
  di
108
108
  end
109
109
 
110
- # hash opcode_name => lambda { |dasm, di, *symbolic_args| instr_binding }
111
- def backtrace_binding
112
- @backtrace_binding ||= init_backtrace_binding
113
- end
114
- def backtrace_binding=(b) @backtrace_binding = b end
115
-
116
110
  # populate the @backtrace_binding hash with default values
117
111
  def init_backtrace_binding
118
112
  @backtrace_binding ||= {}
@@ -21,7 +21,7 @@ class CY16 < CPU
21
21
  @i = i
22
22
  end
23
23
 
24
- def symbolic(orig=nil) ; to_s.to_sym ; end
24
+ def symbolic(di=nil) ; to_s.to_sym ; end
25
25
 
26
26
  def self.from_str(s)
27
27
  raise "Bad name #{s.inspect}" if not x = @s_to_i[s]
@@ -39,11 +39,11 @@ class CY16 < CPU
39
39
  @autoincr = autoincr
40
40
  end
41
41
 
42
- def symbolic(orig)
42
+ def symbolic(di=nil)
43
43
  p = nil
44
44
  p = Expression[p, :+, @base.symbolic] if base
45
45
  p = Expression[p, :+, @offset] if offset
46
- Indirection[p.reduce, @sz, orig]
46
+ Indirection[p.reduce, @sz, (di.address if di)]
47
47
  end
48
48
  end
49
49
 
@@ -26,16 +26,5 @@ class CY16
26
26
  r << ']'
27
27
  end
28
28
  end
29
-
30
- def render_instruction(i)
31
- r = []
32
- r << i.opname
33
- if not i.args.empty?
34
- r << ' '
35
- i.args.each { |a_| r << a_ << ', ' }
36
- r.pop
37
- end
38
- r
39
- end
40
29
  end
41
30
  end