본 글은 코드누리의 Windows Programming 강좌를 개인 학습 목적으로 정리한 글 입니다.
ecourse 온라인 강의 – S/W 교육의 새로운 시도
개강 예정 과정입니다. {"title":"\uac1c\uac15 \uc608\uc815 \uacfc\uc815\uc785\ub2c8\ub2e4.","show_title":"1","post_type":"course","taxonomy":"course-cat","term":"COMMINGSOON","post_ids":"","course_style":"popular","featured_style":"course","masonry
www.ecourse.co.kr
목차
- C언어에서의 함수 호출
- 정말 EAX에 저장될까?
- 함수 호출 과정도 인라인 어셈블리로 작성 해보자.
먼저! "인라인" 이란 무엇을 의미하나요?
이해를 돕기 위해 인라인 함수에 대해 설명하자면, 인라인 함수는 실제 호출된 곳에서 함수 코드를 호출한 곳에 삽입하도록 컴파일러에 지시하는 것이고, 이러한 함수를 "인라인 함수"라고 한다.
※ 인라인의 이점은 "함수 호출 오버헤드"를 줄이는 것!
- 인라인 어셈블리는 인라인 함수로 작성된 "어셈블리 명령어 세트"라고 볼 수 있다.
1. C언어에서 함수 호출
1-1. 스택에 인자를 넣고 함수로 이동한다.
1-2. EAX 레지스터로 반환값을 전달한다.
2. 정말 EAX에 저장될까?
2-1. C언어에서 어셈블리 코드를 사용할 수 있는데 __asm 키워드를 써야 한다. (인라인 어셈블리라고 한다)
2-2. 어셈블리 코드를 사용하면 레지스터에 접근할 수 있다.
주의! 32bit에서만 인라인 어셈블리를 사용할 수 있다.
VS 인라인 어셈블리의 장점 중 하나는 C언어에서 사용하던 변수를 바로 사용할 수 있다.
- GCC는 안됨
// 그렇다면 인라인 어셈블리를 사용하여 EAX에 결과값을 받아보자.
3. 함수 호출 과정도 인라인 어셈블리로 작성 해보자.
- run-time check failure #0 - the value of esp was not properly
맨 첫 줄에 보이는 문장은 런타임 검사가 실패했고, esp값이 제대로 저장되지 않았다고 한다.
함수 호출 시 함수에서 사용했던 메모리를 정리해줘야 하는데 그걸 이행하지 않아서 발생한 문제라고 생각된다.
이것은 함수 호출 규약과 관련이 있는데 이후 강좌에서 이야기할 듯 하다.
'운영체제 > [ecourse] Windows Programming' 카테고리의 다른 글
1-5. C++과 MASM (0) | 2022.09.05 |
---|---|
1-4. Stack Frame (0) | 2022.09.04 |
1-3. Calling Convention (0) | 2022.09.03 |
1-2. MASM 기본 문법 (0) | 2022.09.01 |
1-1-2. 어셈블리 빌드 방법 (0) | 2022.09.01 |
댓글