1 ; printf2_64.asm use "C" printf on char, string, int, long int, float, double 2 ; 3 ; Assemble: nasm -f elf64 -l printf2_64.lst printf2_64.asm 4 ; Link: gcc -m64 -o printf2_64 printf2_64.o 5 ; Run: ./printf2_64 > printf2_64.out 6 ; Output: cat printf2_64.out 7 ; 8 ; A similar "C" program printf2_64.c 9 ; #include 10 ; int main() 11 ; { 12 ; char char1='a'; /* sample character */ 13 ; char str1[]="mystring"; /* sample string */ 14 ; int len=9; /* sample string */ 15 ; int inta1=12345678; /* sample integer 32-bit */ 16 ; long int inta2=12345678900; /* sample long integer 64-bit */ 17 ; long int hex1=0x123456789ABCD; /* sample hexadecimal 64-bit*/ 18 ; float flt1=5.327e-30; /* sample float 32-bit */ 19 ; double flt2=-123.4e300; /* sample double 64-bit*/ 20 ; 21 ; printf("printf2_64: flt2=%e\n", flt2); 22 ; printf("char1=%c, srt1=%s, len=%d\n", char1, str1, len); 23 ; printf("char1=%c, srt1=%s, len=%d, inta1=%d, inta2=%ld\n", 24 ; char1, str1, len, inta1, inta2); 25 ; printf("hex1=%lX, flt1=%e, flt2=%e\n", hex1, flt1, flt2); 26 ; return 0; 27 ; } 28 extern printf ; the C function to be called 29 30 SECTION .data ; Data section 31 32 ; format strings for printf 33 00000000 7072696E7466323A20- fmt2: db "printf2: flt2=%e", 10, 0 34 00000009 666C74323D25650A00 35 00000012 63686172313D25632C- fmt3: db "char1=%c, str1=%s, len=%d", 10, 0 36 0000001B 20737472313D25732C- 37 00000024 206C656E3D25640A00 38 0000002D 63686172313D25632C- fmt4: db "char1=%c, str1=%s, len=%d, inta1=%d, inta2=%ld", 10, 0 39 00000036 20737472313D25732C- 40 0000003F 206C656E3D25642C20- 41 00000048 696E7461313D25642C- 42 00000051 20696E7461323D256C- 43 0000005A 640A00 44 0000005D 686578313D256C582C- fmt5: db "hex1=%lX, flt1=%e, flt2=%e", 10, 0 45 00000066 20666C74313D25652C- 46 0000006F 20666C74323D25650A- 47 00000078 00 48 49 00000079 61 char1: db 'a' ; a character 50 0000007A 6D79737472696E6700 str1: db "mystring",0 ; a C string, "string" needs 0 51 len: equ $-str1 ; len has value, not an address 52 00000083 4E61BC00 inta1: dd 12345678 ; integer 12345678, note dd 53 00000087 341CDCDF02000000 inta2: dq 12345678900 ; long integer 12345678900, note dq 54 0000008F CDAB896745230100 hex1: dq 0x123456789ABCD ; long hex constant, note dq 55 00000097 BB16D80E flt1: dd 5.327e-30 ; 32-bit floating point, note dd 56 0000009B 6ED768D3250BA7FE flt2: dq -123.456789e300 ; 64-bit floating point, note dq 57 58 SECTION .bss 59 60 00000000 flttmp: resq 1 ; 64-bit temporary for printing flt1 61 62 SECTION .text ; Code section. 63 64 global main ; "C" main program 65 main: ; label, start of main program 66 00000000 55 push rbp ; set up stack frame 67 00000001 D90425[97000000] fld dword [flt1] ; need to convert 32-bit to 64-bit 68 00000008 DD1C25[00000000] fstp qword [flttmp] ; floating load makes 80-bit, 69 ; store as 64-bit 70 0000000F 48BF- mov rdi,fmt2 71 00000011 [0000000000000000] 72 00000019 F30F7E0425- movq xmm0, qword [flt2] 73 0000001E [9B000000] 74 00000022 B801000000 mov rax, 1 ; 1 xmm register 75 00000027 E8(00000000) call printf 76 77 0000002C 48BF- mov rdi, fmt3 ; first arg, format 78 0000002E [1200000000000000] 79 00000036 488B3425[79000000] mov rsi, [char1] ; second arg, char 80 0000003E 48BA- mov rdx, str1 ; third arg, string 81 00000040 [7A00000000000000] 82 00000048 B909000000 mov rcx, len ; fourth arg, int 83 0000004D B800000000 mov rax, 0 ; no xmm used 84 00000052 E8(00000000) call printf 85 86 00000057 48BF- mov rdi, fmt4 ; first arg, format 87 00000059 [2D00000000000000] 88 00000061 488B3425[79000000] mov rsi, [char1] ; second arg, char 89 00000069 48BA- mov rdx, str1 ; third arg, string 90 0000006B [7A00000000000000] 91 00000073 B909000000 mov rcx, len ; fourth arg, int 92 00000078 4C8B0425[83000000] mov r8, [inta1] ; fifth arg, inta1 32->64 93 00000080 4C8B0C25[87000000] mov r9, [inta2] ; sixth arg, inta2 94 00000088 B800000000 mov rax, 0 ; no xmm used 95 0000008D E8(00000000) call printf 96 97 00000092 48BF- mov rdi, fmt5 ; first arg, format 98 00000094 [5D00000000000000] 99 0000009C 488B3425[8F000000] mov rsi, [hex1] ; second arg, char 100 000000A4 F30F7E0425- movq xmm0, qword [flttmp] ; first double 101 000000A9 [00000000] 102 000000AD F30F7E0C25- movq xmm1, qword [flt2] ; second double 103 000000B2 [9B000000] 104 000000B6 B802000000 mov rax, 2 ; 2 xmm used 105 000000BB E8(00000000) call printf 106 107 000000C0 5D pop rbp ; restore stack 108 000000C1 B800000000 mov rax, 0 ; exit code, 0=normal 109 000000C6 C3 ret ; main returns to operating system