Programming

x86 assembly code의 register를 설명으로 바꿔주는 스크립트

x86 assembly code를 읽어야 하는 경우가 가끔 있는데, operator는 그렇다 쳐도 수많은 register는 외우기가 쉽지 않아서 아예 스크립트로 작성한 적이 있다. 소스 코드를 정리하다가 발견하여 혹시나 공유할 수 있을 꺼리가 되지 않을까 싶어 포스팅해본다.

아래 내용을 annotate_asm.pl이라는 이름으로 저장한다.
annotate_asm.pl

#!/usr/bin/env perl

while (<>) {
s/%ax/\[return value 16\]/g;
s/%bx/\[callee saved 16\]/g;
s/%cx/\[4th arg 16\]/g;
s/%dx/\[3rd arg 16\]/g;
s/%si/\[2nd arg 16\]/g;
s/%di/\[1st arg 16\]/g;
s/%bp/\[callee saved 16\]/g;
s/%sp/\[stack pointer 16\]/g;
s/%r8w/\[5th arg 16\]/g;
s/%r9w/\[6th arg 16\]/g;
s/%r10w/\[callee saved 16\]/g;
s/%r11w/\[used for linking 16\]/g;
s/%r12w/\[callee saved 16\]/g;
s/%r13w/\[callee saved 16\]/g;
s/%r14w/\[callee saved 16\]/g;
s/%r15w/\[callee saved 16\]/g;
s/%eax/\[return value 32\]/g;
s/%ebx/\[callee saved 32\]/g;
s/%ecx/\[4th arg 32\]/g;
s/%edx/\[3rd arg 32\]/g;
s/%esi/\[2nd arg 32\]/g;
s/%edi/\[1st arg 32\]/g;
s/%ebp/\[callee saved 32\]/g;
s/%esp/\[stack pointer 32\]/g;
s/%r8d/\[5th arg 32\]/g;
s/%r9d/\[6th arg 32\]/g;
s/%r10d/\[callee saved 32\]/g;
s/%r11d/\[used for linking 32\]/g;
s/%r12d/\[callee saved 32\]/g;
s/%r13d/\[callee saved 32\]/g;
s/%r14d/\[callee saved 32\]/g;
s/%r15d/\[callee saved 32\]/g;
s/%rax/\[return value 64\]/g;
s/%rbx/\[callee saved 64\]/g;
s/%rcx/\[4th arg 64\]/g;
s/%rdx/\[3rd arg 64\]/g;
s/%rsi/\[2nd arg 64\]/g;
s/%rdi/\[1st arg 64\]/g;
s/%rbp/\[callee saved 64\]/g;
s/%rsp/\[stack pointer 64\]/g;
s/%r8/\[5th arg 64\]/g;
s/%r9/\[6th arg 64\]/g;
s/%r10/\[callee saved 64\]/g;
s/%r11/\[used for linking 64\]/g;
s/%r12/\[callee saved 64\]/g;
s/%r13/\[callee saved 64\]/g;
s/%r14/\[callee saved 64\]/g;
s/%r15/\[callee saved 64\]/g;
print;
}

사용법은 다음과 같다.

$ gcc -S -o test.s test.c
$ ./annotate_asm.pl test.s

설명의 모양은 짐작대로 다음과 같다.

	.file	"test.c"
.text
.globl main
.type	main, @function
main:
leal	4([stack pointer 32]), [4th arg 32]
andl	$-16, [stack pointer 32]
pushl	-4([4th arg 32])
pushl	[callee saved 32]
movl	[stack pointer 32], [callee saved 32]
pushl	[4th arg 32]
subl	$404, [stack pointer 32]
addl	$404, [stack pointer 32]
popl	[4th arg 32]
popl	[callee saved 32]
leal	-4([4th arg 32]), [stack pointer 32]
ret
.size	main, .-main
.ident	"GCC: (Ubuntu 4.3.2-1ubuntu12) 4.3.2"
.section	.note.GNU-stack,"",@progbits

다만, 위에 정리된 register 중에는 빠진 것이 있을 수 있다.

답글 남기기