我有这个赋值,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/