티스토리 뷰
안녕하세요, 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]
비쥬얼스튜디오에서 어셈블리어를 보는 방법에 대해서 간단하게 포스팅하였습니다. !!
감사합니다.
'Language > C 언어' 카테고리의 다른 글
Debug 모드와 Release 모드 디버깅 ( 2 ) (0) | 2020.03.19 |
---|---|
Debug 모드와 Release 모드 디버깅 (0) | 2020.03.18 |
C언어의 꽃 "포인터" !! 포인터와 배열 그리고 함수 - 3 (0) | 2020.02.09 |
C언어의 꽃 "포인터" !! 배열과 포인터의 관계 - 2 (0) | 2020.02.09 |
C언어의 꽃 "포인터" !! - 1 (0) | 2020.02.09 |
- Total
- Today
- Yesterday
- C언어 #C++ #어셈블리어 #구조체 #구조체 특징 #IT디자이너
- IT디자이너 #C언어 #C++ #속성지정자 #기억클래스 #IT #const #static #register #volatile #extern #auto #s
- C언어 #C++ #IT디자이너 #함수 #재귀 함수 #스택 #자료구조 #페인팅
- C언어 #C++ #IT디자이너 #C++ 함수
- 디버그 #Debug #Release #디버그와 릴리즈 차이 #C언어 #C++언어 #어셈블리어
- C언어 #포인터 #IT디자이너
- QUEUE #큐 #자료구조 #원형 큐 #Circle Queue #IT디자이너 #큐 과제 #C언어 #C++언어
- C언어 #C++ #삼각함수 #IT디자이너 #문제풀이 #2진수 #16진수 #비트 #bit #비트연산자
- C언어 #C++ #파일 입출력 #텍스트파일 #IT디자이너
- C언어 #포인터 #배열 포인터 #포인터 배열 #함수
- C언어 #C++ #switch #if #어셈블리어 #switch문 사용 이유 #IT디자이너
- C언어 #C++ #어셈블리어 #함수 호출 규약 #IT디자이너 #비쥬얼 스튜디오 #IT
- IT디자이너 #C언어 #C++ #IT디자이너 #코딩테스트
- IT디자이너 #QuickSort #퀵정렬 #C언어 #C++ #자료구조 #알고리즘
- C언어 #IT디자이너 #포인터 #배열 #포인터와 배열
- C언어 #C++ #어셈블리어 #재귀함수 #IT디자이너
- C언어 #IT디자이너
- C언어 #C++ #IT디자이너
- C언어 #C++ #어셈블리어 #열거형 데이터타입 #IT디자이너
- C언어 #C++ #구조체 정렬 #pragma #IT디자이너
- C언어 #C++ #어셈블리어 #IT디자이너 #비트연산자 #연산자 #C언어의 비트 연산자
- C언어 #자료구조 #C++ #연결리스트 #리스트 #알고리즘 #IT디자이너
- C언어 #C++ #시간 함수 #타이밍 맞추기 #timer interrupt #IT디자이너
- C언어 #스트림 #버퍼링 #표준 입출력 함수 #C++언어 #IT디자이너
- Debug #C언어 #C++ #비쥬얼스튜디오 #Release #IT
- C언어 #C++ #캐시hit #캐시라인 #캐시무효화
- C언어 #IT디자이너 #C++언어
- C언어 #C++ #자료구조 #알고리즘 #IT디자이너 #버블 정렬 #BubbleSort
- 어셈블리어 #IT디자이너 #C언어 #C++언어 #어셈블리 #어셈블러
- 스택 #자료구조 #Stack #IT디자이너 #알고리즘 #C언어 #스택 과제 #C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |