2012-05-17 4 views
3

결과 내 게시물 int21h를 Windows XP에서 사용할 수 있습니까?, Windows API 사용에 대한 기사를 보았습니다.이 기사에서는 _WriteConsole @ 4 API를 사용하여 콘솔에 메시지를 인쇄하는 방법에 대한 참조입니다. 기사는 http://cs.lmu.edu/~ray/notes/x86assembly/입니다. ML :x86 어셈블리 - Windows API 사용 방법 _WriteConsole @ 4 - masm32 구문

.386P 
.model flat 
extern [email protected]:near 
extern [email protected]:near 
extern [email protected]:near 
public _go 

.data 
     msg  byte 'if you get this, it worked.', 10 
     handle dword ? 
     written dword ? 
.code 
start: 
_go:  
     push -11 
     call [email protected] 
     mov  handle, eax 
     push 0 
     push offset written 
     push 13 
     push offset msg 
     push handle 
     call [email protected] 
     push 0 
     call [email protected] 
end start 

내가 코드를 컴파일이 구문을 사용하고 있습니다 : 여기

지금까지 내 코드입니다

ml (the file is called test.asm) test.asm /c 

링크 : 내가 입수했습니다

link test.obj C:\masm32\lib\kernel32.lib /SUBSYSTEM:CONSOLE /entry:go 

그것은 컴파일 및 링크,하지만 내가 생산되는 .exe를 실행하면, 그것은 절대 아무것도, 심지어 오류가 다시 않습니다. 회전. 콘솔은 검은 색입니다. 왜 이런거야?

도움을 주시면 감사하겠습니다. 그리고이 포럼의 사용자는 매일 stackoverflow.com을 폭파하는 것에 대해 사과합니다. 배우는 데 필요한 리소스가 거의 없습니다. 사전에

감사합니다,

Progrmr

+0

Visual Studio 2010 (10.00.40219.01)에서 작동하지만'13'을'msg'의 실제 길이로 조정해야합니다. – DCoder

+0

정말요? 명령 프롬프트를 사용하고 게시물의'ml'과'link' 문자열을 타이핑합니다. 어떻게 작동시킬 수 있을까요? – Progrmr

답변

2

먼저 샘플 코드를받는 링크는 NASM 사용자가 사용하고 있으며 그가 말하는 방식에서 MASM을 사용한 적이 없을 것입니다. 그는 또한 NASM 형식과 같은 그의 MASM 샘플을 씁니다. Assembly를 사용한다는 사실은 고급 컴퓨터 사용자 여야 함을 의미합니다. 배치 파일을 사용하는 방법, 시스템 경로를 설정하는 방법 및 기타 사항을 알아야합니다. 무언가가 잘못 될 경우 연구를 통해 배웁니다. 그래서 당신은 masm32rt.inc를 찾을 수 없다는 에러 메시지가 나오지만 MASM32를 사용하고 있다고 말합니다. 배치 파일과 Assembly 용 IDE를 사용하고 시스템 경로가 MASM32의 다양한 디렉토리를 가리키고 있습니다.

masm32rt.inc 앞에 masm32 \ include 디렉토리의 절대 경로를 추가하십시오. 이 글을 읽는 동안 masm32rt.inc 파일을 텍스트 편집기에서 열어서 그 안에 무엇이 있는지 확인하십시오 - 오류가 수정되었습니다.

You start your source file with: 
.586 
.option casemap:NONE 
.model flat, stdcall 

include yourincludeshere and it could be a bunch 
includelib yourlibshere same here a bunch 

masm32rt.inc가 이미 포함이 포함 libs와에 대한 includelib 포함 널리 사용되는 포함되어 있습니다. 우리는 많은 타이핑을 저장하기 위해 그것을 사용합니다.

\ masm32 \ include에있는 포함 파일을 열면 include가 매개 변수 검사를 위해 invoke를 사용할 수 있도록 API 호출 용 protos를 설정하는 것뿐 아니라 API 호출의 별칭이기도하므로 WriteConsoleA를 입력 할 필요가 없습니다 대신 우리는 WriteConsole hell을 작성하고 YoConsole equ를 수행 할 수도 있고 코드에서 WriteConsole 용 YoConsole을 작성할 수도 있습니다.

말했다되는 것을 우리는 사용하지 마십시오 - 통근 _WriteConsoleA 20 @ : 근처 NASM은 것도 우리가 공공 MASM 우리의 항목 레이블을 설정해야 할이하여 진입 점을 알고 같이

.code 
yourentrypointname: 

end yourentrypointname 

을 우리 또한 소스에서 includelib을 사용하기 때문에 링커에 libs를 지정할 필요가 없습니다.

또한 매개 변수에 하드 코드 번호를 사용하는 습관을 반복하지 마십시오. 지금 그 습관을 벗어! Windows 헤더 파일은 이유 코드 가독성을 위해 DEFINES를 사용합니다. 우리는 (여러분을 돕는 사람들) -11이 API 호출에 대해 의미하는 것을 찾을 필요가 없습니다. 정의를 사용했고 그 매개 변수의 의미를 알고 있습니다. 또한 WriteConsole 호출이 40 번 발생하면 어떻게됩니까? equate를 사용하는 경우 검색 대신 검색을 바꾸고 대체해야합니다. 괜찮은 MASM 자습서를 사용하려면 Iczelion을 검색해야합니다. 예를 들어, 몇 가지 오류가 있지만 초기 단계에서 많은 사람들이이 자습서를 사용했습니다.

+0

이 파일을 만들고 연결하는 데 사용 하시겠습니까? 그리고 배치 파일을 사용하여이 파일을 만들었으므로 % 경로 % 환경 변수를 MASM 디렉토리에 설정하지 않았습니다. – Progrmr

+0

나는 당신의 코드를 정확히 사용했고, 여전히'can not open file : masm32rt.inc'라고 말한다. 배치 파일에서'C : \ masm32 \ bin '디렉토리로 이동 한 다음'ml/c/coff test.asm'을 수행합니다. 나는'cd C : \ masm32 \ bin'을하고'link/subsystem : console C : \ masm32 \ inc \ masm32rt.inc test.obj'를한다. 이 올바른지? 그렇지 않은 경우이 작업을 수행 할 단계별 방법을 게시 할 수 있습니까? – Progrmr

+0

내 마지막 두 댓글을 긁어서 작동 시키십시오. 시간 내 줘서 고마워. – Progrmr

0

당신은 MASM32을 시도 할 수는 여기에 콘솔 응용 프로그램에 대한 안녕하세요 세계 예제입니다

; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« * 

    .486 
    .model flat, stdcall 
    option casemap :none ; case sensitive 

; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« 

    include \masm32\include\windows.inc 
    include \masm32\include\masm32.inc 
    include \masm32\include\kernel32.inc 
    include \masm32\macros\macros.asm 

    includelib \masm32\lib\masm32.lib 
    includelib \masm32\lib\kernel32.lib 

    .code 

start: 

; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« 

    print "Hello world" 

    exit 

; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« 

end start 

하지만 현재 어셈블러를 고수하려는 경우, 우리는 매크로 아래를 볼 수 있습니다. 인쇄가 있습니다. 매크로 :

print MACRO arg1:REQ,varname:VARARG  ;; display zero terminated string 
    invoke StdOut,reparg(arg1) 
    IFNB <varname> 
    invoke StdOut,chr$(varname) 
    ENDIF 
ENDM 
,363,210

그래서 당신은 표준 출력을 원하는, MASM32에는 다음과 같습니다

StdOut proc lpszText:DWORD 

    LOCAL hOutPut :DWORD 
    LOCAL bWritten :DWORD 
    LOCAL sl  :DWORD 

    invoke GetStdHandle,STD_OUTPUT_HANDLE 
    mov hOutPut, eax 

    invoke StrLen,lpszText 
    mov sl, eax 

    invoke WriteFile,hOutPut,lpszText,sl,ADDR bWritten,NULL 

    mov eax, bWritten 
    ret 

StdOut endp 

그래서이 여행의 끝에서, 당신의 WriteFile을 사용하지 WriteConsole :이 문제없이 작동

+0

WriteFile과 WriteConsole 사이에 구문에 차이가 있습니까? 문자 그대로 WriteConile을 WriteConsole과 동일한 구문으로 바꿀 수 있습니까? – Progrmr

+0

그리고 MASM32를 사용하고 있습니다 – Progrmr

+0

방금 ​​내 프로그램에서'WriteFile'을 사용하려고 시도했지만 컴파일되지 않았습니다. 그것은 저에게'undefined external'라는 오류를주었습니다. 어떻게해야하는지 알려주는 코드를 줄 수 있습니까? – Progrmr

2

:

include masm32rt.inc 

.data 
szMsg  db "I am in the console!", 0 
MSG_LEN  equ $ - szMsg 

.data? 
BytesWriten dd ? 

.code 
start: 
    push STD_OUTPUT_HANDLE 
    call GetStdHandle 

    push NULL 
    push offset BytesWriten 
    push MSG_LEN 
    push offset szMsg 
    push eax 
    call WriteConsole 

    push 0 
    call ExitProcess 
end start 

엔트리 레이블이 _go인데 링커에게 go -/entry :라고 말하면 콘솔을 생성하지만 코드를 실행하지 않습니다! 이 경우 링커에게 엔트리 포인트를 말할 필요가 없습니다. 엔트리 포인트는 시작입니다. 링커는 어떻게 알 수 있습니까? 종료시

+0

Windows API 또는 masm libary 매크로를 사용합니까? – Progrmr

+0

그리고 이것을 무엇에 컴파일 했습니까? 'ml test.asm/c'와'link test.obj C : \ masm32 \ include \ masm32rt.inc/subsystem : console'로 컴파일하려고했습니다. 작동하지 않았습니다. 그것은'can not open file : masm32rt.inc'라고 말했다. – Progrmr

+0

필자는 결국'ml' 부분을 지나쳐 버렸지 만 링크 할 때 파일이 잘못되었거나 손상되었다고 말했습니다. 왜 이런거야? – Progrmr

관련 문제