2015-01-22 4 views
1

어셈블리에 대해 알아보기 위해 masm32를 사용하려고합니다. 나는 Windows 8을 실행 중이며 문제없이 masm32 디렉토리에서 샘플 코드를 컴파일하고 실행할 수 있습니다.MASM32 컴파일 오류

빠른 편집기 4.0g을 사용하고 있습니다.

그러나 Kip Irvine의 "x86 프로세서 용 어셈블리 언어"의 코드는 다음과 같습니다. 그는 이것이 "include file에 의존하지 않는다"는 약간의 코드라고 말하지만, 이것이 완전히 정확하지 않을 수도 있다는 생각이 들었다. 나는 일이를 알아 내기 위해 노력 해왔다

AddSubAlt.obj : error LNK2001: unresolved external symbol [email protected] 
AddSubAlt.obj : error LNK2001: unresolved external symbol [email protected] 
AddSubAlt.exe : fatal error LNK1120: 2 unresolved externals 

: 나는 그것을 구축 할 때

TITLE Add and Subtract 

; This program add and subtracts 32-bit Integers 

.386 
.model flat,stdcall 
.stack 4096 
ExitProcess PROTO, dwExitCode:DWORD 
DumpRegs PROTO 

.code 
main PROC 

    mov eax,10000h 
    add eax,40000h 
    sub eax,20000h 
    call DumpRegs 

INVOKE ExitProcess,0 
main ENDP 
END main 

나는 다음과 같은 오류가 발생합니다 (I 프로젝트와 "콘솔 조립 및 링크"를 선택로 이동합니다) . 2002 년부터 해답을 찾았지만 더 이상 존재하지 않는 라이브러리를 참조합니다. 거기에있는 일부 의회의 전문가 천사가 문제를 해결하는 데 도움이되기를 바랍니다.

감사합니다. http://www.kipirvine.com/asm/examples/Irvine_7th_Edition.msi을 :

+1

'ExitProcess' 및'DumpRegs'를 가져 오는 라이브러리의 링커 명령 행에 해당 .lib' 파일을 추가해야합니다. 왜 그냥 'eax'와'retn'을 0으로 할 수있을 때 왜'ExitProcess'를 호출할까요? – Ruslan

+0

또는 어셈블리 코드에서 includelib directirves를 추가 할 수 있습니다. INCLUDELIB MSVCRTD | | INCLUDELIB OLDNAMES | . – rcgldr

+0

@Ruslan 왜 Irvine 씨가 이런 식으로 코드를 작성했는지 묻는다면, 나는 대답 할 수 없었습니다. 나는 또한 당신이 말한 것을하는 방법을 정말로 이해하지 못합니다. –

답변

2

먼저 당신은 당신이 his site에서 다운로드 할 수 어바인의 라이브러리 파일 (Kernel32.Lib, User32.Lib, Irvine32.lib, Irvine32.inc), 즉,이 파일을 다운로드하여 설치가 필요합니다.

지금 당신은 당신의 프로그램의 시작 부분에 몇 줄을 삽입 :

includelib C:\full\path\to\Kernel32.Lib 
includelib C:\full\path\to\User32.Lib 
includelib C:\full\path\to\Irvine32.lib 

; include C:\full\path\to\Irvine32.inc 

include... - 라인 나중에 사용할 수 있으며 지금은 주석.

+0

감사합니다! 왜 그가 그의 코드에서 언급하지 않았는지 궁금합니다. 호기심에서, .inc와 .Lib의 차이점은 무엇입니까? –

+1

@Choirbean :'.inc' 파일은'include '가있는 곳에서 어셈블러에 의해 삽입되는 텍스트입니다 - 개인적으로 입력 한 것처럼 말입니다. '.lib'-file은 링커의 함수 라이브러리이므로 외부 함수 (예 : DumpRegs 및 ExitProcess)에 대한 호출을 어떻게 처리해야하는지 알 수 있습니다. – rkhb

+0

다시 한번 도움을 주셔서 감사합니다! –

1

Irvine 책의 예제 프로그램은 라이브러리를 구성하고 GUI를 통해 경로를 포함하는 MS Visual Studio에서 실행될 예정입니다.

명령 줄을 통해 어셈블하려면 명령 인수를 통해 라이브러리 경로를 지정해야합니다. 아래는 저에게 도움이되는 예입니다.

C:\Users\QMPH64>"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\ml.exe" /I C:\Irvine\ C:\Irvine\Examples\ch03\AddSubAlt.asm /link /SUBSYSTEM:CONSOLE /LIBPATH:C:\Irvine\ 

또는 다음과 같이 개별 라이브러리를 명령 줄에 제공 할 수 있습니다.

C:\Users\QMPH64>"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\ml.exe" /I C:\Irvine\ AddSub.asm /link C:\Irvine\Irvine32.lib C:\Irvine\kernel32.lib C:\Irvine\User32.Lib /SUBSYSTEM:CONSOLE