반응형
어셈블리를 위한 프로젝트 생성
새 빈 콘솔 프로젝트를 만듭니다.
64Bit로 변경합니다.
빌드 종속성에서 masm을 체크합니다.
.asm 파일과 .cpp 파일을 하나씩 추가 합니다.
asm 파일의 속성을 선택합니다.
asm 파일의 항목 형식이 Microsoft Macro Assemply로 선택된 것을 확인 합니다.
어셈블리에서 표준 함수들 사용 할 수 있도록 하자
printf, scanf와 같은 표준 함수들을 어셈블리에서 사용할 수 있게 하려면 다음과 같이 두 개의 라이브러리를 추가해주어야 합니다.
프로젝트 속성의 링커 -> 일반 -> 추가 속성에서 다음과 같이 두 라이브러리를 추가 합니다.
- legacy_stdio_definitions.lib
- legacy_stdio_wide_specifiers.lib
예제 코드
Assembly 코드 :
; -----------------------------------------------------------------------------------------------------------
; Our variables
; -----------------------------------------------------------------------------------------------------------
_DATA SEGMENT
hello_msg db "Hello world", 0
info_msg db "Info", 0
_DATA ENDS
; -----------------------------------------------------------------------------------------------------------
; Text or code segment
; -----------------------------------------------------------------------------------------------------------
_TEXT SEGMENT
; Needed windows functions to show a MessageBox
EXTERN MessageBoxA: PROC
EXTERN GetForegroundWindow: PROC
; The PUBLIC modifier will make your function visible and callable outside
PUBLIC hello_world_asm
hello_world_asm PROC
push rbp ; save frame pointer
mov rbp, rsp ; fix stack pointer
;sub rsp, 8 * (4 + 2) ; allocate shadow register area + 2 QWORDs for stack alignment
sub rsp, 32
; Get a window handle
call GetForegroundWindow
add rsp, 32
mov rcx, rax ; rax contains window handle
; WINUSERAPI int WINAPI MessageBoxA(
; RCX => _In_opt_ HWND hWnd,
; RDX => _In_opt_ LPCSTR lpText,
; R8 => _In_opt_ LPCSTR lpCaption,
; R9 => _In_ UINT uType);
mov rdx, offset hello_msg
mov r8, offset info_msg
mov r9, 0 ; MB_OK
sub rsp, 32
;and rsp, not 8 ; align stack to 16 bytes prior to API call
;sub rsp, 8 ; mess up the alignment
call MessageBoxA
add rsp, 32
; epilog. restore stack pointer
mov rsp, rbp
pop rbp
ret
hello_world_asm ENDP
_TEXT ENDS
END
cpp 코드 :
#include <SDKDDKVer.h>
#include <stdio.h>
#include <Windows.h>
#include <iostream>
// External assembly functions we want to call from here
extern "C"
{
void hello_world_asm();
};
int main()
{
hello_world_asm();
return 0;
}
실행 결과 :
참고: onipot.altervista.org/how-to-create-assembly-project-visual-studio-2019-64-bit/
'프로그래밍 일반 > 프로그래밍 기타' 카테고리의 다른 글
[어셈블리] OllyDbg 소개 (0) | 2020.09.13 |
---|---|
Visual Studio 인라인 어셈블리 x86 예제 (0) | 2020.09.13 |
CPU 레지스터 (0) | 2020.09.12 |