C++ MASM에서 x64 어셈블리에서 HelloWorld printf

환경


  • Visual Studio 2019
  • MSVC 14.16.27023
  • C++14
  • x64

  • 소개



    x86에서는 인라인 어셈블리( __asm )를 사용할 수 있지만 x64는 지원되지 않으므로 별도로 번거로울 필요가 있습니다.

    미리 빌드 설정에서 masm를 사용하도록 설정해야 합니다.


    임의의 디렉토리에 임의의 이름으로 .asm 를 작성해, Microsoft Macro Assembler 를 설정합니다.


    어셈블리 작성



    이 예제에서는 샘플로 다음 코드를 조립합니다.

    example.cpp
    #include <cstdio>
    
    extern "C" void helloworld()
    {
        printf("Hello World from %s!", "Assembly");
    }
    

    최소한의 조립 예:

    helloworld.asm
    .code
    
    ; [.data]
    message_str db 'Assembly', 0
    format_str db 'Hello World from %s!', 0
    
    ; [.text]
    extrn printf:proc
    
    helloworld proc
    
    lea rdx, message_str
    lea rcx, format_str
    jmp printf
    
    helloworld endp
    
    end
    

    발신자:
    이 예제의 경우 printf 위의 어셈블리에서 함수 포인터를 사용하기 때문에 legacy_stdio_definitions.lib (또는 libcmt.lib(マルチスレッド) , libc.lib(シングルスレッド) or 적절한 링커) 링크가 필요합니다.


    main.cpp
    #pragma comment(lib, "legacy_stdio_definitions.lib")
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
        void helloworld();
    
    #ifdef __cplusplus
    };
    #endif
    
    int main(const int argc, const char** argv)
    {
        helloworld();
        return 0;
    }
    

    샘플 결과



    좋은 웹페이지 즐겨찾기