gpt4 book ai didi

c++ - 崩溃 : passing return value to C++ code and performance improvement about inline assembly language

转载 作者:行者123 更新时间:2023-11-27 23:25:52 25 4
gpt4 key购买 nike

我尝试计算 x = x + sin(degree) * radius 的结果。虽然我对汇编语言完全陌生,但我在 C++ 中尝试了它以提高性能,然后我得到以下函数:

void calcu()
{
//double x;
__asm
{
mov ecx,989680H
mov eax,0
start:
push eax
fldpi
fmul
mov ebx,0B4H
push ebx
fdivp st(1),st
fsin
mov eax,5
push eax
fmul
fadd
add eax,1EH
fistp x
loop start
};
}
  • 第一个问题是当我调用它时程序崩溃了功能。经过一点调试我发现声明 push eax 是唯一的那个。当我试图将一个值插入堆栈?
  • 第二个是你可能会注意到顶部有一条评论这个函数,因为我不知道如何获得的返回值变量 x 的汇编语句。
  • 最后一个问题是,当我尝试调用此函数 10,000,000 次时,汇编代码的运行速度是否比 C++ 版本快得多?

最佳答案

如果您想学习汇编,我强烈建议您编写 C 或 C++ 代码并检查生成的汇编是否适合您选择的目标。

这会给你一个基础。

#include <cmath>

double compute(double x, double degree, double radius) {
return x + std::sin(degree) * radius;
}

给出以下 LLVM IR:

define double @_Z7computeddd(double %x, double %degree, double %radius)
nounwind uwtable readnone
{
%1 = tail call double @sin(double %degree) nounwind readnone
%2 = fmul double %1, %radius
%3 = fadd double %2, %x
ret double %3
}

declare double @sin(double) nounwind readnone

它给出了以下程序集:

    .text
.globl _Z7computeddd
.align 16, 0x90
.type _Z7computeddd,@function
_Z7computeddd: # @_Z7computeddd
.Ltmp1:
.cfi_startproc
# BB#0:
subq $24, %rsp
.Ltmp2:
.cfi_def_cfa_offset 32
movsd %xmm2, 16(%rsp) # 8-byte Spill
movsd %xmm0, 8(%rsp) # 8-byte Spill
movaps %xmm1, %xmm0
callq sin
mulsd 16(%rsp), %xmm0 # 8-byte Folded Reload
addsd 8(%rsp), %xmm0 # 8-byte Folded Reload
addq $24, %rsp
ret
.Ltmp3:
.size _Z7computeddd, .Ltmp3-_Z7computeddd
.Ltmp4:
.cfi_endproc
.Leh_func_end0:


.section ".note.GNU-stack","",@progbits

请注意,仍然有一个 sin 调用。

关于c++ - 崩溃 : passing return value to C++ code and performance improvement about inline assembly language,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9567931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com