Skip to content

Instantly share code, notes, and snippets.

@ncw
Created June 12, 2017 20:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ncw/e2edab9aab09891f9d81a8ab26841373 to your computer and use it in GitHub Desktop.
Save ncw/e2edab9aab09891f9d81a8ab26841373 to your computer and use it in GitHub Desktop.
ARM assembler converter, ARM style to Go style
#!/usr/bin/perl -w
use strict;
# Rough and ready conversion of arm style assembler to go style
# assembler. Note input is expected to be in lower case whereas
# output is in upper case.
while (<>) {
s/ldrb\s+(\w+),\[(\w+),#(\w+)\]/MOVBU\t$3($2),$1/;
s/ldr\s+(\w+),\[(\w+),#([^]]+)\]!/MOVW.W\t$3($2),$1/;
s/ldr\s+(\w+),\[(\w+),#([^]]+)\]/MOVW\t$3($2),$1/;
s/ldr\s+(\w+),\[(\w+),(\w+),lsl#(\w+)\]/MOVW\t$3<<$4($2),$1/;
s/ldr\s+(\w+),\[(\w+)\],#([0-9-]+)/MOVW.P\t$3($2),$1/;
s/ldr\s+(\w+),\[(\w+)\]/MOVW\t($2),$1/;
s/str\s+(\w+),\[(\w+)\],#([0-9-]+)/MOVW.P\t$1,$3($2)/;
s/str\s+(\w+),\[(\w+),#([^]]+)\]/MOVW\t$1,$3($2)/;
s/str\s+(\w+),\[(\w+)\]/MOVW\t$1,($2)/;
s/ldrb\s+(\w+),\[(\w+),(\w+),lsl#(\w+)\]/MOVBU\t$3<<$4($2),$1/;
s/ldrb\s+(\w+),\[(\w+),(\w+)\]/MOVBU\t$3<<0($2),$1/;
s/ldrb\s+(\w+),\[(\w+)\]/MOVBU\t($2),$1/;
s/orr\s+(\w+),(\w+),(\w+),lsl#(\d+)/ORR\t$3<<$4,$2,$1/;
s/rev\s+(\w+),(\w+)/REV\t$2,$1/;
s/strb\s+(\w+),\[(\w+),#(\w+)\]/MOVBU\t$1,$3($2)/;
s/mov\s+(\w+),(\w+),lsr#(\w+)/MOVW\t$2>>$3,$1/;
s/mov\s+(\w+),(\w+),lsl#(\w+)/MOVW\t$2<<$3,$1/;
s/mov\s+(\w+),#(\w+)/MOVW\t\$$2,$1/;
s/mov\s+(\w+),(\w+)/MOVW\t$2,$1/;
s/teq\s+(\w+),#(\w+)/TEQ\t\$$2,$1/;
s/teq\s+(\w+),(\w+)/TEQ\t$2,$1/;
s/mvn\s+(\w+),(#\w+)/MVN\t\$$2,$1/;
s/mvn\s+(\w+),(\w+)/MVN\t$2,$1/;
s/^\s+(bl|b|bne|beq|bgt)\s+([\w.])/\t\U$1\E\t$2/;
s/([a-z]{3,5})\s+(\w+),(\w+),(\w+),lsl#(\d+)/\U$1\E\t$4<<$5,$3,$2/;
s/([a-z]{3,5})\s+(\w+),(\w+),(\w+),lsr#(\d+)/\U$1\E\t$4>>$5,$3,$2/;
s/([a-z]{3,5})\s+(\w+),(\w+),(\w+),ror#(\d+)/\U$1\E\t$4@>$5,$3,$2/;
s/([a-z]{3,5})\s+(\w+),(\w+),(\w+)/\U$1\E\t$4,$3,$2/;
s/([a-z]{3,5})\s+(\w+),(\w+),#(\w+)/\U$1\E\t\$$4,$3,$2/;
s/^\s+SUBS\s+/\tSUB.S\t/;
s/^\s+SUBEQ\s+/\tSUB.EQ\t/;
print $_;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment