鱼C论坛

 找回密码
 立即注册
查看: 4820|回复: 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语言写了一个
#include <stdio.h>
#include <math.h>

double ya_log(double x) {
    double result = 0;
    while(pow(M_E, result) < x) ++result;
    double half = 0.5;
    for(size_t i = 0; i < 100; ++i) {
        double p = pow(M_E, result);
        if(p < x) {
            result += half;
        } else if(p > x) {
            result -= half;
        } else return result;
        half /= 2;
    }
    return result;
}

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

使用道具 举报

发表于 2021-7-8 20:32:48 | 显示全部楼层
汇编语言版本
$ gcc -S main.c
$ cat main.s
        .file   "main.c"
        .text
        .globl  ya_log
        .def    ya_log; .scl    2;      .type   32;     .endef
        .seh_proc       ya_log
ya_log:
        pushq   %rbp
        .seh_pushreg    %rbp
        movq    %rsp, %rbp
        .seh_setframe   %rbp, 0
        subq    $80, %rsp
        .seh_stackalloc 80
        .seh_endprologue
        movsd   %xmm0, 16(%rbp)
        pxor    %xmm0, %xmm0
        movsd   %xmm0, -8(%rbp)
        jmp     .L2
.L3:
        movsd   -8(%rbp), %xmm1
        movsd   .LC1(%rip), %xmm0
        addsd   %xmm1, %xmm0
        movsd   %xmm0, -8(%rbp)
.L2:
        movsd   -8(%rbp), %xmm0
        movq    .LC2(%rip), %rax
        movapd  %xmm0, %xmm1
        movq    %rax, -40(%rbp)
        movsd   -40(%rbp), %xmm0
        call    pow
        movapd  %xmm0, %xmm1
        movsd   16(%rbp), %xmm0
        ucomisd %xmm1, %xmm0
        ja      .L3
        movsd   .LC3(%rip), %xmm0
        movsd   %xmm0, -16(%rbp)
        movq    $0, -24(%rbp)
        jmp     .L4
.L11:
        movsd   -8(%rbp), %xmm0
        movq    .LC2(%rip), %rax
        movapd  %xmm0, %xmm1
        movq    %rax, -40(%rbp)
        movsd   -40(%rbp), %xmm0
        call    pow
        movq    %xmm0, %rax
        movq    %rax, -32(%rbp)
        movsd   16(%rbp), %xmm0
        ucomisd -32(%rbp), %xmm0
        jbe     .L14
        movsd   -8(%rbp), %xmm0
        addsd   -16(%rbp), %xmm0
        movsd   %xmm0, -8(%rbp)
        jmp     .L7
.L14:
        movsd   -32(%rbp), %xmm0
        ucomisd 16(%rbp), %xmm0
        jbe     .L15
        movsd   -8(%rbp), %xmm0
        subsd   -16(%rbp), %xmm0
        movsd   %xmm0, -8(%rbp)
        jmp     .L7
.L15:
        movsd   -8(%rbp), %xmm0
        jmp     .L10
.L7:
        movsd   -16(%rbp), %xmm0
        movsd   .LC4(%rip), %xmm1
        divsd   %xmm1, %xmm0
        movsd   %xmm0, -16(%rbp)
        addq    $1, -24(%rbp)
.L4:
        cmpq    $99, -24(%rbp)
        jbe     .L11
        movsd   -8(%rbp), %xmm0
.L10:
        addq    $80, %rsp
        popq    %rbp
        ret
        .seh_endproc
        .def    __main; .scl    2;      .type   32;     .endef
        .section .rdata,"dr"
.LC5:
        .ascii "%.20lf\12\0"
        .text
        .globl  main
        .def    main;   .scl    2;      .type   32;     .endef
        .seh_proc       main
main:
        pushq   %rbp
        .seh_pushreg    %rbp
        movq    %rsp, %rbp
        .seh_setframe   %rbp, 0
        subq    $64, %rsp
        .seh_stackalloc 64
        .seh_endprologue
        call    __main
        movq    $0, -8(%rbp)
        jmp     .L17
.L22:
        movq    -8(%rbp), %rax
        testq   %rax, %rax
        js      .L18
        cvtsi2sdq       %rax, %xmm0
        jmp     .L19
.L18:
        movq    %rax, %rdx
        shrq    %rdx
        andl    $1, %eax
        orq     %rax, %rdx
        cvtsi2sdq       %rdx, %xmm0
        addsd   %xmm0, %xmm0
.L19:
        call    log
        movq    %xmm0, %rax
        movq    %rax, %rdx
        movq    %rdx, -24(%rbp)
        movsd   -24(%rbp), %xmm0
        movapd  %xmm0, %xmm1
        movq    %rax, %rdx
        leaq    .LC5(%rip), %rcx
        call    printf
        movq    -8(%rbp), %rax
        testq   %rax, %rax
        js      .L20
        cvtsi2sdq       %rax, %xmm0
        jmp     .L21
.L20:
        movq    %rax, %rdx
        shrq    %rdx
        andl    $1, %eax
        orq     %rax, %rdx
        cvtsi2sdq       %rdx, %xmm0
        addsd   %xmm0, %xmm0
.L21:
        call    ya_log
        movq    %xmm0, %rax
        movq    %rax, %rdx
        movq    %rdx, -24(%rbp)
        movsd   -24(%rbp), %xmm0
        movapd  %xmm0, %xmm1
        movq    %rax, %rdx
        leaq    .LC5(%rip), %rcx
        call    printf
        movl    $10, %ecx
        call    putchar
        addq    $1, -8(%rbp)
.L17:
        cmpq    $49, -8(%rbp)
        jbe     .L22
        movl    $0, %eax
        addq    $64, %rsp
        popq    %rbp
        ret
        .seh_endproc
        .section .rdata,"dr"
        .align 8
.LC1:
        .long   0
        .long   1072693248
        .align 8
.LC2:
        .long   2333366121
        .long   1074118410
        .align 8
.LC3:
        .long   0
        .long   1071644672
        .align 8
.LC4:
        .long   0
        .long   1073741824
        .ident  "GCC: (GNU) 7.4.0"
        .def    pow;    .scl    2;      .type   32;     .endef
        .def    log;    .scl    2;      .type   32;     .endef
        .def    printf; .scl    2;      .type   32;     .endef
        .def    putchar;        .scl    2;      .type   32;     .endef
$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 03:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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