Qwerty Qwerty
Qwerty Qwerty

Reputation: 581

add two digit numbers in NASM(Linux)

I want to add two-digit numbers in NASM(Linux). To add two simple numbers, I use the following code:

section .text
    global _start    ;must be declared for using gcc
_start:    ;tell linker entry point
    mov     eax,'3'
    sub     eax, '0'
    mov     ebx, '4'
    sub     ebx, '0'
    add     eax, ebx
    add eax, '0'
    mov     [sum], eax
    mov ecx,msg 
    mov edx, len
    mov ebx,1   ;file descriptor (stdout)
    mov eax,4   ;system call number (sys_write)
    int 0x80    ;call kernel
    mov ecx,sum
    mov edx, 1
    mov ebx,1   ;file descriptor (stdout)
    mov eax,4   ;system call number (sys_write)
    int 0x80    ;call kernel
    mov eax,1   ;system call number (sys_exit)
    int 0x80    ;call kernel

section .data
    msg db "The sum is:", 0xA,0xD 
    len equ $ - msg   
    segment .bss
    sum resb 1

The result of the code is 7.But when I carry number 17 in register eax forexample the result is not correct.In this case 5.Tell me please what is the problem? Thank you!

Upvotes: 6

Views: 25024

Answers (1)

User.1
User.1

Reputation: 2642

Here's your example with a little bit of cleaning up to help make it easier to read.

Suggestion: this kind of consistency will greatly improve your public image.

But hey; nice commenting, I could read your code and understand it (which is why I decided to answer you)

section .text

global _start               ;must be declared for using gcc

_start:                     ;tell linker entry point

    mov     eax, '3'
    sub     eax, '0'
    mov     ebx, '4'
    sub     ebx, '0'
    add     eax, ebx
    add     eax, '0'

    mov     [sum], eax

    mov     ecx, msg 
    mov     edx, len
    mov     ebx, 1          ;file descriptor (stdout)
    mov     eax, 4          ;system call number (sys_write)
    int     0x80            ;call kernel

    mov     ecx, sum

    mov     edx, 1
    mov     ebx, 1          ;file descriptor (stdout)
    mov     eax, 4          ;system call number (sys_write)
    int     0x80            ;call kernel

    mov     eax, 1          ;system call number (sys_exit)
    int     0x80            ;call kernel


section .data

    msg     db              "The sum is:", 0xA,0xD 

    len equ $ - msg   

    segment .bss

    sum resb 1

Okay now, as for your comment, "...But when I carry number 17 in register eax forexample the result is not correct."

I can imagine !

Question, when you "...carry number 17 in register eax..." are you doing it like this ?...

    Mov     Eax,"17"

If so, slow down and take a look at your code one step at a time via debug.

I believe that what you'll see is that you are actually doing this...

    Mov     Eax, 3137h

Although it might be

    Mov     Eax, 3731h

Interesting concept. I've never done anything like that. Whatever.

What's more, if you are using this place to store that same number...

    sum resb 1

You only have one byte.

Best I can tell, your example code is limited to single digit numbers.

Now then, since your label sum has reserved only one byte; 8 bits, you can see the problem as you are storing 32 bits there. (Well, you're trying to; it won't work.) No clue what happens when you do that. You probably want to rethink that structure.

As for why 17 becomes 5, no clue here.

Let us know if any of this helps you. Assembly is great stuff. As you are personally experiencing, the initial thought adjustment can be strange for the brain, can't it !

Upvotes: 12

Related Questions