I am trying to compile and link my first program on Assembler. I try to compile the following code:
; %include \"stud_io.inc\"
global _main
section .te
I noticed that most examples show standalone assembly programs, but it is perhaps more common for assembly to be called from C. I created a simple C program that uses a minimal nasm-assembled function like this:
extern unsigned cpuid(unsigned n);
/* ... */
unsigned n = cpuid(1);
The assembly looks like this:
section .text
global _cpuid
_cpuid:
push rbp
mov rbp, rsp
mov rax, rdi
cpuid
mov rax, rcx
leave
ret
You can see the whole thing, including nasm CLI options in the makefile, here:
https://github.com/ecashin/low/tree/master/cpuid
It does something mildly useful by printing out the availability of some CPU-specific features. (But it does that by using CPUID without checking whether it's available. If the CPU is Intel and newer than an i486, though, that's fine.)
The example is tested on Mac OS X Snow Leopard with the nasm from the ports collection. Removing the underscore prefix is the only change necessary for porting to Linux x86_64.