c - x87 浮点指令转换为 C 代码

标签 c assembly reverse-engineering x87

我有这个赋值,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 怎么样?我翻译的正确吗? 谢谢,任何帮助表示赞赏。

最佳答案

是的,您正确理解了含义。

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

$ 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 帮助。

关于c - x87 浮点指令转换为 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34182461/

相关文章:

c - <puts@plt> 到底是什么意思?

reverse-engineering - 发布一个游戏 MMORPG 的程序在道德上是否合理?

c - C中的位设置逻辑

iphone - Xcode中如何编译第三方c库?

c - m是一个定义为10+2的宏;为什么 m*m 的计算结果为 32?

c - recv - 始终填充第一个字节

c++ - 内联 assembly 约束修饰符 = 和 +

assembly - 多物理 CPU 机器上的 CPU 指令

c++ - 逆向工程 C++ DLL

.net - 如何从 Visual Basic 文件中提取函数调用图?