Solved

TROUBLE ADDING TWO NUMBERS IN ASSEMBLY

Posted on 2007-11-26
8
4,929 Views
Last Modified: 2008-02-01
I believe the disp_sum (last) call is incorrect because the program will execute but the sum will not be displayed.
Project is due tomorrow (11/27) so prompt assistance will be greatly appreciated
Thanks in advance!

; A Simple Calculator that performs basic arithmetic (+ - * /)

.model small

.stack 256

CR equ 13d
LF equ 10d

.data

promptNum1 db 'Please Enter The First Number:', 0 ;string terminated by 0
promptNum2 db CR, LF,'Please Enter The Second Number:',0 ;string terminated by 0
sum db CR, LF, 'The sum Of The Two Numbers Is:', 0 ;string terminated by 0
num1 dw ?
num2 dw ?
.code

start:

mov ax, @data ;set ds register to point to data segment
mov ds, ax ;since you cannot assign a segment to ds directy
mov ax, offset promptNum1 ;store memory address of promptNum1 in ax

call display_str ;calls the display_str to display promptNum1 string
call read_input ;read first number entered by user

mov num1, ax ;store the number entered by user into num1 variable
mov ax, offset promptNum2 ;store memory address of promptNum2 into ax

call display_str ;calls the display_str to display promptNum2 string
call read_input ;read second number entered by user

mov num2, ax ;store the second number entered by user into num2 variable
mov ax, offset sum ;store memory address of sum into ax

call display_str ;calls the display_str to display sum string

mov ax, num1 ; ax = num1 ;move contents of num1 variable to the ax register
add ax, num2 ; ax = ax + num2 ;add contents of num2 variable to the existing contents of ax

call putn ; display sum ;call putn function to display the value of sum
mov ax, 4c00h
int 21h ; finished, back to dos

display_str: ;definition of display_str which displays string terminated by 0
push ax ;save contents of register ax
push bx ;save contents of register bx
push cx ;save contents of register cx
push dx ;save contents of register dx
mov bx, ax ;store address in bx (required for display)
mov al, byte ptr [bx] ;copy address of first character in string to al register

display_loop: cmp al, 0 ;while loop, while al != 0
je display_rest ;if last result was 0, then go to display_restore
call disp_char ;display character, one at a time, while al != 0
inc bx ;loop control, bx = bx + 1
mov al, byte ptr [bx] ;display next character in string
jmp display_loop ;go back to beginning of loop

display_rest:
pop dx ;restore register to beginning value
pop cx ;restore register to beginning value
pop bx ;restore register to beginning value
pop ax ;restore register to beginning value
ret


disp_char: ;display character stored in al, called by display_loop
push ax ;save contents of register ax
push bx ;save contents of register bx
push cx ;save contents of register cx
push dx ;save contents of register dx
mov dl, al ;move contents of al into bl (required for display)
mov ah, 2h ;call DOS display subprogram
int 21h ;interrupt to call subprogram
pop dx ;restore register to beginning value
pop cx ;restore register to beginning value
pop bx ;restore register to beginning value
pop ax ;restore register to beginning value
ret

read_input: ;read character into al
mov ah, 1h ;call DOS input subprogram
int 21h ;interrupt to call subprogram
ret


disp_sum ; display string terminated by 0
; dx contains address of string
mov dh, ah
mov ah, 2h
int 21h
ret


end start
0
Comment
Question by:khwajakhurram
  • 4
  • 3
8 Comments
 
LVL 5

Expert Comment

by:abith
ID: 20355974
>> disp_sum ; display string terminated by 0
  is disp_sum label ?
if so ':' is missing
0
 

Author Comment

by:khwajakhurram
ID: 20357418
no, that didn't do the trick. I think I may be using the wrong registers.
The sum is stored in the ax register and I want to display it on the screen
Thanks
0
 

Author Comment

by:khwajakhurram
ID: 20357452
one more error, the putn statement after the addition should say disp_sum.
This too does not fix the issue
Thanks
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 5

Expert Comment

by:abith
ID: 20357872
add ax, num2 ; ax = ax + num2 ;
    stores value in ax

disp_sum ; display string terminated by 0
; dx contains address of string
mov dh, ah
mov ah, 2h
int 21h
ret

int 21h      
    displays value originally from dl. but data moved to dh. that too only ah. (al value is left alone)

add value with al instead of ax.

if still you dont get the result, can you post and i/p you are using and o/p you are getting
0
 

Author Comment

by:khwajakhurram
ID: 20358782
Do you mean like this?
mov ax, num1
add al, num2

It doesn't compile. Invalid instruction operands
0
 

Author Comment

by:khwajakhurram
ID: 20358820
Here is the I/O when I run the program as is
Please Enter The Larger Number First :2
Please Enter Arithmetic Operation:+
Please Enter The Second Number:2
The Sum Of The Two Numbers Is:â– 
0
 
LVL 5

Accepted Solution

by:
abith earned 500 total points
ID: 20363519
like this

num1 db ? ; use db instead of dw
num2 db ?

mov al, num1
add al, num2

>> The Sum Of The Two Numbers Is:â–
i am not able to figure out the 2nd byte value. can you give me the ascii value of two result bytes
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Help! Bomb phase 6 3 976
assembly flow 3 583
Address Range Confusion??? 4 377
memory mapped I/O query 6 142
What does UTC stand for?  “Coordinated Universal Time” – Think of this as the true time on Planet Earth that never changes with the exception of minor leap seconds here and there to account for the changes in the planet's rotation.   What does th…
Introduction This article is intended for those who are new to PHP error handling (https://www.experts-exchange.com/articles/11769/And-by-the-way-I-am-New-to-PHP.html).  It addresses one of the most common problems that plague beginning PHP develop…
In this video I am going to show you how to back up and restore Office 365 mailboxes using CodeTwo Backup for Office 365. Learn more about the tool used in this video here: http://www.codetwo.com/backup-for-office-365/ (http://www.codetwo.com/ba…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…

895 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now