GCC 内联 ASM 跳转到带有交叉抛出异常的标签
gcc inline asm jump to a label with crossing throwing an exception
我想添加两个int
数字。如果溢出,则引发异常。当我抛出异常时,代码无法编译。但是如果我不写其他代码,那也没关系。
#include <iostream>
#include <stdexcept>
int main()
{
int a,b;
std::cin >> a >> b;
asm("movl %0, %%eax;nt"
"addl %1, %%eaxnt"
"jno _L_NO_OVERFLOW_nt;"
:
:"m"(a),"m"(b)
:"%eax");
throw std::overflow_error("overflow");
//std::cout << "overflow" << std::endl;//it's OK
asm("_L_NO_OVERFLOW_:nt"
"movl %%eax, %0nt"
:"=m"(a));
std::cout << a << std::endl;
return 0;
}
错误消息undefined reference to L_NO_OVERFLOW_
您必须使用asm goto
表单来指定标签:
#include <iostream>
#include <stdexcept>
int main()
{
int a,b;
std::cin >> a >> b;
asm goto ("movl %0, %%eax;nt"
"addl %1, %%eaxnt"
"jno %l2nt;"
:
:"m"(a),"m"(b)
:"%eax"
:L_NO_OVERFLOW);
throw std::overflow_error("overflow");
L_NO_OVERFLOW:
asm("movl %%eax, %0nt"
:"=m"(a));
std::cout << a << std::endl;
return 0;
}
想法是告诉编译器,你的内联汇编程序破坏了一个标签,并直接指定涉及该标签的控制流。
UPD:另请注意,您必须有相当新的 gcc 来支持此功能。版本> 4.5 似乎还可以。我在 4.8.1 上进行了测试
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 函数如何通知用户它基于函数原型抛出异常?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- VisualStudios 会抛出异常,而代码块不会 [C++]
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- new(std::nothrow) int[n] 抛出异常
- 为什么g_object_set抛出异常(vcruntime140.dll)?
- 你能防止 std::regex 在无效表达式上抛出异常吗?
- C++子线程抛出异常
- 我们应该在抛出异常之前取消分配内存吗
- 有没有一种方法可以让OpenCLC++绑定为所有错误抛出异常
- 为什么访问模板化变体作为返回值抛出异常
- 如何实现,错误分配中止而不是抛出异常
- std::p riority_queue::p op什么时候会抛出异常
- 在0x5914F3BE抛出异常(基于.dll)
- std::vector 默认构造函数可以抛出异常吗?
- 挂钩创建文件抛出异常:读取访问冲突
- getaddrinfo 抛出异常
- GCC 内联 ASM 跳转到带有交叉抛出异常的标签