我必須創建一個返回兩個浮點數之間差異的函數。Assembly Mips - 轉換兩個字符串(包含浮點數)並找到它們之間的差距
實施例:用戶A的LAT是22.00,而用戶B的LAT是20.00(24.00或)其結果必然是2.00。
這是一個簡單的減法是啊......我找到了一種方法來存儲,而不\ n和點彩車,但我不能找到一種方法,使用數組中的算數運算。這非常令人沮喪。
我希望有人幫助我
.data
dot: .asciiz "."
aCapo: .asciiz "\n"
A: .word nome1, cognome1, lat1, long1
nome1: .asciiz "Paolo\n"
cognome1: .asciiz "Bonomi\n"
lat1: .asciiz "69.31\n"
long1: .asciiz "45.00\n"
B: .word nome2, cognome2, lat2, long2
nome2: .asciiz "Xhoni\n"
cognome2: .asciiz "Lara\n"
lat2: .asciiz "40.02\n"
long2: .asciiz "90.00\n"
array: .space 256
.text
.globl main
main:
la $a1, A
la $a2, B
la $t8, array
lw $s1, 8($a1)
lb $t0, 0($s1)
sb $t0, 0($t8)
lb $t0, 1($s1)
sb $t0, 1($t8)
lb $t0, 3($s1)
sb $t0, 2($t8)
lb $t0, 4($s1)
sb $t0, 3($t8)
編輯:我剛剛找到一個方法來做到這一點
此功能的偉大工程,順便說一句,我知道是不是功能性的所有..有這麼多冗餘但我沒有那麼多時間,所以..感謝這麼多的提示和幫助
diff_geo:
array: .word 1
array2: .word 1
risultatoLat: .word 1
empty: .word 1
risultatoLong: .word 1
empty2: .word 1
#
# this fuction takes two utentiR in $a1 and $a2
# and return the difference by lat and long from the two user
#
try_lat:
lw $s1, 8($a1) # put in s1 adress lat1
la $t8, array
lb $t0, 4($s1) #
sb $t0, 0($t8) #
lb $t0, 3($s1) #
sb $t0, 1($t8) #
lb $t0, 1($s1) #
sb $t0, 2($t8) #
lb $t0, 0($s1) #
sb $t0, 3($t8) #
lw $s0, 0($t8) # put in s0 lat1 without "." and "\n"
lw $s2, 8($a2) # put in s2 address lat2
la $t9, array2 #
lb $t0, 4($s2) #
sb $t0, 0($t9) #
lb $t0, 3($s2) #
sb $t0, 1($t9) #
lb $t0, 1($s2) #
sb $t0, 2($t9) #
lb $t0, 0($s2) #
sb $t0, 3($t9) #
lw $s1, 0($t9) # put in s1 lat2 without "." and "\n"
blt $s0, $s1, switch_utenti # if latA < latB goto switch
beq $s0, $s1, return_equal # if latA = latB return "00.00"
j do_sub_lat # else do sub
return_equal:
la $a0, str_diffLat # stamp "Differenza Latitudine: "
li $v0, 4
syscall
la $a0, str_same # stamp "00.00\n"
li $v0, 4
syscall
j try_long # goto process long
switch_utenti:
move $a0, $a1
move $a1, $a2
move $a2, $a0
do_sub_lat:
lw $s1, 8($a1) # put in s1 adress lat1
lw $s2, 8($a2) # put in s2 adress lat2
lb $t0, 0($s1) # load first number of lat1
lb $t1, 0($s2) # load first number of lat2
sub $t2, $t0, $t1 # t2 = t0 - t1 (decimal)
lb $t0, 1($s1) # load second number lat1
lb $t1, 1($s2) # load second number lat2
bge $t0, $t1, jEDLat # if (T0 >= T1) jump exception
li $t7, 1 # load 1 in t7
li $t6, 9 # load 9 in t6
sub $t2, $t2, $t7 # sub 1 from first number of the result
add $t0, $t0, $t6 # add 9 to t0
sub $t1, $t1, $t7 # sub 1 to t1 (i have to made this because if i try to ad 10 to t0, 10 will be like "a" no "10")
jEDLat:
sub $t3, $t0, $t1 # T0 - T1 risultato DECIMALE in T3
lb $t0, 3($s1) # carico secondo numero di A
lb $t1, 3($s2) # carico secondo numero di B
bge $t0, $t1, jETLat # if (T0 >= T1) salta eccezione
li $t7, 1 # carico 1 in T7
li $t6, 9 # carico 10 in T6
sub $t3, $t3, $t7
add $t0, $t0, $t6
sub $t1, $t1, $t7
jETLat:
sub $t4, $t0, $t1 # T0 - T1 risultato DECIMALE in T4
lb $t0, 4($s1) # carico quarto numero di A
lb $t1, 4($s2) # carico quarto numero di B
bge $t0, $t1, jEQLat # if (T0 >= T1) salta eccezione
li $t7, 1 # carico 1 in T7
li $t6, 9 # carico 10 in T6
sub $t4, $t2, $t7
add $t0, $t0, $t6
sub $t1, $t1, $t7
jEQLat:
sub $t5, $t0, $t1 # T0 -T1 risultato DECIMALE in T5
addi $t2, $t2, 48
addi $t3, $t3, 48
addi $t4, $t4, 48
addi $t5, $t5, 48
la $t8, risultatoLat
la $t7, aCapo
lb $t7, 0($t7)
sb $t7, 5($t8)
sb $t5, 4($t8)
sb $t4, 3($t8)
la $t7, dot
lb $t7, 0($t7)
sb $t7, 2($t8)
sb $t3, 1($t8)
sb $t2, 0($t8)
la $a0, str_diffLat
li $v0, 4
syscall
la $a0, risultatoLat
li $v0, 4
syscall
try_long:
lw $s1, 12($a1) # Metto in S1 la parola puntata da A1
la $t8, array
lb $t0, 4($s1) #
sb $t0, 0($t8) #
lb $t0, 3($s1) #
sb $t0, 1($t8) #
lb $t0, 1($s1) #
sb $t0, 2($t8) #
lb $t0, 0($s1) #
sb $t0, 3($t8) #
lw $s0, 0($t8) # IN S0 LONGITUDINE A
lw $s2, 12($a2) # Metto in S2 la parola puntata da A2
la $t9, array2
lb $t0, 4($s2) #
sb $t0, 0($t9) #
lb $t0, 3($s2) #
sb $t0, 1($t9) #
lb $t0, 1($s2) #
sb $t0, 2($t9) #
lb $t0, 0($s2) #
sb $t0, 3($t9) #
lw $s1, 0($t9) # IN S1 LONGITUDINE B
blt $s0, $s1, switch_utenti2 # se latA < latB inverto
beq $s0, $s1, return_equal2 # se latA = a latB ritorno 00.00
j do_sub_long
return_equal2:
la $a0, str_diffLong # stampo "Differenza Longitudine: "
li $v0, 4
syscall
la $a0, str_same # stampo "00.00\n"
li $v0, 4
syscall
jr $ra # fine funzione
switch_utenti2:
move $a0, $a1
move $a1, $a2
move $a2, $a0
do_sub_long:
lw $s1, 12($a1) # Metto in S1 la parola puntata da A1
lw $s2, 12($a2) # Metto in S2 la parola puntata da A2
lb $t0, 0($s1) # carico primo numero di A
lb $t1, 0($s2) # carico primo numero di B
sub $t2, $t0, $t1 # T0 - T2 risultato DECIMALE in T2
lb $t0, 1($s1) # carico secondo numero di A
lb $t1, 1($s2) # carico secondo numero di B
bge $t0, $t1, jEDLong # if (T0 >= T1) salta eccezione
li $t7, 1 # carico 1 in T7
li $t6, 9 # carico 10 in T6
sub $t2, $t2, $t7
add $t0, $t0, $t6
sub $t1, $t1, $t7
jEDLong:
sub $t3, $t0, $t1 # T0 - T1 risultato DECIMALE in T3
lb $t0, 3($s1) # carico secondo numero di A
lb $t1, 3($s2) # carico secondo numero di B
bge $t0, $t1, jETLong # if (T0 >= T1) salta eccezione
li $t7, 1 # carico 1 in T7
li $t6, 9 # carico 10 in T6
sub $t3, $t3, $t7
add $t0, $t0, $t6
sub $t1, $t1, $t7
jETLong:
sub $t4, $t0, $t1 # T0 - T1 risultato DECIMALE in T4
lb $t0, 4($s1) # carico quarto numero di A
lb $t1, 4($s2) # carico quarto numero di B
bge $t0, $t1, jEQLong # if (T0 >= T1) salta eccezione
li $t7, 1 # carico 1 in T7
li $t6, 9 # carico 10 in T6
sub $t4, $t2, $t7
add $t0, $t0, $t6
sub $t1, $t1, $t7
jEQLong:
sub $t5, $t0, $t1 # T0 -T1 risultato DECIMALE in T5
addi $t2, $t2, 48
addi $t3, $t3, 48
addi $t4, $t4, 48
addi $t5, $t5, 48
la $t7, aCapo
lb $t7, 0($t7)
la $t8, risultatoLong
sb $t7, 5($t8)
sb $t5, 4($t8)
sb $t4, 3($t8)
la $t7, dot
lb $t7, 0($t7)
sb $t7, 2($t8)
sb $t3, 1($t8)
sb $t2, 0($t8)
la $a0, str_diffLong
li $v0, 4
syscall
la $a0, risultatoLong
li $v0, 4
syscall
la $a0, aCapo
li $v0, 4
syscall
jr $ra
我已經省略了lat和長格式是所有
ctrl_geo相同:
#
# questa funzione prende come argomento in $a0 una indirizzo ad una stringa
# la funzione contolla se il formato è corretto cioè rispetta il formato "xx.xx\n" con x compreso tra 0 e 9
# restituisce in $a0 1 se l'inserimento è avvenuto correttamente altrimenti stampa a video una stringa di errore
# e restituisce in $a0 0
#
lb $t0, 0($a0) # carico numero decine in $t0
lb $t1, min
blt $t0, $t1, errore_geo # controllo se è minore di 0
lb $t1, max
bgt $t0, $t1, errore_geo # controllo se è maggiore di 9
lb $t0, 1($a0) # carico numero unità in $t0
lb $t1, min
blt $t0, $t1, errore_geo # controllo se è minore di 0
lb $t1, max
bgt $t0, $t1, errore_geo # controllo se è maggiore di 9
lb $t0, 2($a0) # carico punto in $t0
lb $t1, dot
bne $t0, $t1, errore_geo # se non c'è un punto in t0 mando ad errore
lb $t0, 3($a0) # carico numero dopo punto decine in $t0
lb $t1, min
blt $t0, $t1, errore_geo # controllo se è minore di 0
lb $t1, max
bgt $t0, $t1, errore_geo # controllo se è maggiore di 9
lb $t0, 4($a0) # carico numero dopo punto unità in $t0
lb $t1, min
blt $t0, $t1, errore_geo # controllo se è minore di 0
lb $t1, max
bgt $t0, $t1, errore_geo # controllo se è maggiore di 9
lb $t0, 5($a0) # a capo in $t0
lb $t1, aCapo
bne $t0, $t1, errore_geo # se in t0 non ho aCAPO mando a errore
li $a0, 1
jr $ra # fine funzione
errore_geo:
la $a0, str_erroreNumerico
li $v0, 4
syscall
li $a0, 0
jr $ra # fine funzione
是這樣的話非功能我知道...也許如果我存儲lat和長值一樣浮動,而不是像ascii,這將防止很大的麻煩。
祝你好運找到一個真正會花時間爲你寫的人。你在Assembly中問的很多!我不再記得這門語言,或者我會嘗試。 – Sethmr
您是否必須將緯度和長度值存儲爲ascii?如果你可以將它們作爲浮點數存儲,這將會容易得多。 – Tim
@Tim如果他沒有字符串到浮點數的轉換,可能會更容易將它們作爲字符串...:D ...或將它們轉換爲整數,如果他知道總是隻有2個十進制數地方,他可以使用100 *整數的所有內容,並在最後兩位數字之前用「'。'」輸出。 (我有點不知道,在那裏我會開始寫ascii - > float convertor,可能通過使用C++來實現,這是一塊詭code的代碼)。 – Ped7g