Assembly language examples using NASM on Windows

Console Message - 64 bit

Console Message 64

Output a message to the console window, 64 bit.



Open a console window, and run the executable.

The message length is calculated by subtracting the starting address of Message from the starting address of the line containing the $.

WriteFile was chosen instead of WriteConsoleA, as the output can be redirected to a file using > filename

WriteFile takes 5 parameters. The 5th is placed on to the stack.

All RSP subtraction and addition is written out in full before and after each Windows API function call, this is to make it clear as to what needs to be done.


                                                ; Console Message, 64 bit. V1.02
NULL              EQU 0                         ; Constants

extern GetStdHandle                             ; Import external symbols
extern WriteFile                                ; Windows API functions, not decorated
extern ExitProcess

global Start                                    ; Export symbols. The entry point

section .data                                   ; Initialized data segment
 Message        db "Console Message 64", 0Dh, 0Ah
 MessageLength  EQU $-Message                   ; Address of this line ($) - address of Message

section .bss                                    ; Uninitialized data segment
alignb 8
 StandardHandle resq 1
 Written        resq 1

section .text                                   ; Code segment
 and   RSP, 0FFFFFFFFFFFFFFF0h                  ; Align the stack to a multiple of 16 bytes

 sub   RSP, 32                                  ; 32 bytes of shadow space
 call  GetStdHandle
 mov   qword [REL StandardHandle], RAX
 add   RSP, 32                                  ; Remove the 32 bytes

 sub   RSP, 32 + 8 + 8                          ; Shadow space + 5th parameter + align stack
                                                ; to a multiple of 16 bytes
 mov   RCX, qword [REL StandardHandle]          ; 1st parameter
 lea   RDX, [REL Message]                       ; 2nd parameter
 mov   R8, MessageLength                        ; 3rd parameter
 lea   R9, [REL Written]                        ; 4th parameter
 mov   qword [RSP + 4 * 8], NULL                ; 5th parameter
 call  WriteFile                                ; Output can be redirect to a file using >
 add   RSP, 48                                  ; Remove the 48 bytes

 xor   RCX, RCX
 call  ExitProcess