struct 반환에 대한 고찰
함수의 반환에 대한 고찰 오늘은 함수 반환에 대해 간단하게 알아보고자 한다. * 컴파일 옵션은 다음과 같다 gcc -o Main Main.c -O0 보통 함수에서 값을 반환하게 되면, eax(32bits), rax(64bits) 레지스터를 사용하게 된다. 그리하여 th
함수의 반환에 대한 고찰 오늘은 함수 반환에 대해 간단하게 알아보고자 한다. * 컴파일 옵션은 다음과 같다 gcc -o Main Main.c -O0 보통 함수에서 값을 반환하게 되면, eax(32bits), rax(64bits) 레지스터를 사용하게 된다. 그리하여 th
오늘은 함수 반환에 대해 간단하게 알아보고자 한다. * 컴파일 옵션은 다음과 같다 보통 함수에서 값을 반환하게 되면, eax(32bits), rax(64bits) 레지스터를 사용하게 된다. 그리하여 main에서 int를 반환할때도 eax나 rax에 exit_code를
들어가기 앞서 - 해당 글은 GCC와 C파일을 기준으로 작성되었습니다. 컴파일러마다 다를 수도 있습니다. 기본적으로 어셈을 배울 때 종료 시에 eax 또는 rax를 0으로 초기화한 후 ret을 해주는 과정을 볼 수 있다 C언어에서 main에서 return 0;을 사용하
먼저 GCC의 최적화 방식을 알아보자. GCC는 상수가 들어왔을 때 해당 값에 따라서 비교하는 명령어(어셈에선 cmp)를 생성하지 않는다. 즉, 다음과 같은 식에서 GCC는 cmp와 je(jump)를 생성하지 않고 바로 내부 코드를 생성한다 이 방식은 연산자가 존재할
0은 false고 나머지를 true로 받는 이유는 C 컴파일러 마음대로 이기 때문이다. 역어셈을 해보면 int -> bool하는 과정은 그저 cmp 하나로 작성되어 있음을 알 수 있다 cmp 변수 0x0 (cmp는 compare) 실제로 다음 코드를 역어셈 해보면 재밌
1. for문에서 조건식에 아무것도 안넣으면 무한으로 돌아가는 이유는 역어셈 했을때를 보면 알 수 있다 for에 모든 부분에 (코드블록 내부 포함) 아무 코드도 존재하지 않으면 jmp를 통해서 자기 자신으로 무한 점프를 시도한다 그러나 다른 부분이 하나라도 존재한다면