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!