first commit
This commit is contained in:
41
hello.asm
Normal file
41
hello.asm
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user