const string message = "Hello World!\n"; const int length = 14; int main() { write(1, &message;, length); return 0; }
write
ssize_t write(int fd, const void buf[count], size_t count);
man 2 write
; This is a program
mv eax, 60 ; move 60 to the extended e register.
section .data
global _start
mov rsi, message
message: db "Hello World!",&0x0A
(message)
global _start
(_start, not global, that is a directive)
message: db "Hello World!",&0x0A
(message)
section .data
message: db "Hello World!", 0x0A
gdb hello // a bunch of text break 10 // also b 10 run // also r x &message // not what we wanted, but what is happening here? x &message/s message
od -x hello
message_length: equ $ - message
message_length
global _start
_start
mov rsi, message
mov
is the mnemonic
rsi
and message
are the arguments or operands.
syscall