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 帮助了解其他命令。
我有这个赋值,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 帮助了解其他命令。