2010-12-28 9 views
41

Visual Studio를 사용하여 어셈블리 코드를 컴파일하는 방법은 무엇입니까?Visual Studio에서 어셈블리 컴파일

Visual Studio 2010에 어셈블리 소스 파일을 컴파일하고 실행하고 싶습니다.

나는 비주얼 C++ 프로젝트를 생성하고 파일 code.asm 일부 어셈블리 코드를 삽입 한 :

.586    ;Target processor. Use instructions for Pentium class machines 
.MODEL FLAT, C ;Use the flat memory model. Use C calling conventions 
.STACK   ;Define a stack segment of 1KB (Not required for this example) 
.DATA    ;Create a near data segment. Local variables are declared after 
        ;this directive (Not required for this example) 
.CODE    ;Indicates the start of a code segment. 

clear PROC 
    xor eax, eax 
    xor ebx, ebx 
    ret 
clear ENDP 
END 

당신이 시도하고이를 컴파일 할 때 문제가 그러나, 당신은 얻을 :

LINK : error LNK2001: unresolved external symbol _mainCRTStartup 

내가 가서 사용자 정의 빌드 masm.targets (오른쪽 클릭 프로젝트 > 사용자 정의 빌드 ..)을 활성화했지만 아무런 효과가 없습니다.

+0

Visual Studio에서 * debug * asm (레지스터 및 단일 단계 중단 점보기) : https://stackoverflow.com/questions/46394685/debugging-asm-with-visual-studio-register-content -will-not-display. [x86 태그 위키] (https://stackoverflow.com/tags/x86/info)의 다른 x86 asm 링크도 참조하십시오. –

답변

49

나에게 소리 :

는 다른 방법으로 한 번에 모든 작업을 수행 할 수 있습니다. 프로젝트, 사용자 지정 빌드 규칙을 마우스 오른쪽 단추로 "Microsoft 매크로 어셈블러"를 선택하십시오. "END clear"지시문과 증분 링크를 사용하지 않으면 깨끗한 빌드를 얻게됩니다.

VS2010에서 다른 시작의 :

  1. , "MASM"를 체크 프로젝트, 빌드 사용자 지정을 마우스 오른쪽 단추로 클릭합니다.
  2. .asm 파일, 속성를 마우스 오른쪽 단추로 클릭 아이템 종류에 "Microsoft 매크로 어셈블러"로 변경.
+0

은 VS의 가벼운 부분입니까? – paulm

+4

그건 내 꺼야. Express Edition을 사용하는 프로그래머가 요청하는 경향이 있습니다. –

+3

이후 버전의 Visual Studio (예 : 2015)에서는 다음 경로를 따라야합니다. 프로젝트 -> (오른쪽 클릭) 빌드 종속성 -> 빌드 사용자 지정 ...-> (확인) 마스크 – Alex

8

Visual Studio에는 MASM 매크로 어셈블러가 포함되어 있습니다. 어셈블러 코드의 더 작은 조각은 종종 C 또는 C++ 프로그램에서 inline assembly으로 작성됩니다.

Visual Studio 프로젝트에서 어셈블러 파일을 통합하려면 일반 C/C++ 프로젝트 (명령 줄 또는 GUI)를 만들고 소스 파일 목록에 .asm으로 끝나는 파일을 추가하기 만하면됩니다.

는 진입 점 명확 지정 다음 지침을 따르십시오 :

  1. 열기 프로젝트의 속성 페이지 대화 상자를. 자세한 내용은 Visual C++ 프로젝트 속성 설정을 참조하십시오.

  2. 링커 폴더를 클릭하십시오.

  3. 고급 속성 페이지를 클릭하십시오.

  4. 진입 점 속성을 수정하십시오.

는 (그것은 Visual Studio documentation에서 촬영되었다.)

내가 한스 옆모습의 지시를 확인할 수 있습니다. 또한 this article에 따르면 "빌드 사용자 지정"마스크 확인란을 추가 한 다음 파일을 추가하면 자동으로 어셈블러 파일로 인식됩니다. 또한 END 지시어에 엔트리 포인트 이름을 지정하지 않고 프로젝트 설정에서 엔트리 포인트 이름을 지정하면 나에게도 도움이됩니다.

0

문제는 어셈블리 코드가 단지 함수에 불과하다는 것입니다. 컴파일하고 링크하려면 C/C++에서 Main과 같은 시작 절차가 필요합니다. END 지정 문에 시작 기호를 지정할 수 있습니다. 마찬가지로 :

END clear 

또는 당신이 원한다면, 당신은 하나의 .OBJ 생성 된 C/C++로 생성 된 .OBJ 파일을 링크 할 수 있습니다.

+0

나는'END clear' (그냥'END' 대신에), 주사위를 추가하지 않았습니다. – bobobobo

+0

VC++이기 때문에 Main 함수로 C 파일을 검색해야합니다. 최종 솔루션은 순수한 어셈블러와 링커를 사용하는 경우에 효과적입니다. –

+0

사실, END clear는 작동시키지 않아도됩니다 : 단순히 링커에'/ entry : clear'을 지정해야합니다. – bobobobo

10

명령 행 :

과 함께 코드를 컴파일은 :

ml /c /Cx /coff code.asm 

당신은 출력으로 code.obj 얻을.이제 go.exe를 실행할 수 있습니다

link code.obj /SUBSYSTEM:console /out:go.exe /entry:clear 

:와

연결합니다. (안 해결)

ml /Cx /coff code.asm /link /SUBSYSTEM:console /link /entry:clear 

비주얼 스튜디오 사용자 정의가 .ASM 파일에 대한 규칙을 사용할 수 없습니다 구축과 같은

+0

프로젝트의 속성 대화 상자에서 링크 행을 편집하여/entry : clear를 지정할 수 있습니다./out :은 code.obj와 같이 자동으로 지정됩니다. 가정합니다 code.obj 괜찮아요 조립 및 오류가이 문제를 해결해야합니다. 실행중인 명령은이 트리의 고급 페이지에 있습니다. –

+0

정식 버전은'ml/Cx/coff code.asm/link/SUBSYSTEM : console/out : go/entry : clear'가 아니라'ml/Cx/coff code.asm/link/SUBSYSTEM : console/link/entry 여야합니다. : clear' –

관련 문제