2012-09-25 30 views
5

Tôi đang sử dụng nasm để biên dịch hội đồng sau đây. Tuy nhiên, mã bị treo trong bảng điều khiển trong Windows.Xin chào thế giới bằng cách sử dụng nasm trong cửa sổ lắp ráp

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 [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 

Theo này post. Chức năng main không khả dụng trong Windows và phải được thay thế bằng WinMain.

Vì vậy, nếu điểm vào của bạn là _start hoặc main, nó nên được thay đổi để [email protected] và thay đổi ret ở phần cuối của các thủ tục để ret 16:

dụ làm việc của tôi:

section .text  
global [email protected]  

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

Vui lòng chỉnh sửa tiêu đề để nó hữu ích cho khách truy cập trong tương lai. Nếu không, nó có thể bị đóng như địa phương hóa quá. –

+0

@RaymondChen đến cái gì? – fuzz

Trả lời

21

Lớn nhất vấn đề là bạn đang cố gắng sử dụng Linux interupts trên windows! int 80 sẽ KHÔNG hoạt động trên các cửa sổ.

Chúng tôi đang sử dụng Assembly, vì vậy điểm vào của bạn có thể là bất kỳ nhãn nào bạn muốn. Điểm vào tiêu chuẩn mà ld tìm kiếm là _start, nếu bạn muốn sử dụng nhãn khác, bạn cần phải nói cho ld với các tùy chọn -e Vì vậy, nếu bạn muốn nhãn bắt đầu của bạn là chính, sau đó bạn cần

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

Nếu bạn định sử dụng NASM trên Windows, tôi sẽ khuyên bạn nên sử dụng GoLink làm trình liên kết của bạn. Đây là một đơn giản cửa sổ giao diện điều khiển ứng dụng:

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 
+0

Chính xác những gì tôi đã làm sau, cảm ơn bạn. – fuzz

+0

@Gunner cảm ơn bạn. Một câu hỏi là gì - lý do bạn đề nghị GoLink so với các trình liên kết khác là gì? –

+0

@Boris Sở thích cá nhân tôi đoán. Tìm thấy nó dễ dàng hơn để làm việc với hơn các liên kết khác trên Windows. – Gunner

5

Mặc dù, cùng chương trình này có lẽ sẽ chạy trong WINE trên Linux như một nét duyên dáng. :)

RƯỢU KHÔNG ngăn việc sử dụng các cuộc gọi hệ thống Linux từ bên trong Windows PE nhị phân; các hướng dẫn máy chạy tự nhiên và WINE chỉ cung cấp các hàm DLL.

+0

Điều cần biết, cảm ơn bạn. – fuzz

+4

@JayBlanchard Đây là một câu trả lời, bởi vì nó chỉ hệ điều hành, nơi chương trình sẽ hoạt động đúng, mà không đề cập đến trong vụ tai nạn câu hỏi. – johnfound

+0

Ồ, bạn có nghĩa là trên một máy Linux, nơi mà các cuộc gọi hệ thống chạy tự nhiên và WINE không có gì để làm với chúng.Ban đầu tôi nghĩ rằng bạn có nghĩa là WINE đã đi theo cả hai cách, và nó có thể mô phỏng Linux 'int 0x80' ABI trên một máy Windows! –

Các vấn đề liên quan