Why won't the program print the sum of the array?











up vote
2
down vote

favorite












So I'm building a simple 8086 Assembly program that allows the user to input 4 digits, store them in an array and print out the sum of those digits (The sum must be a one digit number):



data segment

i db ?
array db 20 dup(?)
sum db ?

ends

stack segment

dw 128 dup(0)

ends

code segment

mov ax, data
mov ds, ax
mov es, ax

mov i, 0

Enter:
mov ah, 1
int 21h
mov bl, i
mov bh, 0

mov array[bx], al

inc i
cmp i, 4
jne Enter

mov sum, 0
mov i, 0

Calc:
mov bl, i
mov bh, 0
mov al, array[bx]

add sum, al

inc i
cmp i, 4
jne Calc

mov dl, sum
mov ah, 2
int 21h

mov ax, 4c00h
int 21h

ends


However when I input the numbers 1 1 2 5 instead of giving me 9 it gives me some random character.



Any ideas?










share|improve this question




















  • 1




    You need to convert input from ascii and result to ascii.
    – Jester
    Nov 11 at 19:49















up vote
2
down vote

favorite












So I'm building a simple 8086 Assembly program that allows the user to input 4 digits, store them in an array and print out the sum of those digits (The sum must be a one digit number):



data segment

i db ?
array db 20 dup(?)
sum db ?

ends

stack segment

dw 128 dup(0)

ends

code segment

mov ax, data
mov ds, ax
mov es, ax

mov i, 0

Enter:
mov ah, 1
int 21h
mov bl, i
mov bh, 0

mov array[bx], al

inc i
cmp i, 4
jne Enter

mov sum, 0
mov i, 0

Calc:
mov bl, i
mov bh, 0
mov al, array[bx]

add sum, al

inc i
cmp i, 4
jne Calc

mov dl, sum
mov ah, 2
int 21h

mov ax, 4c00h
int 21h

ends


However when I input the numbers 1 1 2 5 instead of giving me 9 it gives me some random character.



Any ideas?










share|improve this question




















  • 1




    You need to convert input from ascii and result to ascii.
    – Jester
    Nov 11 at 19:49













up vote
2
down vote

favorite









up vote
2
down vote

favorite











So I'm building a simple 8086 Assembly program that allows the user to input 4 digits, store them in an array and print out the sum of those digits (The sum must be a one digit number):



data segment

i db ?
array db 20 dup(?)
sum db ?

ends

stack segment

dw 128 dup(0)

ends

code segment

mov ax, data
mov ds, ax
mov es, ax

mov i, 0

Enter:
mov ah, 1
int 21h
mov bl, i
mov bh, 0

mov array[bx], al

inc i
cmp i, 4
jne Enter

mov sum, 0
mov i, 0

Calc:
mov bl, i
mov bh, 0
mov al, array[bx]

add sum, al

inc i
cmp i, 4
jne Calc

mov dl, sum
mov ah, 2
int 21h

mov ax, 4c00h
int 21h

ends


However when I input the numbers 1 1 2 5 instead of giving me 9 it gives me some random character.



Any ideas?










share|improve this question















So I'm building a simple 8086 Assembly program that allows the user to input 4 digits, store them in an array and print out the sum of those digits (The sum must be a one digit number):



data segment

i db ?
array db 20 dup(?)
sum db ?

ends

stack segment

dw 128 dup(0)

ends

code segment

mov ax, data
mov ds, ax
mov es, ax

mov i, 0

Enter:
mov ah, 1
int 21h
mov bl, i
mov bh, 0

mov array[bx], al

inc i
cmp i, 4
jne Enter

mov sum, 0
mov i, 0

Calc:
mov bl, i
mov bh, 0
mov al, array[bx]

add sum, al

inc i
cmp i, 4
jne Calc

mov dl, sum
mov ah, 2
int 21h

mov ax, 4c00h
int 21h

ends


However when I input the numbers 1 1 2 5 instead of giving me 9 it gives me some random character.



Any ideas?







assembly x86-16






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 17 at 14:57









Fifoernik

7,52111223




7,52111223










asked Nov 11 at 19:44









David Daniels

595




595








  • 1




    You need to convert input from ascii and result to ascii.
    – Jester
    Nov 11 at 19:49














  • 1




    You need to convert input from ascii and result to ascii.
    – Jester
    Nov 11 at 19:49








1




1




You need to convert input from ascii and result to ascii.
– Jester
Nov 11 at 19:49




You need to convert input from ascii and result to ascii.
– Jester
Nov 11 at 19:49












1 Answer
1






active

oldest

votes

















up vote
2
down vote













The DOS character input function gives you characters.

When you key in 1 DOS presents you with AL='1' meaning you get 49 where you might expect 1.

When you key in 2 DOS presents you with AL='2' meaning you get 50 where you might expect 2.

When you key in 5 DOS presents you with AL='5' meaning you get 53 where you might expect 5.

That's why we subtract 48 in these cases.



Enter:
mov ah, 1
int 21h
mov bl, i
mov bh, 0
SUB AL, '0' ;Same as SUB AL, 48
mov array[bx], al


This way your array will contain the values 1, 1, 2, and 5 (No longer the characters '1', '1', '2', and '5')



Now you can safely do the additions, yielding 9.



Because sum now holds the value 9, but you need the character '9', you simple add 48 to do the conversion:



    mov dl, sum
ADD DL, '0' ;Same as ADD DL, 48
mov ah, 02h
int 21h





share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53252525%2fwhy-wont-the-program-print-the-sum-of-the-array%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    2
    down vote













    The DOS character input function gives you characters.

    When you key in 1 DOS presents you with AL='1' meaning you get 49 where you might expect 1.

    When you key in 2 DOS presents you with AL='2' meaning you get 50 where you might expect 2.

    When you key in 5 DOS presents you with AL='5' meaning you get 53 where you might expect 5.

    That's why we subtract 48 in these cases.



    Enter:
    mov ah, 1
    int 21h
    mov bl, i
    mov bh, 0
    SUB AL, '0' ;Same as SUB AL, 48
    mov array[bx], al


    This way your array will contain the values 1, 1, 2, and 5 (No longer the characters '1', '1', '2', and '5')



    Now you can safely do the additions, yielding 9.



    Because sum now holds the value 9, but you need the character '9', you simple add 48 to do the conversion:



        mov dl, sum
    ADD DL, '0' ;Same as ADD DL, 48
    mov ah, 02h
    int 21h





    share|improve this answer



























      up vote
      2
      down vote













      The DOS character input function gives you characters.

      When you key in 1 DOS presents you with AL='1' meaning you get 49 where you might expect 1.

      When you key in 2 DOS presents you with AL='2' meaning you get 50 where you might expect 2.

      When you key in 5 DOS presents you with AL='5' meaning you get 53 where you might expect 5.

      That's why we subtract 48 in these cases.



      Enter:
      mov ah, 1
      int 21h
      mov bl, i
      mov bh, 0
      SUB AL, '0' ;Same as SUB AL, 48
      mov array[bx], al


      This way your array will contain the values 1, 1, 2, and 5 (No longer the characters '1', '1', '2', and '5')



      Now you can safely do the additions, yielding 9.



      Because sum now holds the value 9, but you need the character '9', you simple add 48 to do the conversion:



          mov dl, sum
      ADD DL, '0' ;Same as ADD DL, 48
      mov ah, 02h
      int 21h





      share|improve this answer

























        up vote
        2
        down vote










        up vote
        2
        down vote









        The DOS character input function gives you characters.

        When you key in 1 DOS presents you with AL='1' meaning you get 49 where you might expect 1.

        When you key in 2 DOS presents you with AL='2' meaning you get 50 where you might expect 2.

        When you key in 5 DOS presents you with AL='5' meaning you get 53 where you might expect 5.

        That's why we subtract 48 in these cases.



        Enter:
        mov ah, 1
        int 21h
        mov bl, i
        mov bh, 0
        SUB AL, '0' ;Same as SUB AL, 48
        mov array[bx], al


        This way your array will contain the values 1, 1, 2, and 5 (No longer the characters '1', '1', '2', and '5')



        Now you can safely do the additions, yielding 9.



        Because sum now holds the value 9, but you need the character '9', you simple add 48 to do the conversion:



            mov dl, sum
        ADD DL, '0' ;Same as ADD DL, 48
        mov ah, 02h
        int 21h





        share|improve this answer














        The DOS character input function gives you characters.

        When you key in 1 DOS presents you with AL='1' meaning you get 49 where you might expect 1.

        When you key in 2 DOS presents you with AL='2' meaning you get 50 where you might expect 2.

        When you key in 5 DOS presents you with AL='5' meaning you get 53 where you might expect 5.

        That's why we subtract 48 in these cases.



        Enter:
        mov ah, 1
        int 21h
        mov bl, i
        mov bh, 0
        SUB AL, '0' ;Same as SUB AL, 48
        mov array[bx], al


        This way your array will contain the values 1, 1, 2, and 5 (No longer the characters '1', '1', '2', and '5')



        Now you can safely do the additions, yielding 9.



        Because sum now holds the value 9, but you need the character '9', you simple add 48 to do the conversion:



            mov dl, sum
        ADD DL, '0' ;Same as ADD DL, 48
        mov ah, 02h
        int 21h






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 11 at 20:12

























        answered Nov 11 at 20:06









        Sep Roland

        11.6k21845




        11.6k21845






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53252525%2fwhy-wont-the-program-print-the-sum-of-the-array%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            The Sandy Post

            Danny Elfman

            Pages that link to "Head v. Amoskeag Manufacturing Co."