gpt4 book ai didi

c - 如何反编译这个 x87 汇编计算?

转载 作者:太空狗 更新时间:2023-10-29 14:53:57 25 4
gpt4 key购买 nike

我正在逆向的程序在 float 和 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 程序哪里做错了?

最佳答案

在 asm 代码中,您实际上是将两个 doublefmul 指令相乘,而不是 floatint 。在 C 中做类似的事情:

#include <stdio.h>
#include <stdint.h>
#include <string.h>

int main()
{
uint64_t vbi = 0x4141414142424242ULL; // hex representation of double
double r, vb, va = 1.4426950408889634074;

memcpy(&vb, &vbi, sizeof(vb)); // copy hex to double
r = va * vb;
printf("va = %f, vb = %f, r = %f\n", va, vb, r);
return 0;
}

结果 = va = 1.442695,vb = 2261634.517647,r = 3262848.902913

LIVE DEMO

关于c - 如何反编译这个 x87 汇编计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35182509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com