第68部分- Linux x86 64位汇编 FPU之对数函数

第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*2210*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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值