Cygwin: Assembly language development?-Collection of common programming errors
You can totally run assembly programs in Cygwin. I’m guessing that your load failed because there’s a bunch of stuff that has to happen between when Windows executes a process and when you get to the main
function. When gcc is given assembly as input, it will link in the appropriate boilerplate code to generate a valid executable.
Here’s a sample assembly program. Save it as hello.s:
.intel_syntax noprefix
.section .text
.globl _main
_main:
enter 0, 0
// welcome message
push OFFSET s_HelloWorld
call _printf
pop eax
// add three numbers
push 2
push 4
push 5
call _addThree
add esp, 3 * 4
// print returned value
push eax
push OFFSET s_PercentD
call _printf
add esp, 2 * 4
xor eax, eax
leave
ret
// Add three numbers
_addThree:
enter 0, 0
mov eax, DWORD PTR [ebp + 8]
add eax, DWORD PTR [ebp + 12]
add eax, DWORD PTR [ebp + 16]
leave
ret
.section .rdata
s_HelloWorld:
.ascii "Hello, world.\n\0"
s_PercentD:
.asciz "%d\n"
then run it with
$ gcc -mno-cygwin hello.s -o hello && ./hello
Hello, world.
11
The reference for your processor’s assembly instructions are contained in the AMD64 Architecture Programmer’s Manual. The C calling convention is documented in this page from the Internet Archive; maybe you can find a similar one that still has the images?
Note that Cygwin will only do 32-bit assembly right now; the (non-consumer) world is all 64 bits now, and in 64-bit mode on modern processors you have many more registers and different calling conventions.