如何将__asm块转换为基于字符串的asm(与g++兼容)
How do you convert __asm blocks to string-based asm (compatible with G++)?
我最近发现了一个c++库,它将非常适合我的项目,但它定义了两个函数,使用__asm块,只能在vc++中编译:
// upper 32-bit result of 32x32-bit product
inline unsigned Product_64(unsigned l, unsigned c)
{
_asm {
mov eax,l
mul c
mov eax,edx
}
} // return value in register EAX
// division of 64-bit (after scaling) by a 32-bit number
inline unsigned Division_64(unsigned dvh, unsigned dvr)
{
_asm {
xor eax,eax
not eax
mov edx,dvh
div dvr
}
} // return value in register EAX
这样做的问题是,我需要用g++编译项目,它使用基于字符串的asm块。考虑到我没有时间正确地学习汇编,是否有:
- 一个脚本,将可靠地转换为g++的字符串asm 在c++中重写此函数以达到相同效果的方法
- 关于如何在两种格式之间转换的简单说明列表
谢谢!
您在这里请求两件事:
- Intel ASM语法与AT&T语法之间的转换。参见http://www.delorie.com/djgpp/v2faq/faq17_2.html
- 调用约定之间的转换。例如,vc++总是假定返回值是EAX格式。在c++中,可以在c++和asm之间指定更复杂的行为。
将这两个函数重写为c++(未经测试,假设编译器中'long long'是64位):
- Product_64:返回(int)(((很久)l * c)>> 32);
- Division_64: return (int)(((((long long)dvh) <<32) + ~(long long)0)/dvr);
相关文章:
- 使用C++获取程序的 ASM
- 在 c++ 中使用 x86 DIV 的这个 asm 块有什么用?
- g++ -O3 为 loop 创建了奇怪的指令 - 两个具有相同 asm 的版本
- Extern "C"错误在'int'之前'asm'或'__attribute__'
- 了解 C/C++ 中 Windows / MSVC 的一些反调试内联 asm
- 尝试使用 x86 asm SSSE3 将大端转换为小端序
- 如何使用"asm volatile"编写 btr 指令
- objdump 不显示机器代码,但显示 ASM
- 未使用的 asm() 在不受支持的体系结构上的行为
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 为什么发出空asm命令会交换变量
- C++-更改另一个文件的ASM指令
- 尝试用纯 c 编程 arduino,得到以下错误:预期的"="、""、";",'asm'或"打印"之前的'__attribute__'|
- C++/ASM:按值传递使用 xmm0,但按引用使用 rdi
- 有人知道可以使用 c++ 以字节为单位编码 asm 字符串的任何东西吗?
- 优化了 VC++ 和 ASM 中的代码
- 如何在 Linux asm 中正确返回双精度值
- 使用读取[EBP 4]的MSVC内联ASM移植到64位
- 从 ASM 调用C++代码中标准库的链接