For debugging runtime behaviour, it can be useful to print a character to tell you what code is being run and why. Your theory is that it is the read loop, but you should test and prove this.
As the bootloader is quite limited in space, you may want to just print a single character. You could have a function such as:
; print_char()
;
; Print a single character. AX is unmodified.
;
; @param AL The character to be printed.
print_char :
push ax
mov ah, 0eh
int 10h
pop ax
Then to use it, you could just run:
mov al, '!' ; Explanation mark to let us know this was run
If you need to, you can use `push` and `pop` and `mov` to keep registers unmodified as needed.
Other notes: