Nagashi890
16-11-2010, 17:24
Salve a tutti. Sono nuovo di questo forum.
Ho un problema con un programmino che ho scritto:
Scrivere un programma che accetta due double da tastiera, più uno tra i seguenti caratteri: ‘+’, ‘-‘,
‘*’, ‘/’. Il programma esegue l’operazione specificata dal carattere sui due numeri e stampa il risultato,
se questo esiste ed è rappresentabile. Altrimenti legge il registro di stato e stampa un messaggio
di errore che rende conto del tipo di problema riscontrato.
Mia soluzione (incompleta nel senso che mi sono fermato al caso "se inserisco + fai la somma altrimenti termina il programma")
.GLOBAL _main
.DATA
A: .DOUBLE 1.0
B: .DOUBLE 1.0
risultato: .DOUBLE 1.0
.TEXT
_main: NOP
FINIT
redo: MOV $'A', %AL
CALL output
MOV $':', %AL
CALL output
LEA A, %EAX
CALL d_input
PUSH (%EAX)
FLDL (%ESP)
XOR %EAX, %EAX
MOV $'B', %AL
CALL output
MOV $':', %AL
CALL output
LEA B, %EAX
CALL d_input
PUSH (%EAX)
FLDL (%ESP)
MOV $'?', %AL
CALL output
CALL input
CALL output
CMP $'+', %AL
JE somma
JMP fine
somma: FADD %ST(1), %ST(0)
FSTPL risultato
LEA risultato, %EAX
CALL newline
CALL d_output
XOR %EAX, %EAX
CALL newline
JMP redo
fine: XOR %EAX, %EAX
RET
.INCLUDE "C:/GAS/utility"
(il sottoprogramma d_input chiede un double da tastiera e lo inserisce in memoria all'indirizzo contenuto in EAX).
Se inserisco A: 1.0 e B: 1.0 e poi il +, mi stampa 3.19318e-310
se inserisco un carattere diverso dal + mi dà un segmentation fault e stampa
"0x00000000 in ??"
Qualcuno sa indicarmi dove sbaglio?
Ho qualche dubbio su questa istruzione
PUSH (%EAX)
FLDL (%ESP)
ma altrimenti non saprei come caricare un double nella pila FPU.
Grazie in anticipo a chi mi aiuterà.
Ho un problema con un programmino che ho scritto:
Scrivere un programma che accetta due double da tastiera, più uno tra i seguenti caratteri: ‘+’, ‘-‘,
‘*’, ‘/’. Il programma esegue l’operazione specificata dal carattere sui due numeri e stampa il risultato,
se questo esiste ed è rappresentabile. Altrimenti legge il registro di stato e stampa un messaggio
di errore che rende conto del tipo di problema riscontrato.
Mia soluzione (incompleta nel senso che mi sono fermato al caso "se inserisco + fai la somma altrimenti termina il programma")
.GLOBAL _main
.DATA
A: .DOUBLE 1.0
B: .DOUBLE 1.0
risultato: .DOUBLE 1.0
.TEXT
_main: NOP
FINIT
redo: MOV $'A', %AL
CALL output
MOV $':', %AL
CALL output
LEA A, %EAX
CALL d_input
PUSH (%EAX)
FLDL (%ESP)
XOR %EAX, %EAX
MOV $'B', %AL
CALL output
MOV $':', %AL
CALL output
LEA B, %EAX
CALL d_input
PUSH (%EAX)
FLDL (%ESP)
MOV $'?', %AL
CALL output
CALL input
CALL output
CMP $'+', %AL
JE somma
JMP fine
somma: FADD %ST(1), %ST(0)
FSTPL risultato
LEA risultato, %EAX
CALL newline
CALL d_output
XOR %EAX, %EAX
CALL newline
JMP redo
fine: XOR %EAX, %EAX
RET
.INCLUDE "C:/GAS/utility"
(il sottoprogramma d_input chiede un double da tastiera e lo inserisce in memoria all'indirizzo contenuto in EAX).
Se inserisco A: 1.0 e B: 1.0 e poi il +, mi stampa 3.19318e-310
se inserisco un carattere diverso dal + mi dà un segmentation fault e stampa
"0x00000000 in ??"
Qualcuno sa indicarmi dove sbaglio?
Ho qualche dubbio su questa istruzione
PUSH (%EAX)
FLDL (%ESP)
ma altrimenti non saprei come caricare un double nella pila FPU.
Grazie in anticipo a chi mi aiuterà.