Well, I'm confused, Codeferever. We started out with some as86 bootsector code, and somehow slid into a dos .com file. Not a bad idea to get some stuff working as a "dosless .com file" before you try to load it from a bootsector, so here's a .com file that writes the message to 0B800h. Note that this is a segment address - the physical address would be 0B8000h.
;---------------------------------
; nasm -f bin -o hwnoint.com hwnoint.asm
org 100h
push word 0B800h ; segment of video memory
pop es ; (because stosw uses es:di)
mov di, (10 * 80 + 30) * 2 ; offset into screen
; (row * width + column) * 2 bytes/character
mov si, msg ; offset of our string
mov ah, 0B0h ; color (blinking black on cyan)
top:
lodsb ; get byte from [ds:si] into al
; and increment si for next one
or al, al ; this doesn't change al, but sets
jz depart ; the flags - if zero, we're done
stosw ; stores ax (char & color) to [es:si]
; and add 2 to di for next one
jmp short top ; do more
depart:
ret ; return to dos (or other caller)
msg db " Look, Ma! No ints! ",0 ; note 0, not '$', terminated
; '$' is just for int 21h/9
;------------------------------------
This is somewhat deceptive code - it claims "no interrupts", but ends in a "ret". Since dos has pushed a zero on the stack when it loads us, this "ret" returns us to offset zero in our current segment... where dos has placed "CD 20", as the first thing in the Program Segment Prefix. This is "int 20h", and returns us to dos, so there's a "hidden interrupt" involved. This will not work if loaded from a bootsector! (I've been known to put "CD 19" where dos puts the "CD 20" to reload system - not really the same thing.)
Sorry I didn't notice it sooner, there's an error in the last boot code you posted. You "call go", but "go" doesn't end with a "ret", so you never return to the "loop0: jmp loop0". Easily fixed.
The dos code you just posted doesn't "exit back to dos" properly, either - it just "falls through" and attempts to execute your message. This probably won't format your hard drive or do other damage, but you really ought to exit properly, just in case!
If you're writing your own "system", you'll probably want to provide some kind of a "shell" to exit back to (Linux usually uses "bash", "command.com" for dos) - "loop0: jmp loop0" is okay for testing.
Anyway, the above should write a message to 0B800:????, which I guess is what you wanted(?)...
Best,
Frank