14

nasmを使用して、次のアセンブリをコンパイルしています。ただし、Windows のコンソールでコードがクラッシュします。

C:\>nasm -f win32 test.asm -o test.o

C:\>ld test.o -o test.exe

section .data
  msg   db    'Hello world!', 0AH
  len   equ   $-msg

section .text
  global _WinMain@16

_WinMain@16:
  mov   edx, len
  mov   ecx, msg
  mov   ebx, 1
  mov   eax, 4
  int   80h

  mov   ebx, 0
  mov   eax, 1
  int   80h

この投稿によると。このmain機能は Windows では使用できないため、 に置き換える必要がありますWinMain

したがって、エントリ ポイントが_startまたはの場合は、 に変更し、手順の最後で を に変更mainする必要があります。_WinMain@16retret 16

私の作業例:

section .text       
 global _WinMain@16       

_WinMain@16:       
 mov eax, 0       
 ret 16 
4

2 に答える 2

35

最大の問題は、WindowsでLinuxの割り込みを使用しようとしていることです。int80はWindowsでは機能しません。

アセンブリを使用しているため、エントリポイントは任意のラベルにすることができます。ldが検索する標準のエントリポイントは_startです。別のラベルを使用する場合は、-eオプションを使用してldに指示する必要があります。したがって、開始ラベルをメインにする場合は、次のようにする必要があります。

global main
ld -e main test.o -o test.exe

WindowsでNASMを使用する場合は、リンカーとしてGoLinkを使用することをお勧めします。簡単なWindowsコンソールアプリは次のとおりです。

STD_OUTPUT_HANDLE   equ -11
NULL                equ 0

global GobleyGook
extern ExitProcess, GetStdHandle, WriteConsoleA

section .data
msg                 db "Hello World!", 13, 10, 0
msg.len             equ $ - msg

section .bss
dummy               resd 1

section .text
GobleyGook:
    push    STD_OUTPUT_HANDLE
    call    GetStdHandle

    push    NULL
    push    dummy
    push    msg.len
    push    msg
    push    eax
    call    WriteConsoleA 

    push    NULL
    call    ExitProcess

makefile:

hello: hello.obj
    GoLink.exe  /console /entry GobleyGook hello.obj kernel32.dll  

hello.obj: hello.asm
    nasm -f win32 hello.asm -o hello.obj
于 2012-09-25T01:24:40.817 に答える
9

ただし、これと同じプログラムは、おそらくLinux上のWINEで魅力的に実行されます。:)

WINEは、WindowsPEバイナリ内からのLinuxシステムコールの使用を妨げません。マシン命令はネイティブに実行され、WINEはDLL関数のみを提供します。

于 2013-02-05T21:19:19.337 に答える