INT 21h AH=08h waits for a key and returns it in AL without echoing it. Unlike INT 21h AH=07h it treats Ctrl+C the DOS way: ^C is printed and INT 23h executed, which normally ends the program. That suits input the user should not see but that needs no special care, the classic case being a password prompt that prints stars.

prints: **** 4 keys
MOV SI, OFFSET KEYS1
CALL STUFF1 ; "pass" and Enter wait in the BIOS buffer
XOR BX, BX ; keys so far
NEXT1:
MOV AH, 08h ; DOS: read a key, no echo
INT 21h
CMP AL, 13 ; Enter ends the input
JE DONE1
INC BX
MOV DL, "*" ; a star instead of the key
MOV AH, 02h ; DOS: print the character in DL
INT 21h
JMP NEXT1
DONE1:
MOV DL, " "
MOV AH, 02h ; DOS: print the character in DL
INT 21h
MOV DL, BL
ADD DL, "0" ; the count as a digit
MOV AH, 02h ; DOS: print the character in DL
INT 21h
MOV DX, OFFSET MSG1
MOV AH, 09h ; DOS: print the string at DS:DX
INT 21h
KEYS1 DW 1970h, 1E61h, 1F73h, 1F73h, 1C0Dh, 0 ; p a s s Enter
MSG1 DB " keys", 13, 10, "$"
STUFF1 PROC NEAR ; "type" the keys at DS:SI: words, 0 ends the list
CLD
ST1:
LODSW ; AH = scan code, AL = ASCII
TEST AX, AX
JZ ST2
MOV CX, AX ; CH = scan code, CL = ASCII
MOV AH, 05h ; BIOS: store a keystroke in the keyboard buffer
INT 16h
JMP ST1
ST2:
RET
STUFF1 ENDP

Enter arrives as 0Dh, Backspace as 08h and Esc as 1Bh; with no echo nothing appears on the screen unless the program draws it. A real password prompt would also handle Backspace (remove the last key, print 08h, space, 08h) and stop at the size of its buffer. Special keys come as 00h followed by the scan code on the next call, as with the other key services.

ServiceWaits for a keyEchoCtrl+C
INT 21h AH=01hyesyes^C, INT 23h: normally the end of the program
INT 21h AH=06h (DL = FFh)no: ZF = 1 when none is waitingnoreturned as 03h
INT 21h AH=07hyesnoreturned as 03h
INT 21h AH=08hyesno^C, INT 23h
INT 21h AH=0Ahfor a whole line, up to Enteryes^C, INT 23h

Pitfalls

Because the call can end the program, do not use it while the program has something to undo: a hooked vector would be left pointing into freed memory, a changed video mode would stay changed. Read with INT 21h AH=07h then, or install an INT 23h handler that cleans up. And like every handle-0 read, it takes its input from the file when the program runs with < FILE.