174
180
label = m.group(1).strip()
175
181
inst = m.group(2).strip()
177
if m.group(3): args = m.group(3).strip()
184
args = m.group(3).strip()
185
if not inst_has_label(inst):
186
def hex2int(m): return str(int(m.group(0), 16))
187
args = re.sub(r"\b0x[0-9a-fA-F]+\b", hex2int, args)
179
if inst in ["movl",] and re.search(r"\b[de]s\b", args):
182
m = re.search(r"^(.+?)\b0x0\s+(\w+):\s+(1|2|R_386_16|R_386_PC16)\s+(__\w+)$", args)
189
if 1 and inst in ["movl",] and re.search(r"\b[de]s\b", args):
190
# work around a bug in objdump 2.17 (fixed in binutils 2.18)
192
m = re.search(r"^(.+?)\b(0|0x0)\s+(\w+):\s+(1|2|R_386_16|R_386_PC16)\s+(__\w+)$", args)
184
194
# 1 or 2 byte reloc
185
args = m.group(1) + m.group(4)
195
args = m.group(1) + m.group(5)
186
196
olines.append([label, inst, args, None])
200
210
["push", "word ptr [bp+8]"],
201
211
["push", "word ptr [bp+6]"],
202
["push", r"word ptr \[bp([+-]\d+)\]$"],
203
["push", r"word ptr \[bp([+-]\d+)\]$"],
212
["push", r"word ptr \[bp([+-](\d+))\]$"],
213
["push", r"word ptr \[bp([+-](\d+))\]$"],
205
215
dpos = omatch(i-1, -4, s)
301
311
orewrite_inst(i, "M_shld_diax_8_bxcx", "", dpos1[-3:])
304
["mov", r"^c[lx],0x8$"],
305
["shl", r"^word ptr \[bp([+-]\d+)\],1$"],
306
["rcl", r"^word ptr \[bp([+-]\d+)\],1$"],
314
["mov", r"^c[lx],8$"],
315
["shl", r"^word ptr \[bp([+-](\d+))\],1$"],
316
["rcl", r"^word ptr \[bp([+-](\d+))\],1$"],
309
319
["mov", r"^dx,word ptr"],
322
332
orewrite_inst(i, m, "", dpos1)
325
["mov", r"^word ptr \[bp([+-]\d+)\],si$"],
326
["mov", r"^word ptr \[bp([+-]\d+)\],di$"],
327
["mov", r"^c[lx],0xb$"],
328
["shr", r"^word ptr \[bp([+-]\d+)\],1$"],
329
["rcr", r"^word ptr \[bp([+-]\d+)\],1$"],
335
["mov", r"^word ptr \[bp([+-](\d+))\],si$"],
336
["mov", r"^word ptr \[bp([+-](\d+))\],di$"],
337
["mov", r"^c[lx],11$"],
338
["shr", r"^word ptr \[bp([+-](\d+))\],1$"],
339
["rcr", r"^word ptr \[bp([+-](\d+))\],1$"],
332
342
["mov", r"^bx,word ptr"],
333
343
["mov", r"^bx,word ptr"],
334
["mov", r"^ax,word ptr \[bp([+-]\d+)\]$"],
335
["mov", r"^dx,word ptr \[bp([+-]\d+)\]$"],
344
["mov", r"^ax,word ptr \[bp([+-](\d+))\]$"],
345
["mov", r"^dx,word ptr \[bp([+-](\d+))\]$"],
337
347
dpos1 = omatch(i-1, -5, s1)
338
348
dpos2 = omatch(i+1, 4, s2)
346
356
m = "M_shrd_11_disi_bp %s %s" % (bp_dx, bp_ax)
347
357
orewrite_inst(i, m, "", dpos1 + dpos2[-2:])
359
if opts.mov_rewrite and inst in ["mov"]:
361
["mov", r"^al,byte ptr \[(di|si)\]$"],
363
["mov", r"^word ptr \[bp([+-](\d+))\],ax$"],
364
["mov", r"^word ptr \[bp([+-](\d+))\],(0|1)$"],
365
["mov", r"^word ptr \[bp([+-](\d+))\],(0|1)$"],
366
["mov", r"^word ptr \[bp([+-](\d+))\],(0|1)$"],
367
["mov", r"^word ptr \[bp([+-](\d+))\],(0|1)$"],
368
["mov", r"^word ptr \[bp([+-](\d+))\],(0|1)$"],
369
["mov", r"^word ptr \[bp([+-](\d+))\],(0|1)$"],
370
["mov", r"^word ptr \[bp([+-](\d+))\],(0|1)$"],
371
["mov", r"^word ptr \[bp([+-](\d+))\],(0|1)$"],
372
["mov", r"^word ptr \[bp([+-](\d+))\],(0|1)$"],
373
["mov", r"^bx,word ptr \[bp([+-](\d+))\]$"],
374
["mov", r"^word ptr \[bx\],(0)$"],
375
["mov", r"^word ptr \[bx([+-](\d+))\],(0)$"],
376
["mov", r"^bx,word ptr \[bp([+-](\d+))\]$"],
377
["mov", r"^word ptr \[bx\],(0)$"],
378
["mov", r"^word ptr \[bx([+-](\d+))\],(0)$"],
379
["mov", r"^dl,byte ptr \[(di|si)([+-](\d+))\]$"],
383
dpos = omatch(i, -len(s), s)
388
for pos, m0, m1 in dpos:
389
assert pos == pos0 + len(r)
390
r.append([olines[pos][1], olines[pos][2]])
391
z0 = r[0]; z1 = r[2]; del r[:3]
392
r.insert(0, ["xor", "ax,ax"])
393
r.insert(ipos, z0); r.insert(ipos + 1, z1)
397
if inst == "mov" and args.endswith(",0"):
398
r[i] = [inst, args[:-1] + "ax"]
399
elif inst == "mov" and args.endswith(",1"):
401
r.insert(ipos, [inst, args[:-1] + "ax"])
402
del r[i]; i -= 1; n_del += 1
404
assert len(r) == len(dpos)
407
##print pos-pos0, inst, args
408
olines[pos][1] = inst
409
olines[pos][2] = args
412
olines.insert(pos0 + ipos - n_del, [None, "inc", "ax", None])
351
"call", "ja", "jae", "jb", "jbe", "jcxz", "je",
352
"jg", "jge", "jl", "jle", "jmp", "jne", "loop",
415
if inst_has_label(inst):
354
416
k, v = parse_label(inst, args)
355
417
olines[i][2] = None
356
418
olines[i][3] = add_label(k, v)
387
449
ofp = open(ofile, "wb")
388
451
for label, inst, args, args_label in olines:
389
452
if labels.has_key(label):
453
current_label = labels[label][2]
391
455
ofp.write("%s: /* %d */\n" % (labels[label][2], labels[label][3]))
393
457
ofp.write("%s:\n" % (labels[label][2]))
394
458
if inst == "*DEL*":
460
if 1 and current_label in [".Lf122", ".Lf123", ".Lf124", ".Ls122", ".Ls123", ".Ls124"]:
398
464
args = "%s /* %d */" % (labels[args_label][2], labels[args_label][3])
400
466
args = labels[args_label][2]
468
# remove unneeded "byte/word/dword ptr"
469
# [this works, but disabled for now as we gain nothing]
470
if re.search(r"\bbyte ptr ", args):
471
if re.search(r"^[abcd][hl],", args): args = args.replace("byte ptr ", "")
472
if re.search(r",[abcd][hl]$", args): args = args.replace("byte ptr ", "")
473
if re.search(r"\bword ptr ", args):
474
if re.search(r"^[abcds][ix],", args): args = args.replace("word ptr ", "")
475
if re.search(r",[abcds][ix]$", args): args = args.replace("word ptr ", "")
476
if re.search(r"\bdword ptr ", args):
477
if re.search(r"^[abcd][x],", args): args = args.replace("dword ptr ", "")
401
478
l = "%8s%-7s %s" % ("", inst, args)
402
479
ofp.write(l.rstrip() + "\n")