example0.asm
필요한 추가 정보
.file "example1.c" # 디버거에서 사용하는 원본 파일 이름을 가리킴
(Intel 문법이 아니기 때문에 오른쪽 값을 왼쪽으로 넣음!!)
.section .rodata # ./rodatd 섹션 정의, 이 섹션은 읽기 전용 데이터 변수
.text # text section. 코드들을장한 섹션/프로그램 코드 실행할 때 사용
.globl main # 전 코드에 걸쳐 접근 가능한 함수
.type main, @function # main 함수 정의. 이것을 해야만 global main 코드 얻을 수 있음
main: # main:~ret까지가 실제 코드
.LFB0: # 함수의 시작을 의미하는 'local label'
.cfi_startproc # 'call froam information'.
어셈블러에게 dwarf format 디버깅 information을 지시
.cfi_endproc # 함수 끝
.size main, .-main # size 인스트럭션은 메인 함수의 크기를 세팅함
.-main은 오브젝트 파일에 쓰여질 main 함수의 정확한 크기를 가지고 있음
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
# ident 인스트럭션은 어떤 컴파일러를 사용해서 컴파일하고 실행하였는지에 대한 정보 문자열"~"을
오브젝트 파일에 저장하기 위한 instruction
(ex) Hello World 프로그램 : 오브젝트 파일)
example1.asm
변환 전
.file "example1.c"
.section .rodata
.LC0:
.string "Hello world"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
.section .note.GNU-stack,"",@progbits
변환 후
#include <stdio.h> int main() {
printf("Hello world");
return 0;
}
example2.asm
변환 전
.file "example2.c"
.section .rodata
.LC0:
.string "result : %d \n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $10, -12(%rbp)
movl $20, -8(%rbp)
movl -8(%rbp), %eax
movl -12(%rbp), %edx
addl %edx, %eax
movl %eax, -4(%rbp)
movl -8(%rbp), %eax
movl -12(%rbp), %edx
addl %edx, %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
.section .note.GNU-stack,"",@progbits
변환 후
#include <stdio.h>
int main(void){
int a = 10;
int b = 20;
int c = a + b;
printf("result : %d \n", a + b);
return 0;
}
example3.asm
변환 전
.file "example3.c"
.section .rodata
.LC0:
.string "a is 10"
.LC1:
.string "b is 10"
.LC2:
.string "b is 20"
.LC3:
.string "a=b"
.LC4:
.string "a!=b"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $10, -8(%rbp)
movl $20, -4(%rbp)
cmpl $10, -8(%rbp)
jne .L2
movl $.LC0, %edi
call puts
.L2:
cmpl $10, -4(%rbp)
jne .L3
movl $.LC1, %edi
call puts
jmp .L4
.L3:
cmpl $20, -4(%rbp)
jne .L4
movl $.LC2, %edi
call puts
.L4:
movl -8(%rbp), %eax
cmpl -4(%rbp), %eax
jne .L5
movl $.LC3, %edi
call puts
jmp .L6
.L5:
movl $.LC4, %edi
call puts
.L6:
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
.section .note.GNU-stack,"",@progbits
변환 후
#include <stdio.h>
int main(){
int a = 10;
int b = 20;
if (a == 10)
puts("a is 10");
if (b == 10)
puts("b is 10");
else if (b == 20)
puts("b is 20");
if (a == b)
puts("a=b");
else puts("a!=b");
return 0;
}
example4.asm
변환 전
.file "example4.c"
.section .rodata
.LC0:
.string "result : %d\n"
.text
.globl function
.type function, @function
function:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl %edi, -4(%rbp)
movl %esi, -8(%rbp)
movl -4(%rbp), %eax
imull -8(%rbp), %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size function, .-function
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $50, -8(%rbp)
movl $60, -4(%rbp)
movl -4(%rbp), %edx
movl -8(%rbp), %eax
movl %edx, %esi
movl %eax, %edi
call function
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
.section .note.GNU-stack,"",@progbits
변환 후
#include <stdio.h>
int function(int a, int b) {
printf("result : %d\n", a*b);
return 0;
}
int main() {
int a = 50, b = 60;
function(a, b);
return 0;
}
example5.asm
변환 전
.file "example5.c"
.section .rodata
.LC0:
.string "number %d \n"
.LC1:
.string "%d * %d = %d \n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0, -8(%rbp)
jmp .L2
.L3:
movl -8(%rbp), %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
addl $1, -8(%rbp)
.L2:
cmpl $9, -8(%rbp)
jle .L3
movl $0, -4(%rbp)
jmp .L4
.L5:
movl -8(%rbp), %eax
imull -4(%rbp), %eax
movl %eax, %ecx
movl -4(%rbp), %edx
movl -8(%rbp), %eax
movl %eax, %esi
movl $.LC1, %edi
movl $0, %eax
call printf
addl $1, -4(%rbp)
.L4:
cmpl $4, -4(%rbp)
jle .L5
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
.section .note.GNU-stack,"",@progbits
변환 후
#include <stdio.h>
int main() {
int a = 0, b;
while (a != 10) {
printf("number %d \n", a);
a++;
}
for (b = 0; b <= 4; b++) {
printf("%d * %d = %d \n", a, b, a * b);
}
return 0;
}