【问题标题】:x87 floating point instructions into C codex87 浮点指令转换为 C 代码
【发布时间】:2015-12-09 15:21:45
【问题描述】:

我有这个赋值,x、y、z是double类型变量:

fldl    x
fldl    y
fmulp   st, st(1)
fldl    z
faddp   st, st (1)
fstpl   z

把它翻译成C,我得到了这个:

z+= x*y

我不确定 z 吗?我翻译对了吗? 谢谢,任何帮助表示赞赏。

【问题讨论】:

  • 不,我尝试下载一些支持汇编的编译器,但它似乎需要整个代码,而不是一段。我不知道如何测试一段代码:(
  • 你会推荐哪个编译器?
  • 显然您不确定汇编代码的效果或 C 代码的效果(或两者)。不清楚是哪个。它可能会帮助您编写详细的自然语言描述(您认为是)相关代码的效果。
  • 这取决于你的平台,但一般所有主流编译器都支持它。对于将是 MSVC 的 Windows,对于 Linux GCC 或 Clang(全部免费(软件))。是的,我相信您已经正确理解了这些说明。

标签: c assembly reverse-engineering x87


【解决方案1】:

是的,你猜对了意思。

为了以后的参考,您可以将此类代码粘贴到程序集文件中并在调试器中单步执行。从 at&t 语法中,我假设它适用于gas,gnu 汇编程序。你可以这样测试:

$ cat > test.s
.att_syntax noprefix
.globl _start
_start:
fldl    x
fldl    y
fmulp   st, st(1)
fldl    z
faddp   st, st (1)
fstpl   z
.data
x: .double 2
y: .double 3
z: .double 4
$ gcc -m32 -nostdlib -g test.s
$ gdb ./a.out
(gdb) b _start
Breakpoint 1 at 0x80480b8: file test.s, line 4.
(gdb) r
Starting program: /var/tmp/./a.out

Breakpoint 1, _start () at test.s:4
4       fldl    x
(gdb) s
5       fldl    y
(gdb)
6       fmulp   st, st(1)
(gdb)
7       fldl    z
(gdb)
8       faddp   st, st(1)
(gdb)
9       fstpl   z
(gdb)
0x080480d4 in ?? ()
(gdb) x/gf &z
0x80490e4:      10

注意我在最后添加了一些测试输入,并在顶部添加了一些需要的东西。

您当然也可以在执行期间随时检查所有寄存器,请参阅 gdb 帮助了解其他命令。

【讨论】:

  • 谢谢,这绝对是非常有帮助的,我一定会使用它以供将来参考。
猜你喜欢
  • 2021-08-16
  • 2011-05-21
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2012-09-06
  • 1970-01-01
相关资源
最近更新 更多