your code is ok, but i use the following "template" for tiny model programs
.MODEL Tiny
.386
OPTION CaseMap:None
;####################################################################################
.CODE
;************************************************************************************
ORG 100h
_main PROC NEAR
mov dx,offset s$string
mov ah,9
int 21h
mov ax,4C00h
int 21h
_main ENDP
;************************************************************************************
s$string db 'Hello hello hello!',0Dh,0Ah,24h
;####################################################################################
END _main
in addition to what Michael said about using the /TINY switch with Link16.exe,
i would also use the "/omf" switch with ML.exe
ml /omf /c hello.asm
link16 /TINY hello.asm,hello.com;on most versions of MASM, /omf implies /c, and /omf is probably the default
but - the switch behaviour varies a little from version to version :P
in some cases, the switches are case-sensitive - i think /omf is one of those