You have to load AH with the MSDOS function code that you want to use before calling the MSDOS interrupt.
For example, to print an ASCII character,
; assuming AL already contains ASCII character to print MOV AH, 07H INT 21H
You are not loading a valid function code into AH. Where your compiler got 20H is a puzzle, but since you are loading @DATA into AX without doing anything with it (such as setting DS), I wonder if you are not pointing to the correct data segment on startup.
Note also that MSDOS never provided a conversion from a numeric value to a string, so you will have to convert the value yourself if you want to display it. I believe the function code to print a string is AH=09H, with DS:SI pointing to a '$'-delimited string (not null-terminated!). I suggest verifying that first though.
If you just want to print it in base-16, you can convert each 4-bit section to the corresponding printable ascii character for that hex digit, and then use function 07H to print the character, but remember, you start at the most significant 4 bits, and you will have to reload the value from sum for each 4-bit part since you will trash the rest of the value when you set up for the interrupt call.