1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
import os, sys
from rpython.tool.udir import udir
import tempfile
class ASMInstruction(object):
asm_opts = '-march=armv8-a'
body = """.section .text
_start: .global _start
.global main
b main
main:
.ascii "START "
%s
.ascii "END "
"""
begin_tag = 'START '
end_tag = 'END '
base_name = 'test_%d.asm'
index = 0
def __init__(self, instr):
self.instr = instr
self.file = udir.join(self.base_name % self.index)
while self.file.check():
self.index += 1
self.file = udir.join(self.base_name % self.index)
def encode(self):
f = open("%s/a.out" % (udir),'rb')
data = f.read()
f.close()
i = data.find(self.begin_tag)
assert i>=0
j = data.find(self.end_tag, i)
assert j>=0
as_code = data[i+len(self.begin_tag):j]
return as_code
def assemble(self, *args):
res = self.body % (self.instr)
self.file.write(res)
if sys.platform == 'darwin':
fatal_warnings = ''
else:
fatal_warnings = '--fatal-warnings'
os.system("as " + fatal_warnings + " %s %s -o %s/a.out" % (self.asm_opts, self.file, udir))
#def __del__(self):
# self.file.close()
def assemble(instr):
a = ASMInstruction(instr)
a.assemble(instr)
return a.encode()
|