|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Nov 2010
Messaggi: 11
|
Esercizio Assembler
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à. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2008
Messaggi: 8106
|
Interessante, avevo fatto una calcolatrice in assembler, gli scrivevi una stringa con le operazioni anche con le parentesi e i quadrati e le radici e la risolveva...mi spiace che ho perso tutto alla scorsa formattazione, pensavo di averle sulla pennina invece nisba.
__________________
System Failure ![]() |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Nov 2010
Messaggi: 11
|
Problema risolto: per caricare un reale a doppia precisione in pila FPU bastava scrivere FLDL (%EAX).
Grazie comunque ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:57.