🗿Assembly/코드비교및 분석
for루프문 [ vs2019 inline assembly ]
개발환경 >> 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분 ㅠㅠ..) 다음글부터 열심히 하겠습니다 화이팅!!
'🗿Assembly > 코드비교및 분석' 카테고리의 다른 글
문자열 길이측정 함수 [ vs2019 inline assembly ] (0) | 2021.05.14 |
---|
댓글