第68部分- Linux x86 64位汇编 FPU之对数函数
对数函数提供用于底数为2的对数计算。
FYL2X
执行如下:
ST(1)*log2(st(0))
FYL2X1
执行如下:
ST(1)*log2(st(0)+1.0)
FSCALE指令计算ST(0)乘以ST(1)次乘方
示例-fscale
计算:
10*22和10*2-2
.extern printf ;//调用外部的printf函数
.section .data
fmt: .ascii "result is: %f \n"
value:
.float 10.0
scale1:
.float 2.0
scale2:
.float -2.0
.section .bss
.lcomm result1, 8
.lcomm result2, 8
.section .text
.globl _start
_start:
nop
finit;//初始化fpu
flds scale1;//加载scale1值到st0
flds value;//加载10值到st0,scale1移动到st1
fscale;//执行fscale,10*22
fstl result1;//将结果报错到result1中
movq $fmt,%rdi
movq result1,%xmm0
call printf
flds scale2;//加载sacle2到st0
flds value;//记载value到st0,scale2移动到st1
fscale;//执行fscale,10*2-2
fstl result2;//将结果报错到result2中
movq $fmt,%rdi
movq result2,%xmm0
call printf
movq $60,%rax
syscall
as -g -o fscaletest.o fscaletest.s
ld -o fscaletest fscaletest.o -lc -I /lib64/ld-linux-x86-64.so.2
示例—求对数
计算log (base b) X=(1/log(base 2) b) * log ( base 2) X
即log1012= log212/log210
.extern printf ;//调用外部的printf函数
.section .data
fmt: .ascii "result is: %f \n"
value:
.float 12.0
base:
.float 10.0
.section .bss
.lcomm result, 8
.section .text
.globl _start
_start:
nop
finit;//初始化fpu
fld1;//fld1加载1.0到st0
flds base;//加载base到st0,1.0移动到st1
fyl2x;//执行 ST(1)*log2(st(0)),即1*log2(10)
fld1;// 加载1到st0中,刚才的结果移动到st1
fdivp;// 执行st0/st1,即1/log2(10)
flds value;//加载12到st0,上步结果1/log2(10)保存到st1
fyl2x;// ST(1)*log2(st(0)),即1/log2(10)*log2(12)=log10(12)
fstl result;//加载结果到result
movq $fmt,%rdi
movq result,%xmm0
call printf
movq $60,%rax
syscall
as -g -o logtest.o logtest_att.s
ld -o logtest logtest.o -lc -I /lib64/ld-linux-x86-64.so.2