I'd be glad to help you out. Which way did you come in?
Seriously, dude, you may be in the wrong place. Nasm won't assemble your code, and whatever you assembled it with, I'm surprised to hear that it linked without complaint. It makes no sense! You load ax with "some values", and then "pop ax" - which overwrites it. You *might* get some output if you "push ax" instead of "pop ax", but it would be the weirdest way to get a message on screen I've ever seen!
I would suggest you put your video regeneration buffer segment (0B800h) in es, not ss, zero di, and use "stosw" to write the character and attribute to the screen.
Whatever you've been using for a "study guide" the last six days, it does not appear to be for Nasm. And, to be honest, it doesn't seem to be helping you much.
Here's how I'd do something similar - not the same! - in Nasm... if I were still running dos:
;---------------------------------
; 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
;------------------------------------
Whatever you used to assemble your code, it probably won't assemble this, so it may not help you any... Good luck!
Best,
Frank