Well... first the .bss section... It's for uninitialized data. With "temp1 db 4", you're trying to initialize one byte with the value 4. In .bss, you want "temp1 resb 4" - that reserves 4 bytes.
Dos int 21h/0Ah expects the address of a "special" buffer - the first byte *must* be filled in with "maximum count", the second byte is "reserved" for the "actual count" of characters entered, input is stored starting at the third byte. So you've got to either use an initialized buffer, with "max count" filled in, or stuff the "max count" into the first (zero-th) byte of an uninitialized buffer.
You could, if you like pain, do it "DEBUG-style", and do "mov dx, 109h", but Nasm is a symbolic assembler, and will understand "mov dx, temp1".
section .bss
temp1 resb 4 ; better to "%define MAXINPUT 4"
section .text
mov byte [temp1], 2 ; MAXINPUT - 2
mov ah, 0Ah
mov dx, temp1
int 21h
Now dos waits for input - with a buffer size of 4, you only get *one* character stored - one byte is "max count", one is "actual count", and as I recall, dos *always* stores the carriage return that terminates input. So you probably want a bigger buffer - 7 bytes, if you need 4 characters of input.
Note that this isn't terminated with "$", so take care of that if you plan to use int 21h/9 to display it!
Best,
Frank