2012-09-25 20 views
5

Aşağıdaki derlemeyi derlemek için nasm kullanıyorum. Ancak kod, Windows altında konsolda çöker. göre \> ld test.o -o test.exeMerhaba dünya Windows montajında ​​nasm kullanarak

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

section .text 
    global [email protected] 

[email protected]: 
    mov edx, len 
    mov ecx, msg 
    mov ebx, 1 
    mov eax, 4 
    int 80h 

    mov ebx, 0 
    mov eax, 1 
    int 80h 

:

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

Cı Bu post. main işlevi Windows altında kullanılamaz ve WinMain ile değiştirilmelidir. giriş noktası _start veya main ise

Yani, [email protected] değiştirildi ve ret 16 için prosedürün sonunda ret değiştirmek edilmelidir:

Benim çalışma örneği:

section .text  
global [email protected]  

[email protected]:  
mov eax, 0  
ret 16 
+3

Lütfen başlığı daha sonra ziyaretçilere faydalı olacak şekilde düzenleyin. Aksi takdirde, yerelleştirilmiş olarak da kapanabilir. –

+0

@RaymondChen ne için? – fuzz

cevap

21

büyük Sorun şu ki, Linux röportajlarını pencerelerde kullanmaya çalışıyorsunuz! int 80, Windows üzerinde çalışmayacak.

Montaj kullanıyoruz, bu nedenle giriş noktanız istediğiniz herhangi bir etiket olabilir. ld arar standart giriş noktası başka etiket kullanmak istiyorsanız, size başlangıç ​​etiketi ana olmak istiyorum, o zaman ihtiyacınız -e seçeneği ile ld anlatmak gerekir _start olduğunu

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

Windows'ta NASM kullanacaksanız, linker olarak GoLink'i kullanmanızı tavsiye edeceğim.

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: Her ne kadar

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

hello.obj: hello.asm 
    nasm -f win32 hello.asm -o hello.obj 
+0

Tam olarak neyim peşindeyim, teşekkürler. – fuzz

+0

@Gunner teşekkür ederim. Bir soru olsa da - diğer linkler üzerinden GoLink'i önermenizin sebebi nedir? –

+0

@Boris Kişisel tercih sanırım. Windows'da diğer bağlayıcılardan daha kolay çalışmayı buldum. – Gunner

5

, muhtemelen bir cazibe gibi Linux üzerinde ŞARAP çalışacağını bu aynı program Burada basit pencere konsol uygulaması. WINE, Windows PE ikili dosyalarının içinden Linux sistem çağrılarını kullanmayı engellememektedir; Makine talimatları doğal olarak çalışır ve WINE sadece DLL işlevleri sağlar.

+0

Bilmekte fayda var, teşekkürler. – fuzz

+4

@JayBlanchard Bu bir cevaptır, çünkü programın düzgün çalıştığı işletim sistemine işaret eder. – johnfound

+0

Oh, demek istediğin, sistemlerin doğal olarak çalıştığı ve WINE'ın bunlarla hiçbir ilgisi olmadığı bir Linux makinesinde.İlk başta WINE'ın her iki yöne gittiğini ve bir Windows makinesinde Linux 'int 0x80' ABI'ye öykünebileceğini düşündüğümüzü düşündüm! –

İlgili konular