Last active
July 25, 2019 13:23
-
-
Save jamichaels/a5e770105615d9e32b18 to your computer and use it in GitHub Desktop.
Printing an integer to stdout with printf in 64-bit NASM (Linux)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Printing an integer to stdout with printf in 64-bit NASM (Linux) | |
While doing some debugging, I found myself wanting to print an address to the screen, and it | |
took me forever to piece together how to do it from several tutorials. | |
The main things you need to know are | |
1) use 'main:' as a label and not '_start:' - because you are calling libc, it won't work without main. | |
2) compile or link with -lc (that's short for libc). | |
3) declare printf as extern | |
4) zero the vector registers (put 0 into rax). I don't know why, but apparently you are supposed to. | |
The following program is compiled thusly: | |
nasm -f elf64 -o test.o test.s | |
gcc -o test test.o -lc | |
and prints: | |
404000 | |
to stdout | |
;;;; Print a number to stdout | |
extern printf | |
global main | |
section .text | |
main: | |
mov rdi,printf_format | |
mov rsi,0x404000 | |
xor rax,rax | |
call printf | |
mov rax,60 ; exit | |
syscall | |
section .data | |
printf_format: db '%x',10,0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://stackoverflow.com/questions/36007975/compile-error-relocation-r-x86-64-pc32-against-undefined-symbol/41322328#41322328
It seems for some people -- at least, for me -- this is necessary.
So for anyone looking at this, if
doesn't work, try