티스토리 뷰

Language/C 언어

C언어와 어셈블리어 !!

데브훈96 2020. 3. 18. 00:10

안녕하세요, IT디자이너 입니다. 

 

이번 포스팅의 내용은 비쥬얼스튜디오에서 C언어와 어셈블리어의 관계에 대해서 직관적으로 설명드리도록 하겠습니다.

 


우리가 프로그래밍에 사용하는 언어 C/C++, JAVA, Python 등은 사람들이 이해하기 쉽고 접근하기 쉬운 high level의 언어라고 불립니다.  

 

그리고 CPU가 처리하는 기계어와 가장 근접한 low level 언어 중 하나는 바로 "어셈블리어"입니다.

 

아무리 low level 언어라고 하더라도 C/C++언어를 완벽하게 사용하기 위해서는 어셈블리어 해석능력은 꼭 알아두셔야됩니다. 

 

그 이유는 C/C++를 사용하여 개발하는 과정 중 상황에 따라서 언어에서는 발견할 수 없는 여러가지 버그들이 있습니다. 이러한 버그들을 해결하기 위해서는

디스어셈블리 출력 방법

 위 사진처럼 디스어셈블리를 선택하여 어셈블리어를 확인할 수 있습니다. 

 

이제부터 어셈블리어를 해석하는 방법에 대해서 간단히 설명하도록 하겠습니다. 우선 코드는 이렇습니다. 

 

void test(){

int a;
int b;
int c;

a = a+1;
b = b+1;
c = c+1;

}

int main(){

test();

}

그리고 코드를 설명드리기 앞서 여러분들에게 충격적인 사실을 하나 알려드리도록 하겠습니다. 

 

여러 사람들이 쓰레기 값의 생성으로 인해 C언어의 변수를 선언과 동시에 초기화하여야 한다는 이유이기 때문입니다. 

하지만 이것의 내용은 틀린 이야기입니다.!!!!!!

 

위 사진은 a=1;의 문단에서 브레이크 포인트를 잡고 디버깅 후 디스어셈블리 창을 연 사진입니다. 

 

오른쪽 디스어셈블리 창에서 하얀색의 텍스트는 C언어의 코드이며 회색으로 작성된 코드가 바로 어셈블리어로 해석된 부분입니다.

 

눈치가 빠른 사람들은 사진으로만 봐도 이미 짐작이 될것입니다. 바로 int a; 문단에서 어셈블리어로 해석된 부분이 없다는 것입니다. 즉, 우리가 작성된 a라는 변수는 사실 어셈블리어에서는 해석이 불가능합니다. 

 

즉, 선언 후 대입을 하거나 선언과 대입을 동시에 하여 초기화를 하거나 동일한 방법이라는 것입니다. !!!

 

그리고 a라는 변수에 숫자 1을 대입하는 과정에서 " mov dword ptr[a],1 " 라는 어셈블리어를 해석해보겠습니다. 

 

mov는 명령어 또는 op code라고 불립니다. 그리고 dword ptr[a]과 1은 operand로서 즉, 피연산자1과 피연산자2 입니다. 

 

mov는 피연산자2의 값을 피연산자1에 복사하는 연산자입니다. 즉 1의 값을 dword ptr[a]에 복사하는 것으로서 

변수 a에 대입연산이 이루어집니다. 

 

여기서 dword ptr는 4바이트 단위로 접근하겠다는 의미입니다. (스택은 기본적으로 4바이트 단위로 구성되어있는데 이부분은 다음 포스팅에 설명드리도록 하겠습니다.)

 

그리고 아까전에 설명에서 어셈블리어는 a라는 변수를 해석할수 없다고 하였는데 dword ptr[a]에서 a값이 있는것을 볼수 있을 것입니다.

이것은 사실 비쥬얼스튜디오에서 프로그래머가 조금 더 보기 편하라고 지원해주는 기능입니다. 원래는 dword ptr[(스택의 위치)] 가 오는 것이 맞습니다. ex) dword ptr [ebp-8]  

 


비쥬얼스튜디오에서 어셈블리어를 보는 방법에 대해서 간단하게 포스팅하였습니다. !!

 

감사합니다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함