I am starting to learn x86 assembly on Windows. I am learning 32 bit x86 assembly. I use nasm and ld in order to compile my programs. I use a mingw32-make makefile as my build system. I am assuming ld came included with MinGW, but I am not sure of that. All I know is that it was already on my computer.
I wanted to compile a very simple program just to make sure everything was working and of course, it wasn't. When running my executable, a giant blue box came up and said 'This app cant run on your pc' and after closing the notification, the words Access is denied printed out onto my terminal.
This is my program:
global _main
_main:
mov eax, 1
ret
And this is my makefile:
main: learn.asm
nasm -f win32 learn.asm -o learn.o
ld learn.o -o learn.exe
Could someone help me fix this?
Originally your question asked about using _start as an entry point. The way you were linking didn't include the C runtime.
With some versions of Windows you may get the error This app cant run on your pc when linking with MinGW LD if there is no .rdata (read only data) section under some circumstances. One circumstance appears to be an executable with an .idata section (import directory) not referenced by the header and doesn't contain an .rdata section. This appears to be the case when the MinGW LD linker creates the executable from your code when not using a C runtime. To fix the problem add an .rdata section with at least one byte of data. This should work:
global _start
section .rdata
db 0
section .text
_start:
mov eax, 1
ret
You also need to place your code in the .text section or you may encounter other problems. You can then assemble and link with:
nasm -fwin32 learn.asm -o learn.obj
ld -o learn.obj -o learn.exe
If you want to use _main and intend to use the C runtime then you don't need to create an .rdata section, however you would assemble and link with:
nasm -fwin32 learn.asm -o learn.obj
gcc -m32 learn.obj -o learn.exe
Alternatively you can use a different linker than LD. GoLink in particular should generate an executable from the code you were using. You can create a Win32 console application with a _start entry point this way:
nasm -fwin32 learn.asm -o learn.obj
golink /console /entry _start learn.obj
GoLink will produce an executable with proper headers and sections that Windows should have no problem running without the need to add an .rdata section.
If you have MSVC/C++ installed you can also use the Microsoft linker:
nasm -fwin32 learn.asm -o learn.obj
link learn.obj /entry:start /subsystem:console
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With