2012-05-07 2 views
1

Я использую Windows 7 для изучения ассемблерного языка. Я использую NASM для создания объектных файлов и mingw для создания исполняемых файлов.не может запустить исполняемый файл, сделанный nasm в Windows 7

Я использую следующие команды для компиляции и запуска исполняемых файлов

del hello.o 
del hello.exe 
nasm -f elf hello.asm 
ld hello.o -o hello.exe 
hello 

при запуске файла Hello.exe, сообщение об ошибке с указанием «hello.exe имеет купировались работает»

в то время как с помощью следующую команду

nasm -f bin hello.asm -o program.exe 

я получил сообщение об ошибке, показанное ниже

enter image description here

мой код программы

global _start   ; global entry point export for ld 
section .text 
_start: 
; sys_write(stdout, message, length) 
mov eax, 4  ; sys_write syscall 
mov ebx, 1  ; stdout 
mov ecx, message ; message address 
mov edx, length  ; message string length 
int 80h 
; sys_exit(return_code) 
mov eax, 1  ; sys_exit syscall 
mov ebx, 0  ; return 0 (success) 
int 80h 
section .data 
message: db 'Hello, world!',0x0A ; message and newline 
length: equ $-message   ; NASM definition pseudo-instruction 
+0

Покажите нам код. – paxdiablo

+0

мой тип системы: 32bit os –

ответ

3

То, что вы есть Linux код (int 80, sys_write и sys_exit является ядро ​​системы требует довольно низком уровне материала).

Я не уверен, что рекомендуется использовать ядро ​​Linux, когда вы работаете в операционной системе Windows. Это вряд ли хорошо закончить :-)

MinGW является минималистским GNU для Windows, способом использования gcc набора инструментов для написания приложений Windows. Поэтому вы должны следовать правилам Windows.

+0

+1. Хорошо поймал. :) –

+0

как скомпилировать программу 8086 с помощью nasm –

+0

Вы _compiling_ (сборка, технически) это правильно, кроме параметров. Я не думаю, что вы хотите использовать формат ELF (поскольку это не так, как это делает Windows) или формат BIN (так как это плоский файл (например, древние COM-файлы), а не формат EXE). Ваша проблема заключается не столько в компиляции _process_, сколько в исходном коде, который вы компилируете. Вам нужно написать код, который может разговаривать с ОС Windows, а не с Linux. Например, http://stackoverflow.com/questions/572818/best-book-to-learn-windows-assembly-programming. – paxdiablo

2

Помимо вашего кода, вызывающего ядро ​​linux, как указано в paxdiablo, вы собрали его в двоичную форму с плоской формой, которая не будет работать под окнами. Вам нужно использовать nasm -f win32.

+0

как скомпилировать программу 8086, используя nasm –

Смежные вопросы