The DX
register starts out loaded with 65, the ASCII code for A
, the DH
and DL
registers are the upper and lower half, respectively of DX
.
The SPACE
macro loads a 32 (the ASCII code for space) into DL, overwriting whatever is there. The PUSH DX
POP DX
saves and restores the state of the register while the space in-between characters is printed. As to why you see !
, that is because without restoring DX after the space has been printed, you will simply increment 32 to 33 and print that character.