Yes the hex is machine code no need to compile it. If you know enough about asm. you can hand compile it but you need to figure out the memory locations of all the commands before you can code the jumps. If I were to want to add even one letter to the string it would mess it up. I.e. If I changed hello world to hello mark I would have to change 0101h to 0bh because you only have to skip 11 lines. when you use assembly the assembler finds the location of PRINT: and will adjust the code for you. Asm is not too hard to learn. I just started a class in computer science in high school. I find it easier to start programming in dos because you have full control of the system. In the class I'm taking, you learn about how the computer works before you learn how to make it work. I got a book on asm, and I just started reading about the dos graphic interrupts. I think I'll have something that looks like pong in a week or two, hopefully.
Anyone want to nominate my 2 byte program for smallest useless program ever? I think I may have broke the world record :laughing:
P.S. No I didn't use an assembler for that I used a table of common asm. commands and there hex equivalents. Remember there there's for the most part a 1 to 1 relationship between hex opcodes and asm. The only ones that have no opcodes are the commands that handle memory locations for you so when you do a jump or load a value from memory you can use a mnemonic instead of laying out every command and byte of data and figuring out there memory locations.
P.S.S. As for your question about interrupts. Int 21 is like a subroutine. its another program wrote in assembly loaded by dos. You don't need interrupts to write programs but it would be like writing hello world in C++ without #include <stdio.h>