이제 NASM 2.12.01과 GCC 4.8.1을 링커로 사용하여 일부 Windows 기본 어셈블리를 프로그래밍하고 있습니다.Win32 어셈블리 - 콘솔의 WriteFile()이 출력을 표시하지 않습니다.
그러나이 간단한 HelloWorld 프로그램은 아무런 불평없이 & 링크를 컴파일하지만 콘솔 화면에는 아무 것도 출력하지 않습니다.
GetStdHandle
은 현재 콘솔에 유효한 핸들을 반환하지 않으므로 출력이 표시되지 않습니다.
하지만 문제가있을 수 있습니다.
코드 :
; Name: hello.asm
; Assemble: nasm.exe -fwin32 hello.asm
; Link: gcc -mwindows -o hello hello.obj -lkernel32 -lmsvcrt
; Run: a.exe
BITS 32
extern [email protected]
extern [email protected]
extern [email protected]
extern __getch
extern _puts
SECTION .data
str: db `Hello world!\n` ; C-like strings in NASM with backticks
strlen equ $-str
pause: db "Do you know where the ANY key is? :-)",0
SECTION .text
GLOBAL _main
_main:
; Stack frame for NumberOfBytesWritten
push ebp
sub esp, 4
; http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231.aspx
; HANDLE WINAPI GetStdHandle(
; _In_ DWORD nStdHandle
;);
push -11
call [email protected]
; http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747.aspx
; BOOL WINAPI WriteFile(
; _In_ HANDLE hFile,
; _In_ LPCVOID lpBuffer,
; _In_ DWORD nNumberOfBytesToWrite,
; _Out_opt_ LPDWORD lpNumberOfBytesWritten,
; _Inout_opt_ LPOVERLAPPED lpOverlapped
;);
push 0 ; lpOverlapped,
lea ebx, [ebp-4] ; EBX: address of NumberOfBytesWritten
push ebx ; lpNumberOfBytesWritten,
push strlen ; nNumberOfBytesToWrite
push str ; lpBuffer,
push eax ; hFile (result from GetStdHandle
call [email protected]
; msvcrt.dll (C library)
push pause
call _puts ; http://msdn.microsoft.com/library/tf52y4t1.aspx
add esp, 4
call __getch ; http://msdn.microsoft.com/library/078sfkak.aspx
; ExitProcess (0)
push 0
call [email protected]
* "문제는 다른 것일 수 있습니다."* - 추측을 중지하기 만하면 오류 처리를 구현하지 않는 이유는 무엇입니까? – IInspectable
@IInspectable 안녕하세요 세계 ASM 프로그램에서 정확히 구현하겠습니까? – hakeris1010
프로세스가 만드는 모든 시스템 호출을 추적 할 수있는 Windows 도구가 있습니까? 리눅스/유닉스에서'strace'는 이런 것들을 디버깅하는데 아주 좋습니다. ([이 임의의 블로그 게시물의 예제 출력] (http://www.thegeekstuff.com/2011/11/strace-examples) 참조). –