Προς το περιεχόμενο

προβλημα-assembly


matina85

Προτεινόμενες αναρτήσεις

Δημοσ.

.data

 

 

 

.globl askint

.globl repint

.globl mystring_1

.globl mystring_2

.globl mystring_3

.globl final_string

 

 

askint: .asciiz "Please enter an expression :"

string_1: .asciiz "ERROR!TRY AGAIN!"

string_2: .asciiz "OVERFLOW"

newline : .asciiz "\n"

EXP_BUF: .space 128

mystring_2: .space 128

mystring_3: .space 128

 

final_string: .asciiz "The answer is :"

 

 

.text

 

main:

 

li $s1,0

la $a0,EXP_BUF

la $a1,mystring_2

la $a2,mystring_3

li $s6, 10

 

 

 

# Print the prompt

li $v0, 4 # 4 is the code print string

la $a0, askint # a0 is the string to be printed and gets the

syscall # value from "variable" askint

 

 

# Read in the string

li $v0, 8

la $a0, EXP_BUF

la $a1,128

 

syscall

 

 

arithmos_1:

 

 

jal arithmos

 

 

arithmos_2:

 

move $t8, $t0

move $t3, $s4

addi $a0, $a0, 1

jal arithmos

 

 

 

arithmos:

 

li $t0,1 #8etoume to flag=1 gia possitive toy 1ou ari8mou

lb $t1,($a0)

jal psifio

la $a0, EXP_BUF

lb $t1,($a0)

#la $a0,EXP_BUF

jal prosimo

 

blt $t1,48,error #elegxos an ta stoixeia tou string einai '0' - '9'

bgt $t1,57,error

 

jal metatroph_A_to_B

jal psifio

 

lb $t1, ($a0)

beq $t1, 43, telestis # +

beq $t1, 45, telestis # -

beq $t1, 42, telestis # *

beq $t1, 47, telestis # /

beq $t1, 10, calculate # \n

 

j error

 

 

 

psifio:

 

lb $t1,($a0)

beq $t1,43,end_psifio

beq $t1,45,end_psifio

beq $t1,42,end_psifio

beq $t1,47,end_psifio

beq $t1,10,end_psifio

addi $a0,$a0,1

 

j psifio

 

 

end_psifio:

 

jr $ra

 

 

prosimo:

 

lb $t1, ($a0)

bne $t1, 45, end_prosimo

li $t1, -1 #t0=flag for negative

addi $a0, $a0, 1

j prosimo

 

 

end_prosimo:

 

jr $ra

 

telestis:

 

lb $t6, ($a0)

j arithmos_2

 

 

calculate:

 

move $t3, $t0

move $t5, $s4

beq $t6, 43, addition # +

beq $t6, 45, subtraction # -

beq $t6, 42, multiply # *

beq $t6, 47, division # /

 

j error

 

 

 

 

 

#############################################################

 

metatroph_A_to_B:

 

 

li $s6, 10

li $s4,0

 

find_length:

 

li $t2,0 # Sto $t2 apo8hkeuetai to length kai arxika to mhdenizoume

la $a0,EXP_BUF

lb $t3,($a0) # to $t3 exei to periexomeno tou prwtou stoixeiou tou mystring_1

 

 

length_counter:

 

blt $t3,48,check_length #elegxos an ta stoixeia tou string einai '0' - '9'

bgt $t3,57,check_length

addi $a0,$a0,1 #kanoume pointer=pointer+1

addi $t2,$t2,1 #lenght=lenght+1

lb $t3,($a0)

 

j length_counter

 

 

check_length:

 

la $a0,EXP_BUF

 

bleu $t2,5,loop_metatrophs_A_to_B

j overflow

 

#Loop to Read the string in binary

 

 

loop_metatrophs_A_to_B:

 

beq $t2,0,go_psifio

lb $t3,($a0)

blt $t3,48,error #elegxos an ta 5 stoixeia tou string einai '0' - '9'

bgt $t3,57,error

 

addi $t3,$t3,-48 # (*s-'0')

add $s4,$s4,$t3 # d=(d+(*s-'0'))

#lb $t3,($a0) # $t3 einai o deikths s(*s)

addi $a0,$a0,1 # s=(s+1)

mulo $s4,$s4,$s6 # d=(d*10)

addi $t2,$t2,-1

 

 

 

j loop_metatrophs_A_to_B

 

go_psifio:

 

jr $ra

 

 

 

#########################################################################

 

 

addition:

 

beq $t1,1,step_11 #$t1 flag gia prwto aritho

li $s1,-1

mul $t2,$t2,$s1 #$t2 o prwtos arithos

 

step_11:

beq $t3,1,step_12 #$t3 flag gia deutero aritho

li $s1,-1

mul $t4,$t4,$s1 #$t4 o deuteros arithos

 

 

 

step_12:

add $s4,$t4,$t2

 

 

 

j exit

 

 

 

subtraction:

 

beq $t1,1,step_21 #$t1 flag gia prwto aritho

li $s1,-1

mul $t2,$t2,$s1 #$t2 afairetaios

 

 

step_21:

beq $t3,1,step_22 #$t3 flag gia deutero aritho

li $s1,-1

mul $t4,$t4,$s1 #$t4 afaireths

 

 

 

step_22:

sub $s4,$t2,$t4

 

 

j exit

 

#multiply:

 

#division:

 

#############################################

 

error:

li $v0, 4

la $a0, string_1 #ektypwsh mhnumatos lathous

 

syscall

 

j exit2

 

 

overflow:

 

li $v0,4

la $a0,string_2

 

syscall

 

j exit2

 

 

 

 

 

exit: #Exit

# Print the prompt

li $v0, 4 # 4 is the code print string

la $a0 ,final_string

 

syscall

 

li $v0, 1 # 1 is the code for print integer

move $a0, $s4 # a0 receives integer to be printed

syscall

 

#typose nea grammi

li $v0 , 4

la $a0 ,newline

syscall

 

exit2:

li $v0, 10

syscall

 

#################################

 

παραθετω ολο τον κωδικα σε περιπτωση που χρειαστει.το προγραμμα πρεπει να εκτελει προσθεση η αφαιρεση μεταξυ 2 πενταψηφιων το πολυ αριθμων απο ASCII σε binary καθως ο χρηστης του εισαγει string π.χ.5+8.Εχει προβλημα στο να διαβασει τον δευτερο αριθμο μετα τον τελεστη απο τη μνημη γιατι στο loop που τον διαβαζει(απ'οπου διαβαζει και τον πρωτο αριθμο) γινεται αρχικοποιηση του δεικτη να δειχνει στην αρχη του string γιατι αν δεν γινει δεν διαβαζει τον πρωτο.

 

μπορει καποιος να με βοηθησει γιατι παιδευομαι μερες τωρα?Thanks

Δημοσ.

Το είδα λίγο καλύτερα το θέμα και έχω μια πρόταση να κάνω....

 

Αφού λες οτι έχει πρόβλημα στο Loop που διαβάζει τον πρώτο αριθμό και πως κάνει αρχικοποίηση στην αρχή του string....

 

ΓΙΑΤΙ να μην αποθηκεύεις ας πούμε στον $a3 (που δεν χρησιμοποιείται πουθενά στο πρόγραμμα) τον Pointer όταν τελειώσει την ανάγνωση του πρώτου αριθμού και μετά να αρχικοποιείς απο αυτόν (τον $a3), όπου χρειάζεται.

 

Για να μπορέσει να διαβάσει και τον πρώτο αριθμό θα πρέπει στην αρχή LI $a3,EXP_BUF , έτσι δεν είναι;;;!!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...