Last active
August 29, 2015 14:08
-
-
Save chmullig/6c739acb0eb1405cba42 to your computer and use it in GitHub Desktop.
simple python script to recode gcc mips assembly output to use nice register names
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int countzeroes(int a) { | |
int i; | |
int count = 0; | |
for (i = 31; i >= 0; i--) { | |
int x = a << i; | |
if (x & 1) { | |
count++; | |
} | |
} | |
return count; | |
} | |
int main() { | |
countzeroes(31); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CC=mipsel-unknown-linux-gnu-gcc | |
CFLAGS=-Wall -static -fno-inline-small-functions -S | |
default: palindrome_nice.s palindrome_O1_nice.s palindrome_O2_nice.s palindrome_O3_nice.s palindrome_32r2_nice.s countzeroes_nice.s countzeroes_O1_nice.s countzeroes_O2_nice.s countzeroes_O3_nice.s countzeroes_32r2_nice.s | |
%_nice.s: %.s recode_gcc.py | |
python recode_gcc.py < $< > $@ | |
%.s: %.c | |
$(CC) $(CFLAGS) $< | |
%_O1.s: %.c | |
$(CC) $(CFLAGS) -O1 $< -o $@ | |
%_O2.s: %.c | |
$(CC) $(CFLAGS) -O2 $< -o $@ | |
%_O3.s: %.c | |
$(CC) $(CFLAGS) -O3 $< -o $@ | |
%_32r2.s: %.c | |
$(CC) $(CFLAGS) -mips32r2 -mtune=mips32r2 $< -o $@ | |
.PHONY: clean all default | |
clean: | |
rm -f *.s | |
all: clean default | |
#.PRECIOUS: %.s |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int ispalindrome(char *s) { | |
char *p = s; | |
while (p++) | |
; | |
p--; | |
while (*s++ == *p--) | |
; | |
return p == s; | |
} | |
int main() { | |
ispalindrome("Hello"); | |
ispalindrome("HellolleH"); | |
ispalindrome("HelllleH"); | |
ispalindrome("Helllleh"); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
*** palindrome_nice.s 2014-11-05 18:06:37.649122999 -0500 | |
--- palindrome_32r2_nice.s 2014-11-05 18:06:37.781122999 -0500 | |
*************** | |
*** 20,63 **** | |
addiu $sp,$sp,-24 | |
sw $fp,20($sp) | |
move $fp,$sp | |
sw $a0,24($fp) | |
lw $v0,24($fp) | |
- nop | |
sw $v0,8($fp) | |
nop | |
$L2: | |
lw $v0,8($fp) | |
- nop | |
addiu $v1,$v0,1 | |
sw $v1,8($fp) | |
bne $v0,$zero,$L2 | |
nop | |
lw $v0,8($fp) | |
- nop | |
addiu $v0,$v0,-1 | |
sw $v0,8($fp) | |
nop | |
$L3: | |
lw $v0,24($fp) | |
- nop | |
addiu $v1,$v0,1 | |
sw $v1,24($fp) | |
lb $v1,0($v0) | |
lw $v0,8($fp) | |
- nop | |
addiu $a0,$v0,-1 | |
sw $a0,8($fp) | |
lb $v0,0($v0) | |
- nop | |
beq $v1,$v0,$L3 | |
nop | |
lw $v1,8($fp) | |
lw $v0,24($fp) | |
- nop | |
xor $v0,$v1,$v0 | |
sltu $v0,$v0,1 | |
andi $v0,$v0,0x00ff | |
move $sp,$fp | |
lw $fp,20($sp) | |
--- 20,56 ---- |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.file 1 "palindrome.c" | |
.section .mdebug.abi32 | |
.previous | |
.nan legacy | |
.gnu_attribute 4, 1 | |
.abicalls | |
.text | |
.align 2 | |
.globl ispalindrome | |
.set nomips16 | |
.set nomicromips | |
.ent ispalindrome | |
.type ispalindrome, @function | |
ispalindrome: | |
.frame $fp,24,$ra # vars= 8, regs= 1/0, args= 0, gp= 8 | |
.mask 0x40000000,-4 | |
.fmask 0x00000000,0 | |
.set noreorder | |
.set nomacro | |
addiu $sp,$sp,-24 | |
sw $fp,20($sp) | |
move $fp,$sp | |
sw $a0,24($fp) | |
lw $v0,24($fp) | |
sw $v0,8($fp) | |
nop | |
$L2: | |
lw $v0,8($fp) | |
addiu $v1,$v0,1 | |
sw $v1,8($fp) | |
bne $v0,$zero,$L2 | |
nop | |
lw $v0,8($fp) | |
addiu $v0,$v0,-1 | |
sw $v0,8($fp) | |
nop | |
$L3: | |
lw $v0,24($fp) | |
addiu $v1,$v0,1 | |
sw $v1,24($fp) | |
lb $v1,0($v0) | |
lw $v0,8($fp) | |
addiu $a0,$v0,-1 | |
sw $a0,8($fp) | |
lb $v0,0($v0) | |
beq $v1,$v0,$L3 | |
nop | |
lw $v1,8($fp) | |
lw $v0,24($fp) | |
xor $v0,$v1,$v0 | |
sltu $v0,$v0,1 | |
andi $v0,$v0,0x00ff | |
move $sp,$fp | |
lw $fp,20($sp) | |
addiu $sp,$sp,24 | |
j $ra | |
nop | |
.set macro | |
.set reorder | |
.end ispalindrome | |
.size ispalindrome, .-ispalindrome | |
.rdata | |
.align 2 | |
$LC0: | |
.ascii "Hello\000" | |
.align 2 | |
$LC1: | |
.ascii "HellolleH\000" | |
.align 2 | |
$LC2: | |
.ascii "HelllleH\000" | |
.align 2 | |
$LC3: | |
.ascii "Helllleh\000" | |
.text | |
.align 2 | |
.globl main | |
.set nomips16 | |
.set nomicromips | |
.ent main | |
.type main, @function | |
main: | |
.frame $fp,32,$ra # vars= 0, regs= 2/0, args= 16, gp= 8 | |
.mask 0xc0000000,-4 | |
.fmask 0x00000000,0 | |
.set noreorder | |
.set nomacro | |
addiu $sp,$sp,-32 | |
sw $ra,28($sp) | |
sw $fp,24($sp) | |
move $fp,$sp | |
lui $v0,%hi($LC0) | |
addiu $a0,$v0,%lo($LC0) | |
.option pic0 | |
jal ispalindrome | |
nop | |
.option pic2 | |
lui $v0,%hi($LC1) | |
addiu $a0,$v0,%lo($LC1) | |
.option pic0 | |
jal ispalindrome | |
nop | |
.option pic2 | |
lui $v0,%hi($LC2) | |
addiu $a0,$v0,%lo($LC2) | |
.option pic0 | |
jal ispalindrome | |
nop | |
.option pic2 | |
lui $v0,%hi($LC3) | |
addiu $a0,$v0,%lo($LC3) | |
.option pic0 | |
jal ispalindrome | |
nop | |
.option pic2 | |
move $sp,$fp | |
lw $ra,28($sp) | |
lw $fp,24($sp) | |
addiu $sp,$sp,32 | |
j $ra | |
nop | |
.set macro | |
.set reorder | |
.end main | |
.size main, .-main | |
.ident "GCC: (GNU) 4.9.1" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.file 1 "palindrome.c" | |
.section .mdebug.abi32 | |
.previous | |
.nan legacy | |
.gnu_attribute 4, 1 | |
.abicalls | |
.text | |
.align 2 | |
.globl ispalindrome | |
.set nomips16 | |
.set nomicromips | |
.ent ispalindrome | |
.type ispalindrome, @function | |
ispalindrome: | |
.frame $fp,24,$ra # vars= 8, regs= 1/0, args= 0, gp= 8 | |
.mask 0x40000000,-4 | |
.fmask 0x00000000,0 | |
.set noreorder | |
.set nomacro | |
addiu $sp,$sp,-24 | |
sw $fp,20($sp) | |
move $fp,$sp | |
sw $a0,24($fp) | |
lw $v0,24($fp) | |
nop | |
sw $v0,8($fp) | |
nop | |
$L2: | |
lw $v0,8($fp) | |
nop | |
addiu $v1,$v0,1 | |
sw $v1,8($fp) | |
bne $v0,$zero,$L2 | |
nop | |
lw $v0,8($fp) | |
nop | |
addiu $v0,$v0,-1 | |
sw $v0,8($fp) | |
nop | |
$L3: | |
lw $v0,24($fp) | |
nop | |
addiu $v1,$v0,1 | |
sw $v1,24($fp) | |
lb $v1,0($v0) | |
lw $v0,8($fp) | |
nop | |
addiu $a0,$v0,-1 | |
sw $a0,8($fp) | |
lb $v0,0($v0) | |
nop | |
beq $v1,$v0,$L3 | |
nop | |
lw $v1,8($fp) | |
lw $v0,24($fp) | |
nop | |
xor $v0,$v1,$v0 | |
sltu $v0,$v0,1 | |
andi $v0,$v0,0x00ff | |
move $sp,$fp | |
lw $fp,20($sp) | |
addiu $sp,$sp,24 | |
j $ra | |
nop | |
.set macro | |
.set reorder | |
.end ispalindrome | |
.size ispalindrome, .-ispalindrome | |
.rdata | |
.align 2 | |
$LC0: | |
.ascii "Hello\000" | |
.align 2 | |
$LC1: | |
.ascii "HellolleH\000" | |
.align 2 | |
$LC2: | |
.ascii "HelllleH\000" | |
.align 2 | |
$LC3: | |
.ascii "Helllleh\000" | |
.text | |
.align 2 | |
.globl main | |
.set nomips16 | |
.set nomicromips | |
.ent main | |
.type main, @function | |
main: | |
.frame $fp,32,$ra # vars= 0, regs= 2/0, args= 16, gp= 8 | |
.mask 0xc0000000,-4 | |
.fmask 0x00000000,0 | |
.set noreorder | |
.set nomacro | |
addiu $sp,$sp,-32 | |
sw $ra,28($sp) | |
sw $fp,24($sp) | |
move $fp,$sp | |
lui $v0,%hi($LC0) | |
addiu $a0,$v0,%lo($LC0) | |
.option pic0 | |
jal ispalindrome | |
nop | |
.option pic2 | |
lui $v0,%hi($LC1) | |
addiu $a0,$v0,%lo($LC1) | |
.option pic0 | |
jal ispalindrome | |
nop | |
.option pic2 | |
lui $v0,%hi($LC2) | |
addiu $a0,$v0,%lo($LC2) | |
.option pic0 | |
jal ispalindrome | |
nop | |
.option pic2 | |
lui $v0,%hi($LC3) | |
addiu $a0,$v0,%lo($LC3) | |
.option pic0 | |
jal ispalindrome | |
nop | |
.option pic2 | |
move $sp,$fp | |
lw $ra,28($sp) | |
lw $fp,24($sp) | |
addiu $sp,$sp,32 | |
j $ra | |
nop | |
.set macro | |
.set reorder | |
.end main | |
.size main, .-main | |
.ident "GCC: (GNU) 4.9.1" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.file 1 "palindrome.c" | |
.section .mdebug.abi32 | |
.previous | |
.nan legacy | |
.gnu_attribute 4, 1 | |
.abicalls | |
.text | |
.align 2 | |
.globl ispalindrome | |
.set nomips16 | |
.set nomicromips | |
.ent ispalindrome | |
.type ispalindrome, @function | |
ispalindrome: | |
.frame $sp,0,$ra # vars= 0, regs= 0/0, args= 0, gp= 0 | |
.mask 0x00000000,0 | |
.fmask 0x00000000,0 | |
.set noreorder | |
.set nomacro | |
move $v0,$zero | |
addiu $a0,$a0,1 | |
$L4: | |
addiu $v0,$v0,-1 | |
lb $a1,-1($a0) | |
lb $v1,1($v0) | |
nop | |
beq $a1,$v1,$L4 | |
addiu $a0,$a0,1 | |
addiu $a0,$a0,-1 | |
xor $v0,$v0,$a0 | |
j $ra | |
sltu $v0,$v0,1 | |
.set macro | |
.set reorder | |
.end ispalindrome | |
.size ispalindrome, .-ispalindrome | |
.section .rodata.str1.4,"aMS",@progbits,1 | |
.align 2 | |
$LC0: | |
.ascii "Hello\000" | |
.align 2 | |
$LC1: | |
.ascii "HellolleH\000" | |
.align 2 | |
$LC2: | |
.ascii "HelllleH\000" | |
.align 2 | |
$LC3: | |
.ascii "Helllleh\000" | |
.text | |
.align 2 | |
.globl main | |
.set nomips16 | |
.set nomicromips | |
.ent main | |
.type main, @function | |
main: | |
.frame $sp,32,$ra # vars= 0, regs= 1/0, args= 16, gp= 8 | |
.mask 0x80000000,-4 | |
.fmask 0x00000000,0 | |
.set noreorder | |
.set nomacro | |
addiu $sp,$sp,-32 | |
sw $ra,28($sp) | |
lui $a0,%hi($LC0) | |
addiu $a0,$a0,%lo($LC0) | |
.option pic0 | |
jal ispalindrome | |
nop | |
.option pic2 | |
lui $a0,%hi($LC1) | |
addiu $a0,$a0,%lo($LC1) | |
.option pic0 | |
jal ispalindrome | |
nop | |
.option pic2 | |
lui $a0,%hi($LC2) | |
addiu $a0,$a0,%lo($LC2) | |
.option pic0 | |
jal ispalindrome | |
nop | |
.option pic2 | |
lui $a0,%hi($LC3) | |
addiu $a0,$a0,%lo($LC3) | |
.option pic0 | |
jal ispalindrome | |
nop | |
.option pic2 | |
lw $ra,28($sp) | |
nop | |
j $ra | |
addiu $sp,$sp,32 | |
.set macro | |
.set reorder | |
.end main | |
.size main, .-main | |
.ident "GCC: (GNU) 4.9.1" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.file 1 "palindrome.c" | |
.section .mdebug.abi32 | |
.previous | |
.nan legacy | |
.gnu_attribute 4, 1 | |
.abicalls | |
.text | |
.align 2 | |
.globl ispalindrome | |
.set nomips16 | |
.set nomicromips | |
.ent ispalindrome | |
.type ispalindrome, @function | |
ispalindrome: | |
.frame $sp,0,$ra # vars= 0, regs= 0/0, args= 0, gp= 0 | |
.mask 0x00000000,0 | |
.fmask 0x00000000,0 | |
.set noreorder | |
.set nomacro | |
move $v0,$a0 | |
addiu $a0,$a0,1 | |
$L5: | |
addiu $v0,$v0,-1 | |
lb $a1,-1($a0) | |
lb $v1,1($v0) | |
nop | |
beq $a1,$v1,$L5 | |
addiu $a0,$a0,1 | |
addiu $a0,$a0,-1 | |
xor $v0,$v0,$a0 | |
j $ra | |
sltu $v0,$v0,1 | |
.set macro | |
.set reorder | |
.end ispalindrome | |
.size ispalindrome, .-ispalindrome | |
.section .rodata.str1.4,"aMS",@progbits,1 | |
.align 2 | |
$LC0: | |
.ascii "Hello\000" | |
.align 2 | |
$LC1: | |
.ascii "HellolleH\000" | |
.align 2 | |
$LC2: | |
.ascii "HelllleH\000" | |
.align 2 | |
$LC3: | |
.ascii "Helllleh\000" | |
.section .text.startup,"ax",@progbits | |
.align 2 | |
.globl main | |
.set nomips16 | |
.set nomicromips | |
.ent main | |
.type main, @function | |
main: | |
.frame $sp,32,$ra # vars= 0, regs= 1/0, args= 16, gp= 8 | |
.mask 0x80000000,-4 | |
.fmask 0x00000000,0 | |
.set noreorder | |
.set nomacro | |
lui $a0,%hi($LC0) | |
addiu $sp,$sp,-32 | |
sw $ra,28($sp) | |
.option pic0 | |
jal ispalindrome | |
.option pic2 | |
addiu $a0,$a0,%lo($LC0) | |
lui $a0,%hi($LC1) | |
.option pic0 | |
jal ispalindrome | |
.option pic2 | |
addiu $a0,$a0,%lo($LC1) | |
lui $a0,%hi($LC2) | |
.option pic0 | |
jal ispalindrome | |
.option pic2 | |
addiu $a0,$a0,%lo($LC2) | |
lw $ra,28($sp) | |
lui $a0,%hi($LC3) | |
addiu $a0,$a0,%lo($LC3) | |
.option pic0 | |
j ispalindrome | |
.option pic2 | |
addiu $sp,$sp,32 | |
.set macro | |
.set reorder | |
.end main | |
.size main, .-main | |
.ident "GCC: (GNU) 4.9.1" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.file 1 "palindrome.c" | |
.section .mdebug.abi32 | |
.previous | |
.nan legacy | |
.gnu_attribute 4, 1 | |
.abicalls | |
.text | |
.align 2 | |
.globl ispalindrome | |
.set nomips16 | |
.set nomicromips | |
.ent ispalindrome | |
.type ispalindrome, @function | |
ispalindrome: | |
.frame $sp,0,$ra # vars= 0, regs= 0/0, args= 0, gp= 0 | |
.mask 0x00000000,0 | |
.fmask 0x00000000,0 | |
.set noreorder | |
.set nomacro | |
move $v0,$a0 | |
addiu $a0,$a0,1 | |
$L5: | |
addiu $v0,$v0,-1 | |
lb $a1,-1($a0) | |
lb $v1,1($v0) | |
nop | |
beq $a1,$v1,$L5 | |
addiu $a0,$a0,1 | |
addiu $a0,$a0,-1 | |
xor $v0,$v0,$a0 | |
j $ra | |
sltu $v0,$v0,1 | |
.set macro | |
.set reorder | |
.end ispalindrome | |
.size ispalindrome, .-ispalindrome | |
.section .rodata.str1.4,"aMS",@progbits,1 | |
.align 2 | |
$LC0: | |
.ascii "Hello\000" | |
.align 2 | |
$LC1: | |
.ascii "HellolleH\000" | |
.align 2 | |
$LC2: | |
.ascii "HelllleH\000" | |
.align 2 | |
$LC3: | |
.ascii "Helllleh\000" | |
.section .text.startup,"ax",@progbits | |
.align 2 | |
.globl main | |
.set nomips16 | |
.set nomicromips | |
.ent main | |
.type main, @function | |
main: | |
.frame $sp,32,$ra # vars= 0, regs= 1/0, args= 16, gp= 8 | |
.mask 0x80000000,-4 | |
.fmask 0x00000000,0 | |
.set noreorder | |
.set nomacro | |
lui $a0,%hi($LC0) | |
addiu $sp,$sp,-32 | |
sw $ra,28($sp) | |
.option pic0 | |
jal ispalindrome | |
.option pic2 | |
addiu $a0,$a0,%lo($LC0) | |
lui $a0,%hi($LC1) | |
.option pic0 | |
jal ispalindrome | |
.option pic2 | |
addiu $a0,$a0,%lo($LC1) | |
lui $a0,%hi($LC2) | |
.option pic0 | |
jal ispalindrome | |
.option pic2 | |
addiu $a0,$a0,%lo($LC2) | |
lw $ra,28($sp) | |
lui $a0,%hi($LC3) | |
addiu $a0,$a0,%lo($LC3) | |
.option pic0 | |
j ispalindrome | |
.option pic2 | |
addiu $sp,$sp,32 | |
.set macro | |
.set reorder | |
.end main | |
.size main, .-main | |
.ident "GCC: (GNU) 4.9.1" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
import sys | |
recodes = { | |
"0" : "zero", | |
"1" : "at", | |
"2" : "v0", | |
"3" : "v1", | |
"4" : "a0", | |
"5" : "a1", | |
"6" : "a2", | |
"7" : "a3", | |
"8" : "t0", | |
"9" : "t1", | |
"10" : "t2", | |
"11" : "t3", | |
"12" : "t4", | |
"13" : "t5", | |
"14" : "t6", | |
"15" : "t7", | |
"16" : "s0", | |
"17" : "s1", | |
"18" : "s2", | |
"19" : "s3", | |
"20" : "s4", | |
"21" : "s5", | |
"22" : "s6", | |
"23" : "s7", | |
"24" : "t8", | |
"25" : "t9", | |
"26" : "k0", | |
"27" : "k1", | |
"28" : "gp", | |
"29" : "sp", | |
"30" : "s8", | |
"31" : "ra"} | |
def recode(matchobj): | |
orig = matchobj.group(0) | |
try: | |
repl = "$"+recodes[orig[1:]] | |
except KeyError: | |
repl = orig | |
return repl | |
registerre = re.compile(r"\$(\d+)(?=\D|$)") | |
for line in sys.stdin.read().splitlines(): | |
print re.sub(registerre, recode, line) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment