Chương trình Tôi đang đảo ngược làm phép nhân đơn giản giữa số float và 8 byte integer:Làm thế nào để dịch ngược tính toán lắp ráp x87 này?
section .data
va: dt 1.4426950408889634074
vb: dd 0x42424242
dd 0x41414141
section .text
global main
main:
fld tword[va]
fmul qword[vb]
ret
quả dưới 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
Tôi đang cố gắng để tái tạo chương trình này trong C (cùng 32bit môi trường):
#include <stdio.h>
int main() {
unsigned long long vb = 0x4141414142424242LL;
float r, va = 1.4426950408889634074F;
r = va * vb;
printf("%f\n", r);
}
... nhưng tôi nhận được kết quả rất khác nhau:
$ ./test
6783712964982603776.000000
Tôi đang làm gì sai trong chương trình C của mình?
Bạn bè x87 là gì? – m0skit0
x87 là tập hợp con liên quan đến điểm nổi của tập lệnh kiến trúc x86. => https://en.wikipedia.org/wiki/X87 – MCan
@ m0skit0 Tốt hơn cả x86, tất nhiên. – Neil