날먹을 위한 몸부림/나중에 옮기겠지

visual studio2019에서 인라인 어셈블리 - 2

프로그래밍하는 지팡이 2023. 1. 9. 18:33

머갈통말

앞에서 작성한 프로젝트를 기반으로 x64지원까지 추가해서 만들어봄

결과는 x86과 x64에서 둘 다 작동하는 작은 어셈블리 프로젝트임

 

뭐 했는지 기억 안난다면 이전글 참고

https://boa9448.tistory.com/26

 

visual studio2019에서 인라인 어셈블리 - 1

머갈통말 vs는 컴파일러를 통해서 x64인라인 어셈블리를 지원하지 않음간단한 어셈블리 프로젝트를 작성하는데 nasm와 같은 외부 어셈블러 사용시 어려움을 느낄 수 있음이번 글을 통해서 외부

boa9448.tistory.com

 


순서

  • asm_lib_x64.asm 추가
  • asm_lib.asm, asm_lib_x64.asm 파일 속성 수정
  • 코드 작성

asm_lib_x64.asm 추가

 

앞에서 추가한 asm_lib.asm과 같은 방식으로 파일을 추가함

파일 이름은 asm_lib_x64.asm

 

asm_lib_x64.asm을 추가한 모습

 

asm_lib.asm, asm_lib_x64.asm 파일 속성 수정

 

x86과 x64는 범용 레지스터의 크기부터 호출 규칙등 차이가 존재함

그래서 x86으로 컴파일 될 때는 asm_lib.asm이 사용되도록 하고

x64로 컴파일 될 떄는 asm_lib_x64.asm이 사용되록 프로젝트를 설정함

 

 

asm_lib.asm 파일 우클릭 -> 속성 클릭

구성 : 모든 구성, 플랫폼 : x64

빌드에서 제외 : 예

 

위와 같이 설정한 뒤 저장

 

asm_lib.asm의 속성

 

 

다음은 asm_lib_x64.asm을 설정함

asm_lib_x64.asm 파일 우클릭 -> 속성 클릭

구성 : 모든 구성, 플랫폼 : Win32

빌드에서 제외 : 예

 

위와 같이 설정한 뒤 저장

asm_lib_x64.asm의 속성

 

asm_lib.asm는 x64에서는 빌드에서 제외되야 하고 x86에서는 빌드에 포함되어야한다

asm_lib_x64.asm은 x86에서는 빌드에서 제외되야 하고 x64에서는 빌드에 포함되야함

 

 

코드 작성

x64는 x86과 다른 방식으로 함수를 호출한다

기본으로 fastcall을 사용해서 함수를 호출한다

 

더 궁금하면 다음 글 참고

https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170 

 

x64 calling convention

Learn about the details of the default x64 calling convention.

learn.microsoft.com

 

 

함수의 인자가 스택으로 넘어오는게 아닌 레지스터를 통해서 전달됨

그래서 앞에서 작성했던 x86의 my_add3과 같은 방식을 사용 할 수 없음

 

 

x64빌드 후 실행하면 다음과 같은 결과를 볼 수 있다

실행 결과