0

I wrote a procedure to read integers(unsigned) from stdin and store it in a variable.

I wanted it to handle backspaces too. so I made some adjustments but unfortunately it didn't work.--see line 14 in the code

```
get_num: ;(function get_num: read integers from stdin)
push ax ;save all registers
push bx
push cx
push dx
mov bx,10d ;bx=10(decimal)
xor dx,dx
GNloop1:xor ax,ax
mov ah,01h ;get the input from stdin
int 21h
xor ah,ah ;ah all clear!
cmp al,0Dh ;check if the input was <return>
je GNloop2 ;if yes then goto GNloop2
cmp al,08h ;check if BACKSPACE was pressed
jne _continue_ ;if not, then continue
xor ax,ax ;otherwise ...
mov ax,tmp ;take the value in tmp(a word variable) and-
sub ax,cx ;remove what was entered just before the backspace
push ax ;save it in stack,it'll be restored in dx afterwards
div bx ;dx=ax/10
mov tmp,dx ;and save to tmp
cmp dx,0 ;if it was first digit
jz GNloop1 ;then carry on
pop dx ;if not first digit , then don't forget-
;to restore what was in dx before the(backspaced) digit was pressed
jmp GNloop1 ;and then jump back.
_continue_:
sub al,48d ;convert from ascii to decimal,ascii value of 0 is 48d(i.e. 30 in hex)
xor cx,cx ;cx=0
mov cl,al ;save al in cl(used when implementing BACKSPACE)
add ax,dx ;add (ax*10=)dx and ax,in first loop dx is Zero,hence ax=ax+0
xor dx,dx ;dx=0
mov tmp,ax ;save what's in ax to tmp (a word variable),
;1st loop:digit in ones place,2nd loop: digit in tens place and so on.
mul bx ;ax=ax*10
mov dx,ax ;save ax*10 in dx(it will be added to ax in next loop-
;see two instructions above)
jmp GNloop1 ; loop
GNloop2:pop dx ;restore registers and return
pop cx
pop bx
pop ax
ret
```

It gives 'division overflow' error when BACKSPACE is pressed.

I'm finding very hard to eliminate this particular bug.

Can anyone please look at this code and help me find the culprit!