x87 浮点指令转换为 C 代码

x87 floating point instructions into C code

我有这个赋值,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 语法,我假设它是为 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 帮助了解其他命令。