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 중에는 빠진 것이 있을 수 있다.