1 ; printf1_64.asm print an integer from storage and from a register 2 ; Assemble: nasm -f elf64 -l printf1_64.lst printf1_64.asm 3 ; Link: gcc -o printf1_64 printf1_64.o 4 ; Run: ./printf1_64 5 ; Output: a=5, rax=7 6 7 ; Equivalent C code 8 ; /* printf1.c print a long int, 64-bit, and an expression */ 9 ; #include 10 ; int main() 11 ; { 12 ; long int a=5; 13 ; printf("a=%ld, rax=%ld\n", a, a+2); 14 ; return 0; 15 ; } 16 17 ; Declare external function 18 extern printf ; the C function, to be called 19 20 SECTION .data ; Data section, initialized variables 21 22 00000000 0500000000000000 a: dq 5 ; long int a=5; 23 00000008 613D256C642C207261- fmt: db "a=%ld, rax=%ld", 10, 0 ; The printf format, "\n",'0' 24 00000011 783D256C640A00 25 26 27 SECTION .text ; Code section. 28 29 global main ; the standard gcc entry point 30 main: ; the program label for the entry point 31 00000000 55 push rbp ; set up stack frame 32 33 00000001 488B0425[00000000] mov rax,[a] ; put "a" from store into register 34 00000009 4883C002 add rax,2 ; a+2 add constant 2 35 0000000D 48BF- mov rdi,fmt ; format for printf 36 0000000F [0800000000000000] 37 00000017 488B3425[00000000] mov rsi,[a] ; first parameter for printf 38 0000001F 4889C2 mov rdx,rax ; second parameter for printf 39 00000022 B800000000 mov rax,0 ; no xmm registers 40 00000027 E8(00000000) call printf ; Call C function 41 42 0000002C 5D pop rbp ; restore stack 43 44 0000002D B800000000 mov rax,0 ; normal, no error, return value 45 00000032 C3 ret ; return 46