The only difference I see in the 2 codes is the si register. In the first code you did not use it, you used values to access the memory adress.
I don't know how PutStr is implemented, probably in io.mac, but it seems like it is changing the si register.