I'm taking a class in sparc assembly, and I'm having a hard time with this concept. We're supposed to add two numbers together that can have as many as 100 digits. Since this is too many to fit into one register, I have to save them in memory and then deal with them. This is the part that I can't figure out. When saving it, should I use %d or %s? I'm saving the input in a variable that I declared like this: input1:.skip 4 * 50. Also, I was planning on using addx and addxcc to keep the carry and was planning on loading up 32 bits at a time and adding that and then restoring it, but I can't figure it out.

Am I going about this in the right way? Does anyone have any suggestions? Thanks in advance!

.section ".data"
format: .asciz "%s%c"
displayformat: .asciz "%d\n"
prompt1: .asciz "Enter first number (100 digit max): "
prompt2: .asciz "Enter second number (100 digit max): "
sDisplaySum: .asciz "\nThe sum is: %d"
sDisplayDiff: .asciz "\nThe difference is: %d"
nl: .byte '\n'

.align 4
.section ".bss"
input1: .skip 4 * 50
input2: .skip 4 * 50
sum: .skip 4 * 50
diff: .skip 4 * 50

.align 4
save %sp, -96, %sp!can not be leaf b/c must call validate subroutine

!use a loop to continue to load .words and check each time to see if %l1 and %l2 are 0
!use addxcc and
mov 0, %l3!set byte counter to loop

set input1, %l0!load first 32 bits to add
ld [%l0 + %l3], %l1!first number

set input2, %l0!load first 32 bits to add
ld [%l0 + %l3], %l2!second number

addcc %l1, %l2, %l4!does first add and sets the carry flag

set sum, %l5
st %l4, [%l5 + %l3]!store the first part of the sum into memory

add %l3, 4, %l3!increment counter

set input1, %l0!loads the next 32 bits of first number
ld [%l0 + %l3], %l1

set input2, %l0!loads the next 32 bits of second number
ld [%l0 + %l3], %l2

addxcc %l1, %l2, %l4!adds in carry to the addition, adds, then sets the flag again

set sum, %l5
st %l4, [%l5 + %l3]!store the first part of the sum into memory

add %l3, 4, %l3!increments counter again

cmp %l3, 200
bne addloop


I was thinking I was having a problem with the load and store part of things... What do you think?

9 Years
Discussion Span
Last Post by Duoas

I know nothing about SunSparc assembly, but I think your problem is in mixing data types.

When the user inputs a number, like 1230, that's four ASCII characters: 49, 50, 51, and 48.

So, you need to decide what kind of numbers you intend to add: binary or ASCII? (I think for your problem you might want to do the latter.)

There must be at some point, no matter which way you do it, conversion between the ASCII representation (received from the user and printed out when done) and something that can be added.

If you do the ASCII one digit at a time, you only need to remember a carry flag each addition:

start with carry of 0

'4'-'0'= 4
'9'-'0'= 9
4+9+carry=13: carry is 1, result is 3
3+'0'= '3'

'2'-'0'= 2
'9'-'0'= 9
2+9+carry=12: carry is 1, result is 2
2+'0'= '2'

'2'-'0'= 2
'1'-'0'= 1
2+1+carry=4: carry is 0, result is 4
4+'0'= '4'


Hope this helps.

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.