草庐IT

c++ - ecx 寄存器是否用于传递静态函数调用中的参数之一?

我知道在c++中调用对象的非静态成员函数时,this指针是传入ecx寄存器的。静态函数呢,因为没有this指针,在这种情况下,编译器是否使用ecx寄存器来传递常规参数之一?编辑-我在这里谈论的是cdecl调用约定。 最佳答案 调用函数时ecx(或任何其他寄存器)的用途取决于callingconvention.例如,考虑C++代码structS{staticvoidf(int,int){}voidg(int){}};voidg(){S::f(3,4);Ss;s.g(3);}通过MicrosoftVisualStudio2010(64位

c++ - 为什么我可以获取寄存器变量的地址?

引用自《Thinkinginc++》一书中关于寄存器变量的部分:“寄存器变量的使用有限制。您不能获取或计算寄存器变量的地址。寄存器变量只能在block(你不能有全局或静态寄存器变量)。”所以我写了这段程序来测试:intglobal=2;//error//registerintglobal2=3;intmain(){registerintlocal2=2;cout但是g++没有产生错误,并且local2的地址被打印出来了。那么为什么我可以毫无错误地获取地址呢? 最佳答案 的确,从历史上看,您无法获取register变量的地址。现在这只

c++ - 测试 AVX 寄存器是否包含一些相等的整数

考虑一个包含四个64位整数的256位寄存器。是否有可能在AVX/AVX2中有效地测试其中一些整数是否相等?例如:a){43,17,25,8}:结果必须是false因为4个数字中没有2个是相等的。b){47,17,23,17}:结果必须为“真”,因为编号17在AVXvector寄存器中出现2次。如果可能的话,我想在C++中执行此操作,但如有必要,我可以转到汇编。 最佳答案 对于AVX512(AVX512VL+AVX512CD),您将使用VPCONFLICTQ,专为此目的而设计。对于AVX2:通过减少冗余比较减少了一些操作:inttes

c++ - 什么寄存器指向堆?

我刚学完ARM架构/汇编。如果SP寄存器保存着下一个要放入数据的内存位置的地址,那么什么保存堆的地址呢?例如,在C++中,如果您在堆上声明一个对象(例如MyObjexample=newMyObj();),程序集会是什么样子,从某种意义上说它会在哪里知道example是? 最佳答案 在此上下文中,堆栈是OS/EABI提供的较低级别结构。这就是为什么有一个常规寄存器的原因。但是,堆是操作系统提供的更高级别的结构。因此,管理和使用它取决于与您的应用程序和操作系统的协议(protocol)。在汇编术语中,您将使用该堆并通过寄存器取消引用某些

c++ - 将单个 float 移动到 xmm 寄存器

我想将存储在一个xmm寄存器中的数据与一个浮点值相乘,并将结果保存在一个xmm寄存器中。我制作了一张小图来更好地解释它。如您所见,我有一个xmm0寄存器,其中包含我的数据。例如它包含:xmm0=|4.0|2.5|3.5|2.0|每个float存储在4个字节中。我的xmm0寄存器是128位,16字节长。效果还不错。现在我想将0.5存储在另一个xmm寄存器中,例如xmm1,并将该寄存器与xmm0寄存器相乘,使xmm0中存储的每个值都乘以0.5。我完全不知道如何在XMM寄存器中存储0.5。有什么建议吗?顺便说一句:它是C++中的内联汇编程序。voidfilter(image*src_imag

FPGA的可编程逻辑单元(LUT和寄存器)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言1.根据PLD器件单片集成度的高低,可将PLD分为低密度可编程逻辑器件和高密度可编程逻辑器件。2.按器件结构类型划分        目前常用的可编程逻辑器件都是从“与-或阵列”和“门阵列”两类基本结构发展起来的,所以可编程逻辑器件从结构上可分为两大类:        (1)乘积项结构器件。其基本结构为“与-或阵列”的器件。简单PLD、EPLD和CPLD都属于此类器件。    (2)查找表结构器件。其基本结构类类似于“门阵列”的器件,它由简单的查找表组成可

FANUC机器人的位置寄存器及运算指令详解

FANUC机器人的位置寄存器及运算指令详解在FANUC机器人的嵌入式编程中,位置寄存器和运算指令起着至关重要的作用。位置寄存器用于存储机器人的位置和姿态信息,而运算指令则允许对这些位置寄存器进行数学和逻辑运算,从而实现复杂的机器人运动控制和路径规划。本文将详细介绍FANUC机器人中的位置寄存器和运算指令,并提供相应的源代码示例。位置寄存器是FANUC机器人控制器中的一组特殊寄存器,用于存储机器人在三维空间中的位置和姿态信息。每个位置寄存器都对应着一个特定的位置,通常用字母P加上一个数字来表示,例如P1、P2等。机器人的位置可以由用户自定义,也可以通过编程的方式计算得出。位置寄存器的值由三个主要

c++ - 是否可以在 C++17 的 GCC 中使用显式寄存器变量?

我正在使用explicitregistervariables使用没有machine-specificconstraints的寄存器将参数传递给原始Linux系统调用(例如x86_64上的r8、r9、r10)按照建议here.#include#ifdef__i386__#define_syscallOper"int$0x80"#define_syscallNumReg"eax"#define_syscallRetReg"eax"#define_syscallReg1"ebx"#define_syscallReg2"ecx"#define_syscallReg3"edx"#define_s

c++ - 为了在 C++ 中调试,如何声明一个不被优化(放入寄存器)的变量?

我正在用C++/Qt开发一个简单的应用程序,我有以下声明:QGridLayout*layout=newQGridLayout;我正在使用gdb调试应用程序。我设置了一个断点,它工作正常,并且调试器命中了该行。但是如果我尝试检查上面声明的对象,我会得到这个输出:-data-evaluate-expression--thread1--frame0layout^done,value="optimizedout>"我读到这条消息,"optimizedout>",发生是因为编译器优化了代码,并将数据放入了寄存器。我正在使用带有标志-O0的g++编译器(无优化)集。有没有我遗漏的东西,或者是否存在

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