; By The Almighty Pegasus Epsilon <pegasus@pimpninjas.org>
;
; More info at http://www.deater.net/weave/vmwprod/asm/ascii_asm.html
;
; Never say "it can't be done" to me.
;
; Oh, and you'll need NASM. Tough breaks, Vinnie.

BITS 32	; for assembling into bin format, to prove it's really all ascii

	SECTION .code	progbits write align=2
	global _start

_start:
	xor	al, 0x3C	; put string length (28) into edx
	and	al, 0x5C	; "
	push	eax		; "
	pop	edx		; "
	
	xor	eax, 0x3A6A3A36	; make newline
	xor	eax, 0x30445445	; "
	push	eax		; build string on stack
	push	"o so"		; "
	push	"y to"		; "
	push	"p wa"		; "
	push	"ve u"		; "
	push	"e ga"		; "
	push	"Vinc"		; "
	push	esp		; put pointer to string into ecx
	pop	ecx		; "

	sub	eax, 0x56634F36	; mov eax, 0x080480CD
	sub	eax, 0x56634F36 ; "
	sub	eax, 0x55634F36 ; "
	push	eax		; save 0x80CD for later
	pop	ebp		; "

	xor	ax, 0x5078	; point stack to end + 8
	xor	ax, 0x4057	; point stack to end + 8
	push	eax		; "
	pop	esp		; "

	xor	al, 0x37	; point eax to int80 + 2
	push	eax		; save int80 offset
	push	ebp		; make int80
	pop	eax		; load int80 into ax
	pop	esp		; load int80 offset
	push	ax		; make int80

	inc	ebx		; ebx = 1 == stdout

	xor	eax, 0x4B444B4B	; mov	eax, 4 == write()
	and	eax, 0x34343444	; "
.int80
	db	'!!'		; int80h

	dec	ebx		; ebx == 0 (no error)

	xor	al, 0x41	; mov	eax, 1 == _exit()
	and	al, 0x21	; "
.end

