format ELF64 executable 3

SYMBOL_TABLE_ENTRY64.size = $18
RELOC_TABLE_ENTRY64.size = $18
StrTabEntry equ -STRING_TABLE+
R_X86_64_JUMP_SLOT = 7

DT_NULL         = 0
DT_NEEDED       = 1
DT_HASH         = 4
DT_STRTAB       = 5
DT_SYMTAB       = 6
DT_RELA         = 7
DT_RELASZ       = 8
DT_RELENT       = 9
DT_STRSZ        = 10
DT_SYMENT       = 11

win_width       =       400
win_height      =       60
sys_exit        = 	$3C
msg_x	     = 16
msg_y	     = 16

segment interpreter readable
        db '/lib64/ld-linux-x86-64.so.2',0

segment dynamic readable
DYNAMIC_TABLE:
        dq DT_NEEDED,StrTabEntry(str@libX11.so.6)
        dq DT_STRTAB,STRING_TABLE
        dq DT_SYMTAB,SYMBOL_TABLE
        dq DT_RELA,RELOC_TABLE
        dq DT_RELASZ,relasz
        dq DT_RELENT,RELOC_TABLE_ENTRY64.size
        dq DT_STRSZ,strsz
        dq DT_SYMENT,SYMBOL_TABLE_ENTRY64.size
        dq DT_NULL,0

SYMBOL_TABLE:
        dd 0,0,0,0,0,0
        dd StrTabEntry(str@XMapRaised),$12,0,0,0,0
        dd StrTabEntry(str@XCreateSimpleWindow),$12,0,0,0,0
        dd StrTabEntry(str@XNextEvent),$12,0,0,0,0
        dd StrTabEntry(str@XSelectInput),$12,0,0,0,0
        dd StrTabEntry(str@XOpenDisplay),$12,0,0,0,0
        dd StrTabEntry(str@XCreateGC),$12,0,0,0,0
        dd StrTabEntry(str@XDrawString),$12,0,0,0,0
        dd StrTabEntry(str@XSetFont),$12,0,0,0,0
        dd StrTabEntry(str@XLoadFont),$12,0,0,0,0
        dd StrTabEntry(str@XDefaultRootWindow),$12,0,0,0,0
        dd StrTabEntry(str@XDefaultGC),$12,0,0,0,0 

STRING_TABLE:                   db 0
str@libX11.so.6                 db 'libX11.so.6',0
str@XMapRaised                  db 'XMapRaised',0
str@XCreateSimpleWindow         db 'XCreateSimpleWindow',0
str@XNextEvent                  db 'XNextEvent',0
str@XSelectInput                db 'XSelectInput',0
str@XOpenDisplay                db 'XOpenDisplay',0
str@XCreateGC                   db 'XCreateGC',0
str@XDrawString                 db 'XDrawString',0
str@XSetFont                    db 'XSetFont',0
str@XLoadFont                   db 'XLoadFont',0
str@XDefaultRootWindow          db 'XDefaultRootWindow',0
str@XDefaultGC                  db 'XDefaultGC',0
strsz = $-STRING_TABLE

align $8

RELOC_TABLE:
        dq XMapRaised,          R_X86_64_JUMP_SLOT+ 1 shl 32, 0
        dq XCreateSimpleWindow, R_X86_64_JUMP_SLOT+ 2 shl 32, 0
        dq XNextEvent,          R_X86_64_JUMP_SLOT+ 3 shl 32, 0
        dq XSelectInput,        R_X86_64_JUMP_SLOT+ 4 shl 32, 0
        dq XOpenDisplay,        R_X86_64_JUMP_SLOT+ 5 shl 32, 0
        dq XCreateGC,           R_X86_64_JUMP_SLOT+ 6 shl 32, 0
        dq XDrawString,         R_X86_64_JUMP_SLOT+ 7 shl 32, 0
        dq XSetFont,            R_X86_64_JUMP_SLOT+ 8 shl 32, 0
        dq XLoadFont,           R_X86_64_JUMP_SLOT+ 9 shl 32, 0
        dq XDefaultRootWindow,  R_X86_64_JUMP_SLOT+ 10 shl 32, 0
        dq XDefaultGC,   	R_X86_64_JUMP_SLOT+ 11 shl 32, 0
        relasz = $-RELOC_TABLE

segment readable writeable executable

entry $
	;Display *XOpenDisplay(char *display_name);
        xor     edi,edi
        call    [XOpenDisplay]
        mov     qword [disp],rax
        
        ;Window XDefaultRootWindow(Display *display);
        mov	rdi, qword [disp]
        call	[XDefaultRootWindow]
        mov	qword [root], rax
        
        ;Window XCreateSimpleWindow(Display *display, Window parent, intx, y, unsignedintwidth, height, unsignedint border_width, unsignedlong border, unsignedlong background);
        
        push	0xFFFFFF
        push	0
        push	0
        mov     r9, win_height
        mov     r8, win_width
        xor     rcx, rcx
        xor     rdx, rdx
        mov     rsi, qword [root]
        mov	rdi, qword [disp]
        call    [XCreateSimpleWindow]
        mov     qword [win],rax

        ;GC XDefaultGC(Display *display, int screen_number);
     	xor	rsi, rsi
        mov	rdi, qword [disp]
        call	[XDefaultGC]
        mov	qword [gc], rax 
        
        ;XMapRaised(Display *display, Window w);
        mov     rsi,qword [win]
        mov     rdi,qword [disp]
        call    [XMapRaised]
        
        ;XSelectInput(Display *display, Window w, long event_mask);
        ;xor     edx,edx
        mov	edx, 1
        shl	edx, 15
        mov	rsi, qword [win]
        mov     rdi,qword [disp]
        call    [XSelectInput] 
        
        ;Font XLoadFont(Display *display, char *name);
        lea	rsi, [font_name]
        mov	rdi, qword [disp]
        call	[XLoadFont] 
        mov	qword [font_id], rax
        
        ;XSetFont(Display *display, GC gc, Font font);
        mov     rdx, qword [font_id]
        mov	rsi, qword [gc]
        mov 	rdi, qword [disp]
        call	[XSetFont] 

	mov     eax, 0x80000002
      	cpuid
      	mov     dword [cpu], eax
      	mov     dword [cpu + 4], ebx
     	mov     dword [cpu + 8], ecx
      	mov     dword [cpu + 12], edx
     	mov     eax, 0x80000003
     	cpuid
     	mov     dword [cpu + 16], eax
   	mov     dword [cpu + 20], ebx
    	mov     dword [cpu + 24], ecx
     	mov     dword [cpu + 28], edx
     	mov     eax, 0x80000004
     	cpuid
     	mov     dword [cpu + 32], eax
     	mov     dword [cpu + 36], ebx
    	mov     dword [cpu + 40], ecx
     	mov     dword [cpu + 44], edx
        
event_loop:
        lea     rsi,[event]
        mov     rdi,qword [disp]
        call    [XNextEvent]

        ;XDrawString(Display *display, Drawable d, GC gc, int x, int y, char *string, int length);        
        push	48
	lea	r9, [cpu]
	mov	r8, msg_y        
        mov	rcx, msg_x
        mov     rdx, qword [gc]
        mov     rsi,qword [win]  ;drawable
        mov     rdi,qword [disp]
        call    [XDrawString] 

        jmp     event_loop

;        mov     rsi,qword [gc]
;        mov     rdi,qword [disp]
;        call    [XFreeGC]

;        mov     rdi,qword [disp]
;        call    [XCloseDisplay]

segment readable writeable
disp            dq ?
root		dq ?
win             dq ?
gc    		dq ?,?
msg		db "Hello World!",0
len		= $ - msg
font_name	db "fixed",0  
;font_name	db "*helvetica-bold-r-normal--18*",0
font_id		dq ?
cpu		rb 48

event           rb $C0
align 8
virtual
        XMapRaised              dq ?
        XCreateSimpleWindow     dq ?
        XNextEvent              dq ?
        XSelectInput            dq ?
        XOpenDisplay            dq ?
        XCreateGC               dq ?
        XDrawString             dq ?
        XSetFont                dq ?
        XLoadFont               dq ?
        XDefaultRootWindow      dq ?
        XDefaultGC	        dq ?
end virtual    

