鱼C论坛

 找回密码
 立即注册
查看: 4148|回复: 3

汇编语言怎么实现以e为底的对数函数?

[复制链接]
发表于 2021-7-8 09:47:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
汇编语言怎么实现以e为底的对数函数?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-8 10:23:50 | 显示全部楼层
你先用C语言实现一个,然后编译一下就成汇编语言了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-8 20:31:19 | 显示全部楼层
我去补了一下自己的数学功底,用C语言写了一个
  1. #include <stdio.h>
  2. #include <math.h>

  3. double ya_log(double x) {
  4.     double result = 0;
  5.     while(pow(M_E, result) < x) ++result;
  6.     double half = 0.5;
  7.     for(size_t i = 0; i < 100; ++i) {
  8.         double p = pow(M_E, result);
  9.         if(p < x) {
  10.             result += half;
  11.         } else if(p > x) {
  12.             result -= half;
  13.         } else return result;
  14.         half /= 2;
  15.     }
  16.     return result;
  17. }

  18. int main(void) {
  19.     for(size_t i = 0; i < 50; ++i) {
  20.         printf("%.20lf\n", log(i));
  21.         printf("%.20lf\n", ya_log(i));
  22.         printf("\n");
  23.     }
  24.     return 0;
  25. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-8 20:32:48 | 显示全部楼层
汇编语言版本
  1. $ gcc -S main.c
  2. $ cat main.s
  3.         .file   "main.c"
  4.         .text
  5.         .globl  ya_log
  6.         .def    ya_log; .scl    2;      .type   32;     .endef
  7.         .seh_proc       ya_log
  8. ya_log:
  9.         pushq   %rbp
  10.         .seh_pushreg    %rbp
  11.         movq    %rsp, %rbp
  12.         .seh_setframe   %rbp, 0
  13.         subq    $80, %rsp
  14.         .seh_stackalloc 80
  15.         .seh_endprologue
  16.         movsd   %xmm0, 16(%rbp)
  17.         pxor    %xmm0, %xmm0
  18.         movsd   %xmm0, -8(%rbp)
  19.         jmp     .L2
  20. .L3:
  21.         movsd   -8(%rbp), %xmm1
  22.         movsd   .LC1(%rip), %xmm0
  23.         addsd   %xmm1, %xmm0
  24.         movsd   %xmm0, -8(%rbp)
  25. .L2:
  26.         movsd   -8(%rbp), %xmm0
  27.         movq    .LC2(%rip), %rax
  28.         movapd  %xmm0, %xmm1
  29.         movq    %rax, -40(%rbp)
  30.         movsd   -40(%rbp), %xmm0
  31.         call    pow
  32.         movapd  %xmm0, %xmm1
  33.         movsd   16(%rbp), %xmm0
  34.         ucomisd %xmm1, %xmm0
  35.         ja      .L3
  36.         movsd   .LC3(%rip), %xmm0
  37.         movsd   %xmm0, -16(%rbp)
  38.         movq    $0, -24(%rbp)
  39.         jmp     .L4
  40. .L11:
  41.         movsd   -8(%rbp), %xmm0
  42.         movq    .LC2(%rip), %rax
  43.         movapd  %xmm0, %xmm1
  44.         movq    %rax, -40(%rbp)
  45.         movsd   -40(%rbp), %xmm0
  46.         call    pow
  47.         movq    %xmm0, %rax
  48.         movq    %rax, -32(%rbp)
  49.         movsd   16(%rbp), %xmm0
  50.         ucomisd -32(%rbp), %xmm0
  51.         jbe     .L14
  52.         movsd   -8(%rbp), %xmm0
  53.         addsd   -16(%rbp), %xmm0
  54.         movsd   %xmm0, -8(%rbp)
  55.         jmp     .L7
  56. .L14:
  57.         movsd   -32(%rbp), %xmm0
  58.         ucomisd 16(%rbp), %xmm0
  59.         jbe     .L15
  60.         movsd   -8(%rbp), %xmm0
  61.         subsd   -16(%rbp), %xmm0
  62.         movsd   %xmm0, -8(%rbp)
  63.         jmp     .L7
  64. .L15:
  65.         movsd   -8(%rbp), %xmm0
  66.         jmp     .L10
  67. .L7:
  68.         movsd   -16(%rbp), %xmm0
  69.         movsd   .LC4(%rip), %xmm1
  70.         divsd   %xmm1, %xmm0
  71.         movsd   %xmm0, -16(%rbp)
  72.         addq    $1, -24(%rbp)
  73. .L4:
  74.         cmpq    $99, -24(%rbp)
  75.         jbe     .L11
  76.         movsd   -8(%rbp), %xmm0
  77. .L10:
  78.         addq    $80, %rsp
  79.         popq    %rbp
  80.         ret
  81.         .seh_endproc
  82.         .def    __main; .scl    2;      .type   32;     .endef
  83.         .section .rdata,"dr"
  84. .LC5:
  85.         .ascii "%.20lf\12\0"
  86.         .text
  87.         .globl  main
  88.         .def    main;   .scl    2;      .type   32;     .endef
  89.         .seh_proc       main
  90. main:
  91.         pushq   %rbp
  92.         .seh_pushreg    %rbp
  93.         movq    %rsp, %rbp
  94.         .seh_setframe   %rbp, 0
  95.         subq    $64, %rsp
  96.         .seh_stackalloc 64
  97.         .seh_endprologue
  98.         call    __main
  99.         movq    $0, -8(%rbp)
  100.         jmp     .L17
  101. .L22:
  102.         movq    -8(%rbp), %rax
  103.         testq   %rax, %rax
  104.         js      .L18
  105.         cvtsi2sdq       %rax, %xmm0
  106.         jmp     .L19
  107. .L18:
  108.         movq    %rax, %rdx
  109.         shrq    %rdx
  110.         andl    $1, %eax
  111.         orq     %rax, %rdx
  112.         cvtsi2sdq       %rdx, %xmm0
  113.         addsd   %xmm0, %xmm0
  114. .L19:
  115.         call    log
  116.         movq    %xmm0, %rax
  117.         movq    %rax, %rdx
  118.         movq    %rdx, -24(%rbp)
  119.         movsd   -24(%rbp), %xmm0
  120.         movapd  %xmm0, %xmm1
  121.         movq    %rax, %rdx
  122.         leaq    .LC5(%rip), %rcx
  123.         call    printf
  124.         movq    -8(%rbp), %rax
  125.         testq   %rax, %rax
  126.         js      .L20
  127.         cvtsi2sdq       %rax, %xmm0
  128.         jmp     .L21
  129. .L20:
  130.         movq    %rax, %rdx
  131.         shrq    %rdx
  132.         andl    $1, %eax
  133.         orq     %rax, %rdx
  134.         cvtsi2sdq       %rdx, %xmm0
  135.         addsd   %xmm0, %xmm0
  136. .L21:
  137.         call    ya_log
  138.         movq    %xmm0, %rax
  139.         movq    %rax, %rdx
  140.         movq    %rdx, -24(%rbp)
  141.         movsd   -24(%rbp), %xmm0
  142.         movapd  %xmm0, %xmm1
  143.         movq    %rax, %rdx
  144.         leaq    .LC5(%rip), %rcx
  145.         call    printf
  146.         movl    $10, %ecx
  147.         call    putchar
  148.         addq    $1, -8(%rbp)
  149. .L17:
  150.         cmpq    $49, -8(%rbp)
  151.         jbe     .L22
  152.         movl    $0, %eax
  153.         addq    $64, %rsp
  154.         popq    %rbp
  155.         ret
  156.         .seh_endproc
  157.         .section .rdata,"dr"
  158.         .align 8
  159. .LC1:
  160.         .long   0
  161.         .long   1072693248
  162.         .align 8
  163. .LC2:
  164.         .long   2333366121
  165.         .long   1074118410
  166.         .align 8
  167. .LC3:
  168.         .long   0
  169.         .long   1071644672
  170.         .align 8
  171. .LC4:
  172.         .long   0
  173.         .long   1073741824
  174.         .ident  "GCC: (GNU) 7.4.0"
  175.         .def    pow;    .scl    2;      .type   32;     .endef
  176.         .def    log;    .scl    2;      .type   32;     .endef
  177.         .def    printf; .scl    2;      .type   32;     .endef
  178.         .def    putchar;        .scl    2;      .type   32;     .endef
  179. $
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 22:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表