Click here to Skip to main content
Rate this: bad
good
Please Sign up or sign in to vote.
See more: programming
Hello
 
I am working on an assignment, and I`ve been encountering divide overflow after entering my input. Below, I`ve attached what I am supposed to do (on the top of my code), and I`ve attached my code.
 
; Number Conversion Program
;
; Requirement #1: Your program should clearly prompt the user with a message to enter an
exactly 4 digit decimal number, which you should store as a nullterminated string (i.e., 5 characters total).
Requirement #2: If the user types fewer than 4 digits before pressing return, then your
program should ask for a 4 digit number again.  Otherwise, your program
should efficiently convert the 4 character numeric string into a 16-bit
numeric value and store this in a word variable.
Requirement #3: Using a loop, convert the 16-bit value into a 16 character string of ‘0’s and
‘1’s.  Store this in another null-terminated string.
 
 org 100h
 
section .text
 
start:
        mov bx, input           ;get address of first char for input
        mov cx, 2
 
myloop:
        mov ah, 00h             ;service 00h (get keystroke)
        int 16h                         ;call interrupt 16h (AH=00H) and character read will now be in AL
        cmp al, 0Dh             ;check if user pressed enter
        je convert                      ;if so, convert
        mov [bx], ax            ;if not, store character
        inc bx                          ;point BX to next char of input
        jmp myloop                      ;repeat for next character
 
convert:
        div cx                          ;dividing the number by 2 since binary is base 2
        add dx, 30h
        cmp ax, 0
        je output
        mov [bx], al
        inc bx
        jmp convert
 
output:
    mov dl, [bx]    ; get char at address in BX
    inc bx          ; point BX to next char in message
    cmp dl, 0       ; Is DL = null (that is, 0)?
    je  quit        ; If yes, then quit
    mov ah, 06      ; If no, then call int 21h service 06h
    int 21h         ;    to print the character
    jmp myloop      ; Repeat for the next character
 
quit:
        int 20h                         ;quit program
 
section .data
        input db 0, 0, 0, 0, 0
Posted 10-Nov-12 14:20pm
Comments
Jason Gleim at 10-Nov-12 22:08pm
   
Overflows almost always come from loops in the code or adding large numbers and trying to put the sum in a register that is too small. If you run the app with small numbers and it still overflows, it is probably a loop. (hint... hint)
 
Since this looks like a homework assignment though... don't expect anyone to tell you where the error is. We don't do homework assignments... you don't learn anything that way.

1 solution

Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

Why the heck are you using DIV to divide by two? Why not shift the number one place to the right instead: http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate[^] - and that's ignoring that you don't need to divide by two in the first place...
 
A single bit shift right is a divide by 2, and single shift left is a multiply by two.
 
But the description of your homework and the code you show us do not match in any way that I can see!
 
If you are converting from a string to a binary number, then the most obvious way is to loop through the ASCII digits from the most significant (left-most) to the least significant (right-most), converting each to a number (by subtracting 30h), multiply the current total by ten, and adding the digit number.
 
Since this is your homework, I'll give you no code.
  Permalink  

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
0 Sergey Alexandrovich Kryukov 495
1 OriginalGriff 339
2 ChintanShukla 305
3 Richard Deeming 260
4 RyanDev 230
0 Sergey Alexandrovich Kryukov 8,768
1 OriginalGriff 7,387
2 CPallini 2,603
3 Richard MacCutchan 2,095
4 Abhinav S 1,893


Advertise | Privacy | Mobile
Web03 | 2.8.140827.1 | Last Updated 11 Nov 2012
Copyright © CodeProject, 1999-2014
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100