Domanda

Ecco il mio breve il montaggio del programma:

; This code has been generated by the 7Basic
; compiler <http://launchpad.net/7basic>

extern printf

; Initialized data

      SECTION .data
f_0 dd 5.5
printf_f: db "%f",10,0

      SECTION .text

; Code

global main
  main:
push ebp
mov ebp,esp

push dword [f_0]
push printf_f
call printf
add esp,8

mov esp,ebp
pop ebp
mov eax,0
ret

Quello che il programma è dovrebbe fare è stampare 5.5, ma esso stampa:

-4101885043414705786563701568963176764603483495211119243453355953219830430011006780068899468997203661787555969981250050126586203424320244681571103387315766489883301796219461838644670607029711305942610787622864198879363376953745160639821663444829839767678538571371627347101810056161000273217639447052410683392.000000

Cosa diavolo sto facendo di sbagliato? Il codice sta spingendo i due argomenti di printf() e quindi chiamando esso. Niente di complicato.


Aggiornamento: ero un po 'prematuro pensare che avevo risolto questo. Ho aggiornato il codice.

È stato utile?

Soluzione

Il push f_0 istruzione spinge l'indirizzo f_0 in pila, non 5.5 nella memoria lì, quindi la routine printf avrà l'indirizzo, più l'EBP salvato (i successivi 4 byte nello stack) ed interpretare i bit come raddoppiare e stamparlo. Che si rivela essere un numero molto grande, come si vede.

È necessario caricare 8 byte da f_0 e spingere quelli. qualcosa come

move eax, f_0
push dword ptr [eax+4]
push dword ptr [eax]

modifica

È necessario spingere 8 byte come fp64 valori sono 8 byte. fp64 è tutto ciò che printf sa come stampare - in realtà fp64 è tutto ciò che C sa come passare alle funzioni o operare su. fp32 valore può essere caricato solo da e memorizzato nella memoria, ma sono sempre convertito implicitamente fp64 (o più) prima di essere operato. Se si desidera caricare un valore fp32, convertirlo fp64, e spingerlo nello stack, è possibile utilizzare

fld dword ptr [f_0]
sub esp, 8
fstp qword ptr [esp]

Ciò realmente carichi un valore fp32 e lo converte in fp80 (formato interno del x87), poi convertiti che fp80 valore fp64 e lo memorizza in pila.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top