asm 분석하기 #1

어셈블리어

2019. 12. 9. 22:15

반응형
#include <stdio.h>
int main()
{
printf("Hello World");
return 0;
}
.LC0:
.string "Hello World"
main:
push rbp
mov rbp, rsp
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
mov eax, 0
pop rbp
ret

string에 출력할 문자열인 "Hello World"가 저장되어있는 모습이다.

push rbp를 통해 공간을 만들고,

printf 함수를 호출하여 "Hello World"가 출력된다.

 

#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
printf("%d",n);
}
.LC0:
.string "%d"
main:
push rbp
mov rbp, rsp
sub rsp, 16
lea rax, [rbp-4]
mov rsi, rax
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call __isoc99_scanf
mov eax, DWORD PTR [rbp-4]
mov esi, eax
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
mov eax, 0
leave
ret

이번엔 정수 a를 선언하고, 정수를 입력받고, 입력받은 정수를 출력하는 코드이다.

lea rax, [rbp-4]를 통해 정수(4바이트)크기만큼 공간을 확보해주는 모습이다.

그런 후 scanf함수를 호출하여 정수를 입력받아주고,

eax에 입력받은 정수가 있는 위치인 rbp-4의 주소값을 넣어준다.

그리고 eax를 printf 함수를 호출하여 출력시켜준다.

 

이런 모습은 정수가 아닌 문자값을 넣어줘도 크기만 다를 뿐 행동은 같다.

반응형