Skip to content

Instantly share code, notes, and snippets.

@ncw
Created June 12, 2017 20:56

Revisions

  1. ncw created this gist Jun 12, 2017.
    45 changes: 45 additions & 0 deletions armtogo.pl
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,45 @@
    #!/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 $_;
    }