草庐IT

Assembly

全部标签

c++ - 为什么 gcc 在按值传递微不足道的结构时会发出不需要的内存访问?

众所周知,一些没有非平凡复制构造函数和非平凡构造函数的小结构在寄存器中传递。引用ARMProceduralCallStandard:Fundamentaltypeslargerthan32bitsmaybepassedasparametersto,orreturnedastheresultof,functioncalls.Whenthesetypesareincoreregistersthefollowingrulesapply:Adouble-wordsizedtypeispassedintwoconsecutiveregisters(e.g.,r0andr1,orr2andr3)

c++ - 带有早期 if 语句的函数中不必要的 pop 指令

在玩godbolt.org时,我注意到gcc(6.2、7.0快照)、clang(3.9)和icc(17)在编译接近inta(int*a,int*b){if(b-a将(-O2/-O3)编译成这样的东西:pushr15movrax,rcxpushr14subrax,rdxpushr13pushr12pushrbppushrbxsubrsp,184movQWORDPTR[rsp],rdxcmprax,7jg.L95notDWORDPTR[rdx].L162:addrsp,184poprbxpoprbppopr12popr13popr14popr15ret在b-amovrax,rcxsubra

C++ - 极其奇怪的机器代码行为

完整代码在这里:http://pastebin.com/MM3vWmqA在fast_generator函数中,我为两个语句添加了注释。如果您切换这些语句,代码的运行速度将提高约1.8倍。如果您删除第一条语句,代码将比原始版本执行得更快,但与切换它们相比会更慢。测试用例应该如下所示。首先-最慢。452毫秒。counter++;i--;第二个-比第一个快。280毫秒。i--;counter++;第三个-比第一个快,但比第二个慢。421毫秒。i--;原始语句的汇编器输出是。incedxmoveax,6我已经验证,当切换这些语句时,汇编器输出保持不变,唯一的区别是这些asm指令被互换了。我已经

c++ - WORD 的 cmpxchg 比 BYTE 快

昨天我发布了thisquestion关于如何编写快速自旋锁。感谢CoryNelson,我似乎找到了一种优于我问题中讨论的其他方法的方法。我使用CMPXCHG指令来检查锁是否为0从而释放。CMPXCHG对“BYTE”、WORD和DWORD进行操作。我假设该指令在BYTE上运行得更快。但是我写了一个实现每种数据类型的锁:inlinevoidspin_lock_8(char*lck){__asm{movebx,lck;movelckpointerintoebxxorcl,cl;setCLto0inccl;incrementCLto1pause;spin_loop:xoral,al;setAL

c++ - AVX 中的水平异或

有没有办法对AVX寄存器进行水平异或——特别是对256位寄存器的四个64位组件进行异或?目标是获得AVX寄存器的所有4个64位组件的异或。它本质上与水平添加(_mm256_hadd_epi32())做同样的事情,除了我想要XOR而不是ADD。标量代码是:inlineuint64_tHorizontalXor(__m256it){returnt.m256i_u64[0]^t.m256i_u64[1]^t.m256i_u64[2]^t.m256i_u64[3];} 最佳答案 正如评论中所述,最快的代码很可能使用标量运算,在整数寄存器中执

c++ - C++ 隐含了这个,以及它是如何被压入堆栈的

我需要知道,当调用C++中的类方法时,隐式“this”指针是第一个参数还是最后一个参数。即:它是先入栈还是最后入栈。换句话说,我是在询问一个被调用的类方法是否被编译器认为是:intfoo::bar(foo*constthis,intarg1,intarg2);//or:intfoo::bar(intarg1,intarg2,foo*constthis);因此,通过扩展,更重要的是,这也将回答G++是将this指针分别压入最后还是最先。我查询了谷歌,但没有找到太多。另外,当调用C++函数时,它们是否与C函数执行相同的操作?即:pushebpmovebp,esp总而言之:被调用的类方法看起

c++ - MS Visual Studio 2010如何使用.asm生成文件

我想问一些我想用VisualStudio2010尝试的事情。我通过在项目属性-->C/C++-->输出文件(/FAs)中将选项设置为“汇编程序输出”,从.cpp文件生成一个.asm文件。我的问题是,如果我想在.asm文件中进行一些修改,然后链接再次保留我在汇编级别所做的修改。如果您能提供确切的步骤,包括项目属性中可能需要的正确配置,那将非常有帮助。 最佳答案 这是教程http://www.cs.virginia.edu/~evans/cs216/guides/vsasm.html 关于c

c++ - 无法交换值

在下面的代码中,两种情况下的输出都保持不变,感谢指出我遗漏了什么:-BeforeSwap:-a=10b=512AfterSwap:-a=10b=512代码如下,编译运行没有问题:-#includeintswap(int*x,int*y){if(x!=y){_asm{moveax,[x];xintoeaxmovebx,[y]mov[x],ebx;swappingnowmov[y],eax}}return0;}intmain(){inta=10,b=512;printf("BeforeSwap:-\na=%d\tb=%d\n",a,b);swap(&a,&b);printf("AfterS

c++ - 编写自己的分区恢复

关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭10年前。Improvethisquestion我意识到我要问的问题不是简单的“哦,这很简单!做一个简单的这个那个,然后瞧瞧!”事实是,一晚上不假思索地删错了分区。我尝试了一些Windows和Linux工具(Partitiondiskdoctor、Easeus、Testdisk等),但都没有用。我认为这是因为我删除分区的方式。我之前用C++编写了自己的引导扇区创建器/备份工具,以及用C和汇编程序编写的一两个内核(尽管内核相当无用......

c++ - 通过 ARM NEON 汇编最大优化元素乘法

我正在为双Cortex-A9处理器优化两个一维数组的逐元素乘法。主板上运行的是Linux,我使用的是GCC4.5.2编译器。所以下面是我的C++内联汇编函数。src1、src2和dst是16字节对齐的。更新:可测试代码:voidMultiply(constfloat*__restrict__src1,constfloat*__restrict__src2,float*__restrict__dst,constunsignedintwidth,constunsignedintheight){intloopBound=(width*height)/4;asmvolatile(".loop: