;---------------------------------------------------; ; App: MASM printf usage ; ; Version: 1.0 ; ;---------------------------------------------------; ; Date: 04 June 2017 ; ; Author: Jose Madureira ; ; License: copy at will, just give credit ; ;---------------------------------------------------; ; ## Global Constants ## NL EQU 0Dh,0Ah ;new line TAB EQU 09h ;tab character STRMAX EQU 21 ;max string size T64 EQU TYPE RAX ;64 bit size (8 BYTES) ; ## External Prototypes ## includelib msvcrt.lib ;necessary for printf EXTRN printf:PROC ;display formatted string with args ExitProcess PROTO ;terminate program .data msgNl byte NL,0 ;simply a new line ;simple formats msgInt byte "%d",0 msgFlt byte "%f",0 msgStr byte "%s",0 ;test data valInt qword 666 valFlt real8 6.54321 valStr byte "This is not a test",0 valStrNlTab byte NL,TAB,"new lined and tabbed",0 .code PUBLIC Main Main PROC ;display an integer mov rax,1 mov rcx,offset msgInt ;"%d" mov rdx,valInt ;some integer value call PrintfMe64 ;display new line using PrintfMe64 mov rax,1 mov rcx,offset msgStr ;"%s" mov rdx,offset msgNl ;crlf call PrintfMe64 ;display a float mov rax,1 mov rcx,offset msgFlt ;"%f" mov rdx,valFlt ;some float value call PrintfMe64 ;display new line using PNL -> PrintfMe64 call PNL ;display a string mov rax,1 mov rcx,offset msgStr ;"%s" mov rdx,offset valStr ;some string call PrintfMe64 ;display a string with new line and tab before it mov rax,1 mov rcx,offset msgStr ;"%s" mov rdx,offset valStrNlTab ;new line -> tab -> string call PrintfMe64 finish: call PNL call PNL call ExitProcess Main ENDP ; ******************************************************************* PrintfMe64 PROC uses RAX ; * Purpose: display a 'c' style formated message and arguments * ; *-----------------------------------------------------------------* ; * IN : RAX, number of arguments * ; * RCX, message with format flags * ; * RDX...R15, arguments for formatted message * ; * OUT: none * ; *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* ; * implementation idea: * ; * http://cx20.main.jp/blog/hello/2012/01/04/hello-masm-world * ; ******************************************************************* ;prevent disaster push RBP mov RBP, RSP imul RAX, 8 ;allocate additional 8 bytes per argument add RAX, 64 ;(8*args) + 64 bytes mov [RBP], RAX ;save total allocated local space sub RSP, RAX ;allocate local stack space call printf ;display formated message add RSP, [RBP] ;clean the stack pop RBP ret PrintfMe64 ENDP ; ******************************************************************* PNL PROC uses RAX RCX RDX ; * Purpose: displays a new line * ; *-----------------------------------------------------------------* ; * IN : none * ; * OUT: none * ; ******************************************************************* mov rax,1 mov rcx,offset msgStr ;"%s" mov rdx,offset msgNl ; cr lf call PrintfMe64 ret PNL ENDP END