section .data ; section for initialized data
str: db 'Hello world!', 0Ah ; message string with new-line char at the end (10 decimal)
str_len: equ $ - str ; calcs length of string (bytes) by subtracting this' address ($ symbol) from the str's start address
section .text ; this is the code section
global _start ; _start is the entry point and needs global scope to be 'seen' by the linker -equivalent to main() in C/C++
_start: ; procedure start
mov eax, 4 ; specify the sys_write function code (from OS vector table)
mov ebx, 1 ; specify file descriptor stdout -in linux, everything's treated as a file, even hardware devices
mov ecx, str ; move start _address_ of string message to ecx register
mov edx, str_len ; move length of message (in bytes)
int 80h ; tell kernel to perform the system call we just set up - in linux services are requested through the kernel
mov eax, 1 ; specify sys_exit function code (from OS vector table)
mov ebx, 0 ; specify return code for OS (0 = everything's fine)
int 80h ; tell kernel to perform system call
c2VjdGlvbiAuZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2VjdGlvbiBmb3IgaW5pdGlhbGl6ZWQgZGF0YQpzdHI6ICAgICBkYiAnSGVsbG8gd29ybGQhJywgMEFoICAgICAgICAgOyBtZXNzYWdlIHN0cmluZyB3aXRoIG5ldy1saW5lIGNoYXIgYXQgdGhlIGVuZCAoMTAgZGVjaW1hbCkKc3RyX2xlbjogZXF1ICQgLSBzdHIgICAgICAgICAgICAgICAgICAgIDsgY2FsY3MgbGVuZ3RoIG9mIHN0cmluZyAoYnl0ZXMpIGJ5IHN1YnRyYWN0aW5nIHRoaXMnIGFkZHJlc3MgKCQgc3ltYm9sKSBmcm9tIHRoZSBzdHIncyBzdGFydCBhZGRyZXNzCiAKc2VjdGlvbiAudGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgdGhpcyBpcyB0aGUgY29kZSBzZWN0aW9uCmdsb2JhbCBfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICA7IF9zdGFydCBpcyB0aGUgZW50cnkgcG9pbnQgYW5kIG5lZWRzIGdsb2JhbCBzY29wZSB0byBiZSAnc2VlbicgYnkgdGhlIGxpbmtlciAtZXF1aXZhbGVudCB0byBtYWluKCkgaW4gQy9DKysKX3N0YXJ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcHJvY2VkdXJlIHN0YXJ0CiAgICAgICAgbW92ICAgIGVheCwgNCAgICAgICAgICAgICAgICAgICA7IHNwZWNpZnkgdGhlIHN5c193cml0ZSBmdW5jdGlvbiBjb2RlIChmcm9tIE9TIHZlY3RvciB0YWJsZSkKICAgICAgICBtb3YgICAgZWJ4LCAxICAgICAgICAgICAgICAgICAgIDsgc3BlY2lmeSBmaWxlIGRlc2NyaXB0b3Igc3Rkb3V0IC1pbiBsaW51eCwgZXZlcnl0aGluZydzIHRyZWF0ZWQgYXMgYSBmaWxlLCBldmVuIGhhcmR3YXJlIGRldmljZXMKICAgICAgICBtb3YgICAgZWN4LCBzdHIgICAgICAgICAgICAgICAgIDsgbW92ZSBzdGFydCBfYWRkcmVzc18gb2Ygc3RyaW5nIG1lc3NhZ2UgdG8gZWN4IHJlZ2lzdGVyCiAgICAgICAgbW92ICAgIGVkeCwgc3RyX2xlbiAgICAgICAgICAgICA7IG1vdmUgbGVuZ3RoIG9mIG1lc3NhZ2UgKGluIGJ5dGVzKQogICAgICAgIGludCAgICA4MGggICAgICAgICAgICAgICAgICAgICAgOyB0ZWxsIGtlcm5lbCB0byBwZXJmb3JtIHRoZSBzeXN0ZW0gY2FsbCB3ZSBqdXN0IHNldCB1cCAtIGluIGxpbnV4IHNlcnZpY2VzIGFyZSByZXF1ZXN0ZWQgdGhyb3VnaCB0aGUga2VybmVsCiAgICAgICAgbW92ICAgIGVheCwgMSAgICAgICAgICAgICAgICAgICA7IHNwZWNpZnkgc3lzX2V4aXQgZnVuY3Rpb24gY29kZSAoZnJvbSBPUyB2ZWN0b3IgdGFibGUpCiAgICAgICAgbW92ICAgIGVieCwgMCAgICAgICAgICAgICAgICAgICA7IHNwZWNpZnkgcmV0dXJuIGNvZGUgZm9yIE9TICgwID0gZXZlcnl0aGluZydzIGZpbmUpCiAgICAgICAgaW50ICAgIDgwaCAgICAgICAgICAgICAgICAgICAgICA7IHRlbGwga2VybmVsIHRvIHBlcmZvcm0gc3lzdGVtIGNhbGw=