🗿Assembly/코드비교및 분석

for루프문 [ vs2019 inline assembly ]

Mawile 2021. 5. 12.
728x90

 

개발환경 >> Visual Studio

언어 >> C++14(+)

운영체제 >> Windows10

 

 


안녕하세요!!!

요즘에 프로젝트개발을 하면서 프로그램 최적화와 속도향상에 관한 많은 생각을 거듭한끝에

극한의 극한까지 프로그램을 효율적으로 최적화할 수 없을까?? 라는 생각을 하게되었습니다.

그래서 알아본것이 Assembly!!! 특히 vs2019는 디버깅을 통해 디스어셈블이 바로 가능하기 때문에

바로 연습해봤죠!!

 

이번에는 새로운 카테고리를 개설했는데

Assembly를 C++코드로,

C++코드를 Assembly코드로 변환하면서

분석하고 설명하는식으로 가겠습니다.

 

이번에 이 강좌를 진행하면서 저도 같이 공부를 하게되겠습니다.

이것을 C++코드 아예없이도 완전하게 Assembly만으로 프로그램을 자유롭게 만들수있는 수준까지 연습할겁니다.

 

글의 본목적은 공부입니다.

그럼시작하시죠오!

 

#include <cstdio>
#include <conio.h>

int main() {
	int i;
	char fmt[] = "%d ";
    for(int i = 0; i < 10 ; i++){
    	printf(fmt, i);
    }


	_getch();
}

 

다음 c++코드는 그냥 단순한 0~9까지 출력하는 함수입니다.

이거를 그냥 윈도우즈 x86 Assembly vs2019기준으로 바꿔서 설명할겁니다.

 

 

#include <cstdio>
#include <conio.h>

int main() {
	int i;
	char fmt[] = "%d ";
	_asm {
		mov dword ptr[i], 0			; i의 값을 0으로 초기화
		Rezr:						; Rezr 루프케이블
		mov eax, dword ptr[i]		; i의 값을 eax레지스터로 복사
		push eax					; 스택에 eax레지스터값넣기
		lea eax, [fmt]				; fmt의 내용물을 eax레지스터로 넣기
		push eax					; 스택에 eax레지스터값넣기
		call printf					; printf함수호출
		add esp, 8					; 스택프레임

		inc dword ptr[i]			; i의값을 1만큼 증가시키기
		cmp dword ptr[i], 10		; 10과 i의 값을 비교해서
		jge Exit					; i의값이 10보다 크거나 같을경우 Exit케이블로 이동
		jmp Rezr					; Rezr케이블로 이동
		Exit:						; Exit 루프케이블
	}


	_asm call _getch				; _getch함수호출
}

 

 

C++코드와 마찬가지로 엄청 간단하죠?? 궁금한 부분있으면 물어보세요!!

원래 추가설명할려했는데

오늘 엄청 졸려서(현재 시각 밤 11시 25분 ㅠㅠ..) 다음글부터 열심히 하겠습니다 화이팅!!

728x90

댓글