.intel_syntax noprefix //Use Intel syntax, which is more readable, instead of that ridiculous GAS syntax that is the default
.code32 //32bit code/ABI
.global asm_caller
.global asm_data //Tell assembler to export these symbols referencing their addresses.
.global asm_func
.section .text //Code must be in a .text section, why "text" is beyond me.
asm_func:
mov eax, [esp+4] //ESP holds return address, +4 holds first param, +8 holds second param, etc
shl eax, 2 //Assembly trick to multiply by 4
ret //EAX holds return value.
asm_caller:
mov eax, [esp+4]
mov ebx, [esp+8]
push ebx
push eax //Pushing is in reverse order in the ABI
call _Z7cppfuncii
add esp, 8 //ABI makes it our job to clean up the mess on the callstack.
ret //EAX still holds previous return value
.section .data //Must be in a .data section if you want it to be writable without throwing a segfault/access exception.
asm_data: .long 0xdeaddead //.long is for long int (4 bytes), as opposed to short int (2 bytes) since "int" was never properly standardized.
Comments