commit 913855fec6aaa5eb9fa1183378dc310e85b61ad8 Author: Syntax Date: Mon Oct 13 20:47:17 2025 -0300 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..8db7179 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +hello world in assembly x86_64 using linux syscalls diff --git a/hello.asm b/hello.asm new file mode 100644 index 0000000..939bcf3 --- /dev/null +++ b/hello.asm @@ -0,0 +1,41 @@ +; nah it's pretty easy. +; take a look in this hello world i made with assembly x86_64 on linux, i recommend to copy and paste +; it in vscode or other code editor to better understand it, use the .asm +; extension and compile it using NASM and GCC using the following commands: + +; nasm -f elf64 hello.asm -o hello.o +; gcc hello.o -o hello -no-pie + +; to run: +; ./hello + +; i highly recommend the "ASM Code Lens" if you're using vscode. + +; now here's the code with explanations: + +global _start ; declaring the "main function" + +section .rodata ; when "variables" is, rodata means that the variables will NOT change + msg: db "hello, assembly", 0xA ; msg is the variable name, "db" is define byte, which in our case is that string, + ; 0xA is a hex representation for newline character (/n) + msglen: equ $ - msg ; here we calculate the string "msg" length, as equ being "equate" - that defines a constant, + ;'$' being the location counter - is our current address, basically it means "how many bytes have pass since here" + +section .text ; this basically says that the code the cpu will execute is above, .text means executable code (instructions) + +_start: ; now this is the main function, here we want to make some syscalls to the OS, for print the message, +;in our case is for Linux, that follows the following parameter structure: syscall number (RAX), +;and take up to 6 arguments (RDI, RSI, RDX, R10, R8, R9 - yeah, the register R8 comes before R9), +;it's cool to know, but most of the time you'll only need the arguments required by the syscall + + mov rax, 1 ; moving constant 1 to register RAX, it means the sys_write linux's syscall + mov rdi, 1 ; moving 1 to RDI, means that the file descriptor is stdout (default linux output) + ;others include stdin (0, input) and stderr (2, error output) - this is the first argument + mov rsi, msg ; moving the string address (buffer) to rsi, second argument + mov rdx, msglen ; moving the string size to rdx, it says how many bytes msg will use + syscall ; finally, we call system. + + ; here has another syscall to exit program + mov rax, 60 ; 60th syscall: sys_exit + mov rdi, 0 ; exit status, 0 means "no errors" + syscall ; calling again \ No newline at end of file