; ------------------------------------------------------------------
; helloworld.asm
;
; This is a Win32 console program that writes "Hello World"
; on a single line and then exits.
;
; To assemble to .obj: nasm -f win32 helloworld.asm
; To compile to .exe:  gcc helloworld.obj -o helloworld.exe
; ------------------------------------------------------------------
 
global _main ; _start
 
; The data section is used for declaring initialized data or constants. 
; This data does not change at runtime. 
; You can declare various constant values, file names or buffer size etc. in this section.
section .data
	msg 		db 0xA, 'Hello World!', 0xA, 0	; Hello World message. 
												; 0xA (10) is hex for (NL), carriage return
												; 0 terminates the line
	msglen 		equ $ - msg						; length of the Hello World message.
 
	mydate 		dw "06-Jan-2024 07:55 AM", 0xA	; Today's Date.
	mydatelen	equ $ - mydate					; Length of mydate variable.
 
	s2 times 9 db '*' 							; print '*' 9 times
 
; The bss section is used for declaring variables.
section .bss
 
 
; The text section is used for keeping the actual code. 
; This section must begin with the declarationglobal main, 
; which tells the kernel where the program execution begins.
section .text
 
; _start:
_main:
	; print '*' 9 times.
	mov		edx, 9			; message length
	mov		ecx, s2			; message to write
	mov 	ebx, 01h		; file descriptor (stdout)
	mov 	eax, 04h		; system call number (sys_write)
	int 	0x80			; call kernel
 
	; Print message "Hello World".
	mov		edx, msglen		; message length
	mov		ecx, msg		; message to write
	mov 	ebx, 01h		; file descriptor (stdout)
	mov 	eax, 04h		; system call number (sys_write)
	int 	0x80			; call kernel
 
	; Print current system date.
	mov		edx, mydatelen	; message length
	mov		ecx, mydate		; message to write
	mov 	ebx, 01h		; file descriptor (stdout)
	mov 	eax, 04h		; system call number (sys_write)
	int 	0x80			; call kernel
 
	; print '*' 9 times.
	mov		edx, 9			; message length
	mov		ecx, s2			; message to write
	mov 	ebx, 01h		; file descriptor (stdout)
	mov 	eax, 04h		; system call number (sys_write)
	int 	0x80			; call kernel
 
	jmp		exit
 
exit:
	mov		eax, 01h		; exit()
	xor		ebx, ebx		; errno
	int		80h
 
				OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KOyBoZWxsb3dvcmxkLmFzbQo7CjsgVGhpcyBpcyBhIFdpbjMyIGNvbnNvbGUgcHJvZ3JhbSB0aGF0IHdyaXRlcyAiSGVsbG8gV29ybGQiCjsgb24gYSBzaW5nbGUgbGluZSBhbmQgdGhlbiBleGl0cy4KOwo7IFRvIGFzc2VtYmxlIHRvIC5vYmo6IG5hc20gLWYgd2luMzIgaGVsbG93b3JsZC5hc20KOyBUbyBjb21waWxlIHRvIC5leGU6ICBnY2MgaGVsbG93b3JsZC5vYmogLW8gaGVsbG93b3JsZC5leGUKOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmdsb2JhbCBfbWFpbiA7IF9zdGFydAoKOyBUaGUgZGF0YSBzZWN0aW9uIGlzIHVzZWQgZm9yIGRlY2xhcmluZyBpbml0aWFsaXplZCBkYXRhIG9yIGNvbnN0YW50cy4gCjsgVGhpcyBkYXRhIGRvZXMgbm90IGNoYW5nZSBhdCBydW50aW1lLiAKOyBZb3UgY2FuIGRlY2xhcmUgdmFyaW91cyBjb25zdGFudCB2YWx1ZXMsIGZpbGUgbmFtZXMgb3IgYnVmZmVyIHNpemUgZXRjLiBpbiB0aGlzIHNlY3Rpb24uCnNlY3Rpb24gLmRhdGEKCW1zZyAJCWRiIDB4QSwgJ0hlbGxvIFdvcmxkIScsIDB4QSwgMAk7IEhlbGxvIFdvcmxkIG1lc3NhZ2UuIAoJCQkJCQkJCQkJCQk7IDB4QSAoMTApIGlzIGhleCBmb3IgKE5MKSwgY2FycmlhZ2UgcmV0dXJuCgkJCQkJCQkJCQkJCTsgMCB0ZXJtaW5hdGVzIHRoZSBsaW5lCgltc2dsZW4gCQllcXUgJCAtIG1zZwkJCQkJCTsgbGVuZ3RoIG9mIHRoZSBIZWxsbyBXb3JsZCBtZXNzYWdlLgoJCglteWRhdGUgCQlkdyAiMDYtSmFuLTIwMjQgMDc6NTUgQU0iLCAweEEJOyBUb2RheSdzIERhdGUuCglteWRhdGVsZW4JZXF1ICQgLSBteWRhdGUJCQkJCTsgTGVuZ3RoIG9mIG15ZGF0ZSB2YXJpYWJsZS4KCQoJczIgdGltZXMgOSBkYiAnKicgCQkJCQkJCTsgcHJpbnQgJyonIDkgdGltZXMKCjsgVGhlIGJzcyBzZWN0aW9uIGlzIHVzZWQgZm9yIGRlY2xhcmluZyB2YXJpYWJsZXMuCnNlY3Rpb24gLmJzcwoKCjsgVGhlIHRleHQgc2VjdGlvbiBpcyB1c2VkIGZvciBrZWVwaW5nIHRoZSBhY3R1YWwgY29kZS4gCjsgVGhpcyBzZWN0aW9uIG11c3QgYmVnaW4gd2l0aCB0aGUgZGVjbGFyYXRpb25nbG9iYWwgbWFpbiwgCjsgd2hpY2ggdGVsbHMgdGhlIGtlcm5lbCB3aGVyZSB0aGUgcHJvZ3JhbSBleGVjdXRpb24gYmVnaW5zLgpzZWN0aW9uIC50ZXh0Cgo7IF9zdGFydDoKX21haW46Cgk7IHByaW50ICcqJyA5IHRpbWVzLgoJbW92CQllZHgsIDkJCQk7IG1lc3NhZ2UgbGVuZ3RoCgltb3YJCWVjeCwgczIJCQk7IG1lc3NhZ2UgdG8gd3JpdGUKCW1vdiAJZWJ4LCAwMWgJCTsgZmlsZSBkZXNjcmlwdG9yIChzdGRvdXQpCgltb3YgCWVheCwgMDRoCQk7IHN5c3RlbSBjYWxsIG51bWJlciAoc3lzX3dyaXRlKQoJaW50IAkweDgwCQkJOyBjYWxsIGtlcm5lbAoJCgk7IFByaW50IG1lc3NhZ2UgIkhlbGxvIFdvcmxkIi4KCW1vdgkJZWR4LCBtc2dsZW4JCTsgbWVzc2FnZSBsZW5ndGgKCW1vdgkJZWN4LCBtc2cJCTsgbWVzc2FnZSB0byB3cml0ZQoJbW92IAllYngsIDAxaAkJOyBmaWxlIGRlc2NyaXB0b3IgKHN0ZG91dCkKCW1vdiAJZWF4LCAwNGgJCTsgc3lzdGVtIGNhbGwgbnVtYmVyIChzeXNfd3JpdGUpCglpbnQgCTB4ODAJCQk7IGNhbGwga2VybmVsCgkKCTsgUHJpbnQgY3VycmVudCBzeXN0ZW0gZGF0ZS4KCW1vdgkJZWR4LCBteWRhdGVsZW4JOyBtZXNzYWdlIGxlbmd0aAoJbW92CQllY3gsIG15ZGF0ZQkJOyBtZXNzYWdlIHRvIHdyaXRlCgltb3YgCWVieCwgMDFoCQk7IGZpbGUgZGVzY3JpcHRvciAoc3Rkb3V0KQoJbW92IAllYXgsIDA0aAkJOyBzeXN0ZW0gY2FsbCBudW1iZXIgKHN5c193cml0ZSkKCWludCAJMHg4MAkJCTsgY2FsbCBrZXJuZWwKCgk7IHByaW50ICcqJyA5IHRpbWVzLgoJbW92CQllZHgsIDkJCQk7IG1lc3NhZ2UgbGVuZ3RoCgltb3YJCWVjeCwgczIJCQk7IG1lc3NhZ2UgdG8gd3JpdGUKCW1vdiAJZWJ4LCAwMWgJCTsgZmlsZSBkZXNjcmlwdG9yIChzdGRvdXQpCgltb3YgCWVheCwgMDRoCQk7IHN5c3RlbSBjYWxsIG51bWJlciAoc3lzX3dyaXRlKQoJaW50IAkweDgwCQkJOyBjYWxsIGtlcm5lbAoJCglqbXAJCWV4aXQKCmV4aXQ6Cgltb3YJCWVheCwgMDFoCQk7IGV4aXQoKQoJeG9yCQllYngsIGVieAkJOyBlcnJubwoJaW50CQk4MGgK