Il programma che sto invertendo fa semplice moltiplicazione tra il numero galleggiante e 8 byte intero:Come decompilare questo calcolo dell'assieme x87?
section .data
va: dt 1.4426950408889634074
vb: dd 0x42424242
dd 0x41414141
section .text
global main
main:
fld tword[va]
fmul qword[vb]
ret
risultati sotto gdb:
Breakpoint 1, 0x08048360 in main()
(gdb) x/i $eip
0x8048360 <main>: fld TBYTE PTR ds:0x804953c
0x8048366 <main+6>: fmul QWORD PTR ds:0x8049546
0x804836c <main+12>: ret
(gdb) x/gx 0x8049546
0x8049546 <vb>: 0x4141414142424242
(gdb) si
0x08048366 in main()
0x0804836c in main()
(gdb) info float
=>R7: Valid 0x4014c726039c95268dc4 +3262848.902912714389
sto cercando di ricreare questo programma in C (stesso 32bit ambiente):
#include <stdio.h>
int main() {
unsigned long long vb = 0x4141414142424242LL;
float r, va = 1.4426950408889634074F;
r = va * vb;
printf("%f\n", r);
}
... ma ottengo risultati molto diversi:
$ ./test
6783712964982603776.000000
Cosa sto facendo male nel mio programma C?
Che cos'è un amico x87? – m0skit0
x87 è un sottoinsieme correlato al punto mobile del set di istruzioni dell'architettura x86. => https://en.wikipedia.org/wiki/X87 – MCan
@ m0skit0 Uno migliore di un x86, ovviamente. – Neil