【发布时间】:2016-05-12 23:20:04
【问题描述】:
我正在反转的程序在浮点数和 8 字节整数之间进行简单的乘法:
section .data
va: dt 1.4426950408889634074
vb: dd 0x42424242
dd 0x41414141
section .text
global main
main:
fld tword[va]
fmul qword[vb]
ret
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
我正在尝试在 C 中重新创建这个程序(相同的 32 位环境):
#include <stdio.h>
int main() {
unsigned long long vb = 0x4141414142424242LL;
float r, va = 1.4426950408889634074F;
r = va * vb;
printf("%f\n", r);
}
...但我得到了非常不同的结果:
$ ./test
6783712964982603776.000000
我在我的 C 程序中做错了什么?
【问题讨论】:
-
x87 是 x86 架构指令集的浮点相关子集。 => en.wikipedia.org/wiki/X87
-
@m0skit0 当然比 x86 好。
-
0x4141414142424242 x 1.4426950408889634074 绝对是 6783712964982603776.000000,而不是 3262848.902912714389。
-
@m0skit0:如果你的个人资料图片暗示你那么老,你应该知道;-)
-
@Olaf 事实上我知道,因为我什至有一个 387,我只是被这个符号弄糊涂了:^P
标签: c assembly floating-point reverse-engineering x87