Das Programm mir Umkehr tut einfache Multiplikation zwischen Float-Zahl und 8 Byte integer:Wie dekompiliere ich diese x87-Assembly-Berechnung?
section .data
va: dt 1.4426950408889634074
vb: dd 0x42424242
dd 0x41414141
section .text
global main
main:
fld tword[va]
fmul qword[vb]
ret
Ergebnis unter 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
Ich versuche, dieses Programm in C (gleichen 32bit neu Umwelt):
#include <stdio.h>
int main() {
unsigned long long vb = 0x4141414142424242LL;
float r, va = 1.4426950408889634074F;
r = va * vb;
printf("%f\n", r);
}
... aber ich habe sehr unterschiedliche Ergebnisse:
$ ./test
6783712964982603776.000000
Was ist falsch in meinem C-Programm ich tue?
Was ist x87 Buddy? – m0skit0
x87 ist eine Fließkomma-bezogene Teilmenge des x86-Architekturbefehlssatzes. => https://en.wikipedia.org/wiki/X87 – MCan
@ m0skit0 Ein besser als ein x86, natürlich. – Neil