gpt4 book ai didi

c++ - 我如何用 C++ 编写程序集以添加(时间测试)

转载 作者:行者123 更新时间:2023-11-28 03:54:37 25 4
gpt4 key购买 nike

我想计算一下如果我做一个像 1+1 和 plus(int l,int r) 这样的简单操作会慢多少,它执行 l+r 并在溢出时抛出异常这里是一些带有 _C 的示例代码_V 是进位和溢出。如果您愿意,可以使用不同的方式编写异常代码。

我该如何编写才能快速测试进位/溢出并在为真时抛出异常?我从来没有在汇编中做过跳跃(甚至一些基础知识),所以即使在谷歌搜索之后我也有点无能为力。

这应该适用于 x32 comps。目前,我正在运行具有 x86、x86-64 集的 Intel Core Duo

unsigned int plus(unsigned int l, unsigned int r){
unsigned int v = l+r;
if (!_C) return v;
throw 1;
}

int plus(int l, int r){
int v = l+r;
if (!_V) return v;
throw 1;
}

最佳答案

您是希望 C/C++ 代码执行这些操作,还是想知道如何使用 x86 汇编语言执行这些操作?

在 C/C++ 中,确定进位很容易:

int _C = (v < l); // "v < r" works too

溢出有点复杂。通常,当两个操作数具有相同的符号但结果具有不同的符号时,就会标记溢出。在 x86 等二进制补码架构上,这可以写成:

int _V = ((l ^ r) >= 0) && ((l ^ v) < 0);

当且仅当符号一致时,l ^ r 的 MSB(符号位)将为 0,类似地,l ^ v 将具有非零符号位( =value 小于零)当且仅当 lv 具有相反的符号。

如果你想在汇编中编写它,你只需执行添加并分别使用 jcjo 跳转到进位/溢出处理程序。但是,您不能轻易地从汇编代码中抛出 C++ 异常。最简单的方法可能是用 C++ 编写一个简单的单行函数,它会抛出异常并从您的汇编代码中调用它。最终的 asm 代码看起来像这样:

    ; Assuming eax=l, ebx=r
add eax, ebx
jc .have_carry
; Continue computation here...
.have_carry:
call throw_overflow_exception

在某处定义了以下 C++ 辅助函数:

extern "C" void throw_overflow_exception()
{
throw 1; // or some other exception
}

您需要 extern C 来禁用此函数的 C++ 名称重整。还有其他约定(例如,一些编译器在 C 函数名称之前或之后添加下划线)——这取决于所使用的编译器和架构。

关于c++ - 我如何用 C++ 编写程序集以添加(时间测试),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4130693/

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