; General C to fasm reference, from xolatile, with hate...
; This is not intended to be assembled or ran in current state!

format ELF64 executable 3
; Executable and linkable file format, this can be done in HLA with:
; machine
; 0x7F "ELF" ... + some more "macro" magic ...
; end machine

segment readable executable

entry $; main: ...

	; uint32_t a, b, c; c = a + b;
	mov eax, [a]
	add eax, [b]
	mov [c], eax

	; uint32_t a, b, c; c = a - b;
	mov eax, [a]
	sub eax, [b]
	mov [c], eax

	; uint32_t a, b, c; c = a * b;
	mov eax, [a]
	mul [b]
	mov [c], eax

	; uint32_t a, b, c; c = a / b;
	mov eax, [a]
	div [b]
	mov [c], eax

	; uint32_t a, b, c; c = a % b;
	mov eax, [a]
	div [b]
	mov [c], edx

	; exit (c);
	mov eax, 60
	mov edi, [c]
	syscall
	; This could be implemented also with 'end program'.

segment readable writable

a: db 11h               ; uint8_t  a = 0x11;
b: dw 1122h             ; uint16_t b = 0x1122;
c: dd 11223344h         ; uint32_t c = 0x11223344;
d: dq 1122334455667788h ; uint64_t d = 0x1122334455667788;

; I find null-terminated strings based and redpilled.
string_a: db "Heyo world!", 0     ; char   string_a [] = "Heyo world!";
string_b: db "Heyo world!", 10, 0 ; char   string_b [] = "Heyo world!\n";
string_c: db "Heyo world!", 0     ; char   string_c [] = "Heyo world!";
string_c_length: dq $-string_c    ; size_t string_c_length = sizeof (string_c);
; If you want to store the length of a string, it must be immediately after it.