首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何反编译这个x87汇编计算?

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

Stack Overflow用户
提问于 2016-02-04 00:30:42
回答 1查看 298关注 0票数 5

我要反转的程序在浮点数和8字节整数之间做简单的乘法:

代码语言:javascript
复制
section .data

va: dt 1.4426950408889634074
vb: dd 0x42424242
    dd 0x41414141

section .text
global main

main:
    fld tword[va]
    fmul qword[vb]
    ret

gdb下的结果:

代码语言:javascript
复制
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位环境)中重新创建这个程序:

代码语言:javascript
复制
#include <stdio.h>

int main() {

    unsigned long long vb = 0x4141414142424242LL;
    float r, va = 1.4426950408889634074F;

    r = va * vb;
    printf("%f\n", r);
}

...but我得到了截然不同的结果:

代码语言:javascript
复制
$ ./test
6783712964982603776.000000

我在C程序中做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2016-02-04 01:26:39

这段汇编程序代码并没有做你认为它正在做的事情:

代码语言:javascript
复制
main:
    fld tword[va]
    fmul qword[vb]
    ret

你建议在浮点数和8字节整数之间进行简单的乘法。这实际上是将10字节扩展双精度浮点值乘以由0x41414142424242表示的8字节双精度(非8字节整数)。代码将0x41414141424242视为8字节双精度浮点值的位,而不是转换为双精度浮点值的8字节整数。

你认为正在发生的事情的代码可能是这样的:

代码语言:javascript
复制
main:
    fild qword[vb]     ; Convert 64-bit integer to an extended precision double in st0
    fld tword[va]      ; st(0)=>st(1) st(0) = 10-byte float(va)
    fmulp              ; Multiply st(0) and st(1). Result in st(0).

这只是消除了你对汇编程序代码的误解。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35182509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档