草庐IT

Assembly

全部标签

c++ - 使用 AVX2 在程序集 x86_64 中添加两个 vector 加上技术说明

我在这里做错了什么?我得到4个零而不是:2468我也很想修改我的.asm函数,以便运行更长的vector,因为在这里我只是使用了一个带有四个元素的vector,这样我就可以在没有SIMD256位寄存器的循环的情况下对这个vector求和。.cpp#include#includeextern"C"double*addVec(double*C,double*A,double*B,size_t&N);intmain(){size_tN=1(finish-start).count().asm.data;C->RCX;A->RDX;B->r8;N->r9.codeaddVecproc;xorrb

c++ - unsigned int 到 unsigned long long 定义明确吗?

我想看看当unsignedlonglong被赋值给unsignedint时幕后发生了什么。我制作了一个简单的C++程序来试用它,并将所有io移出main():#include#includevoidusage(){std::cout\n";exit(0);}voidatoiWarning(intfoo){std::cout生成的程序集为main生成了这个:0000000000400950:400950:55push%rbp400951:4889e5mov%rsp,%rbp400954:4883ec20sub$0x20,%rsp400958:897decmov%edi,-0x14(%rb

c++ - 如何截断 XMM 寄存器中的浮点值

如何只获取float的整数部分?所以,我有一个float组:x[4]={5.0,13.0,25.0,41.0};我把它放在xmm0中,然后用它做sqrt。我还需要一个命令来帮助仅获取此sqrt的一部分。例如5的sqrt将是2.236068,我只需要2.0的答案代码:__asm{movupsxmm0,xsqrtpsxmm0,xmm0//hereneedsomecommandmovupsx,xmm0} 最佳答案 使用roundps是最简单的。舍入模式表在其他地方,但您需要舍入模式3(接近零)。只有当输入保证在某个范围内(大约0到4.6e

c++ - 为什么 128 位变量应该与 16 字节边界对齐

众所周知,X86CPU有64位的数据总线。我的理解是CPU不能访问任意地址。CPU可以访问的地址是其数据总线宽度的整数倍。为了性能,变量应该从(对齐到)这些地址开始,以避免额外的内存访问。对齐到4Byte边界的32位变量将自动对齐到8Byte(64位)边界,这对应于x8664位数据总线。但为什么编译器将128位变量与16字节边界对齐?不是8字节边界?谢谢让我更具体一点。编译器使用变量的长度来对齐它。例如,如果一个变量的长度为256位,Complier会将其对齐到32字节边界。我认为没有任何一种CPU具有那么长的数据总线。此外,普通的DDR内存一次只能传输64位数据,尽管有缓存,内存如何

c++ - 从 C++ 访问汇编语言

这是我的编程作业。我需要使用用8086编程语言编写的方法找出整数数组中最大的一个。这是我的尝试:#include#includeintreturnLargest(inta[]){intmax;asmmovsi,offsetafor(inti=0;i预期的答案是12个3个4个5个6个6.但我得到的是:到这里我坐下来想...数组的索引i处的值不就是实际存储在内存中的吗?因为至少我们被告知,如果a[i]是12(比方说),那么第i个内存位置中写有数字12。或者如果值没有存储在内存位置,我该如何写入内存位置以完成所需的任务?我还请大家链接一些网络/平装本上的Material,以便复习这些概念。编

c++ - 两条相似线路的 CPU 时间差异

我的程序中有一个while循环,其中IterZNext、IterZ是指向列表中节点的指针。列表中的节点是具有名为“索引”的字段的结构类型。doublexx=20.0;doubleyy=10000.0;doublezz;while(IterZNext!=NULL&&NextIndexNext;if(IterZNext!=NULL){zz=xx+yy;NextIndex1=IterZNext->Index;//line(*)NextIndex=IterZNext->Index;//line(**)IterZNext->Index;}}当我分析我的程序时,我发现了行(*)NextIndex1

c++ - 地址减法值总是12?变量的大小是否很小?

我目前正在研究C、C++和ASM。我可以看到ebp减法值之间始终存在12的差异。我的反汇编代码:代码:intmain(){intabc=10;intdef=20;shortinta=1;longintb=1000;//PlayFloat();GetValue();return0;}已禁用:pushebpmovebp,espsubesp,0F0hpushebxpushesipushedileaedi,[ebp+FFFFFF10h]movecx,3Chmoveax,0CCCCCCCChrepstosdwordptres:[edi];intabc=10;movdwordptr[ebp-8],

c++ - ABI 与 C++ 标准

我试图了解ABI(比如SystemV)和C++标准的区别。所以C++标准只是确定合法的C++,以便编译器可以将其转换为足够的汇编代码。ABI然后规范这个汇编代码如何与x86架构交互?这是两者之间更高层次的比较吗?我问的原因是对低延迟软件感兴趣,我想知道读取ABI会包含多少值(value)? 最佳答案 该标准根据您编写的代码定义程序应该做什么。ABI定义了特定平台的实现方式,以便在不同运行(可能由不同的编译器/版本)编译的代码可以交互。也就是说,当你写:voidf(inti){std::cout标准定义了行为:对该函数的调用将导致参数

c++ - 链接究竟是如何工作的?

我对编译过程的理解:1)预处理:您所有的宏都被替换为它们的实际值,所有注释都被删除,等等。用您包含的文件的文字文本替换您的#include语句。2)编译:这里不会深入探讨,但结果是一个适用于您所处架构的汇编文件。3)汇编:获取汇编文件并将其转换为二进制指令,即机器代码。4)链接:这是我感到困惑的地方。此时你有一个可执行文件。但是如果你真的运行那个可执行文件会发生什么?问题是您可能包含了*.h文件,而这些文件只包含函数原型(prototype)吗?因此,如果您实际上从这些文件中调用其中一个函数,它将没有定义并且您的程序将会崩溃?如果是这样的话,链接到底做了什么呢?它如何找到与您包含的.h

c++ - Web Assembly (wasm) 会有自己的语法吗?

听说W3正在研究网络的字节码,威尔webassembly(wasm)有自己的语法,比如nasm和masm?例如输入类似的东西,global_mainextern_MessageBoxA@16extern_ExitProcess@4sectioncodeuse32class=code_main:pushdword0;UINTuType=MB_OKpushdwordtitle;LPCSTRlpCaptionpushdwordbanner;LPCSTRlpTextpushdword0;HWNDhWnd=NULLcall_MessageBoxA@16pushdword0;UINTuExitCo