2017-01-10 10 views
1

척.masm32 패킷없이 기호 이름 사용

현재 어셈블리 언어의 arkane 기술을 배우고 있습니다.

(Windows 8.1에서는) 대화 상자를 표시하는 프로그램을 작성했습니다. msdn 참조를 확인하고 대화 상자의 광 및 동작을 변경하는 방법을 알아 냈습니다. 반환 값이 저장되는 위치와 읽는 방법도 배웠습니다. 그래서 제 질문은 "내가 갇혀있게 도와주세요"와 같은 것이 아닙니다. 이 작은 대화 상자 프로그램에서

봐는 :

.386 
.model   flat, stdcall 
includelib  "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\user32.lib" 
includelib  "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\kernel32.lib" 

MessageBoxA  PROTO :DWord, :DWord, :DWord, :DWord 
ExitProcess  PROTO :DWord 

.data 
Caption   db "Masm shizzle",0 
Text   db "Click OK my friend",0 

.code 
start: 
       push 11h 
       push OFFSET Caption 
       push OFFSET Text 
       push 0 
       call MessageBoxA 

       push 0 
       call ExitProcess 
end start 

이 마법처럼 일했다, 나는 매개 변수가 스택에 주문해야하는지 알아 냈어.
나는 다음 코드를 개선하고 더 읽기와 청소기 만들려고, 그래서 아래로 .CODE 섹션을 부러 :

.code 
start: 
       invoke MessageBoxA, 0, addr Text, addr Caption, 11h 
       invoke ExitProcess, 0 
end start 

그리고 난 당신이 코드를 더 읽기 쉽게 만들 수 발표 웹 페이지를 통해 발견 "windows.inc"의 도움으로 기호 이름을 사용하여. 함수 A (ANSI)를 쓸 필요가 없다고 말했습니다.

그래서 호출 호출은 다음과 같을 것이다 :

invoke Messagebox, NULL, addr Text, addr Caption, MB_ICONINFORMATION 

문제는 "windows.inc"더 구체적으로, 이러한 상징적 인 이름이 MASM32 패키지에서 점이다.
기본적으로 masm32를 사용하는 것에 반대하는 것은 아니지만, 내가 사용할 수있는 Visual Studio 만 설치된 "standart"Windows 호스트에 동일한 파일이 있는지 알고 싶습니다.
원격 mashine에서이 코드를 실행 (또는 심지어 컴파일)하고 싶다면 호스트에 masm32 설치가 있다고 가정 할 수 없으므로 include가 아무 곳에도 가리 키지 않습니다. 는 (내가 알고있는, 또는 그대로 내가 미리 컴파일 된 경우는 실행 파일로 포장?)

그 다음 내가 기호 이름 라이브러리를 작성해야 할 것 같아요, MASM32없이 할 수없는 경우 ....

+0

을, 그것을 실행하지 않을 때. 최종 사용자가 코드를 다시 컴파일하려면 MASM32가 필요합니다. (또는 호환 가능한 써드 파티 어셈블러이지만 그러한 어셈블러는 포함 파일의 자체 버전을 제공해야합니다.) 그래서 나는 당신에게 문제가 있다고 생각하지 않습니다. –

+0

이것에 약간의 명확성을 가져 주셔서 감사합니다. 그래서 나는 내가 필요한 모든 버전을 미리 컴파일한다고 생각한다. 완료를 위해이 파일과 동일한 Microsoft 프로그램이 있습니까? – clockw0rk

+0

실제로 MASM32가 제 3 자 패키지라는 사실을 알지 못했습니다. 마이크로 소프트에 상응하는 것이 있는지는 모르겠다. 라이선스에 따라 관련 콘텐츠를 소스 코드에 직접 복사 할 수 있습니다. –

답변

1

MASM32 package by Hutch from here을 얻을 수 있습니다.
이것은 이러한 문제를 처리하는 가장 쉬운 방법입니다.

in this thread과 같이 ANSI/UniCode 상황도 처리합니다.

당신은 유니 코드 버전

MessageBoxW PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD 

하면 좋겠를 사용하려는 경우 당신은 당신이

MessageBoxA PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD 

처럼 ANSI 버전을 사용하려면 할 더 아무것도 그리고 줄이 패키지를 사용하여 파일의 시작 부분 (포함하기 전)에

__UNICODE__ EQU true ; or any other way of defining the __UNICODE__ define 

을 정의해야합니다.

는 사용자가 사용할 수있는 수행 한 후 - 두 경우 모두에서 -은`windows.inc` 파일은 코드가 조립 될 때가 필요로하는 다음 줄

invoke MessageBox, 0, addr Text, addr Caption, 11h