这是一个奇怪的要求,但我觉得它有可能.我想要的是将一些编译指示或指令插入到我的代码区域(用C编写),以便GCC的寄存器分配器不会使用它们.
我知道我可以做这样的事情,这可能会为这个变量留下这个寄存器
register int var1 asm ("EBX") = 1984;
register int var2 asm ("r9") = 101;
Run Code Online (Sandbox Code Playgroud)
问题是我直接插入新指令(用于硬件模拟器),而GCC和GAS还没有识别出这些指令.我的新指令可以使用现有的通用寄存器,我想确保我保留了一些(即r12-> r15).
现在,我在一个模拟环境中工作,我想快速做我的实验.将来我会添加GAS并将内在函数添加到GCC中,但是现在我正在寻找快速修复.
谢谢!
我目前正在将C++应用程序移植到略受限制的环境中.该应用程序使用STL,字符串和流类.我正在重写这些在我的环境中可以很好地运行的简化版本.
我关心的是,即使没有所有必要的操作员定义,我的应用程序也在编译.例如,对于我定义的字符串类:
string operator+ (const string& lhs, const string& rhs);
Run Code Online (Sandbox Code Playgroud)
这就足够了.但是,我注意到通常情况下有mystring +"一些常量字符串",这在我的代码中没有定义.当我明确添加它时,它被使用:
string operator+ (const string& lhs, const char* rhs);
Run Code Online (Sandbox Code Playgroud)
那之前发生了什么?它在我添加第二个函数之前成功编译.当然,编译器无法推断如何将c样式字符串连接到我的字符串类.
我现在在我的程序中遇到了奇怪的行为,我想知道是否由于其他运算符未定义.如果程序需要,有没有办法强制编译器要求这样的运算符定义?
PS我的字符串类位于一个唯一的命名空间中,与std ::无关
我试图确定MATLAB或R是否具有类似于以下的功能.
说我有一个输入向量v.
v = [1, 3, 1, 2, 4, 2, 1, 3]
Run Code Online (Sandbox Code Playgroud)
我想生成一个w 等长的矢量v.每个元素w[i]应该告诉我以下内容:对于相应的值v[i],到目前为止遇到此值的次数v,即在v最多但不包括位置的所有元素中i.在这个例子中
w = [0, 0, 1, 0, 0, 1, 2, 1]
Run Code Online (Sandbox Code Playgroud)
我真的想看看是否有任何统计或特定于域的语言都有这样的函数/指令以及它可能被称为什么.
我试图测量内核模块上两个时间点之间的时钟计数器的差异.我使用以下命名函数get_ccnt()来获取某个时间的时钟计数器值:
static __inline__ long long int get_ccnt(void)
{
#if defined(__i386__)
long long int x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x;
#elif defined(__x86_64__)
unsigned int hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (long long int)lo)|( ((long long int)hi)<<32 );
#endif
}
Run Code Online (Sandbox Code Playgroud)
我关注的是,我使用的是HP EliteBook 2530p,其中Intel Core 2 Duo SL9400(规格参考)
我听说CPU之后的Nehalem所有内核都有一致的时钟计数器.(如果我错了,请指出.)但是,英特尔酷睿2双核SL 9400有一个代号Penryn.
因此,我认为如果内核模块在两个时间点之间从一个核心移动到另一个核心,那么两个核心之间的一致性就会受到影响,我无法获得正确的时钟差异.
我在想什么?如果是,有没有办法解决它(例如修复内核模块不将核心移动到核心?)
我正在为项目使用硬件模拟器.它最后以非常结构化但丑陋的方式输出统计数据.阅读起来很烦人,所以我想编写一个GUI来帮助我更好地展示它.是否有人知道我可以使用什么框架和小部件来快速,轻松地构建干净的东西?我希望能够导航树的子节点并隐藏(折叠)我不感兴趣的节点.
统计信息输出采用这样的形式
root {
foo = "bar";
foo_num = 1;
machine {
core0 {
fetch {
renamed {
none = 13559;
flags = 3013;
reg_and_flags = 10735;
reg = 8430;
}
width[5] = {
Minimum: 381
Maximum: 17450
Average: 1.248
Total Sum: 28627
Weighted Sum: 35737
Threshold: 3
[ 61.0% ] [ 61.0% ] 0 0 17450 ******************************
[ 1.3% ] [ 62.3% ] 1 1 381
[ 12.1% ] [ 74.4% ] 2 2 3476 ******
[ 3.1% ] …Run Code Online (Sandbox Code Playgroud) 我在GCC有一个场景给我带来了问题.我得到的行为不是我期望的行为.总结一下这种情况,我提出了一些x86-64的新指令,它们是在硬件模拟器中实现的.为了测试这些指令,我正在使用现有的C源代码并使用十六进制对新指令进行手动编码.因为这些指令与现有的x86-64寄存器交互,所以我使用input/output/clobber列表来声明GCC的依赖关系.
发生的事情是,如果我调用一个函数,例如printf,则不会保存和恢复相关寄存器.
例如
register unsigned long r9 asm ("r9") = 101;
printf("foo %s\n", "bar");
asm volatile (".byte 0x00, 0x00, 0x00, 0x00" : /* no output */ : "q" (r9) );
Run Code Online (Sandbox Code Playgroud)
101被分配给r9,内联汇编(本例中为假)依赖于r9.这在没有printf的情况下正确运行,但是当它存在时,GCC不会保存和恢复r9,并且在调用自定义指令时会有另一个值.
我想也许GCC可能秘密地将赋值更改为变量 r9,但是当我这样做时
asm volatile (".byte %0" : /* no output */ : "q" (r9) );
Run Code Online (Sandbox Code Playgroud)
看看汇编输出,确实使用的是%r9.
我正在使用gcc 4.4.5.您认为可能会发生什么?我认为GCC将始终在函数调用中保存和恢复寄存器.有什么方法可以强制执行吗?
谢谢!
编辑:顺便说一句,我正在编译这样的程序
gcc -static -m64 -mmmx -msse -msse2 -O0 test.c -o test
Run Code Online (Sandbox Code Playgroud) 我正在编写自己的C++ STL映射容器实现.现在我正在尝试实现迭代器.它应该允许你做类似iter-> first和iter-> second之类的事情,分别返回键/值,而iter是一个对象而不是一个指针.我想知道我应该如何重载这个?这有点令人困惑,因为我不确定返回类型应该是什么; 我认为它必须是成员第一/第二的对象.是否通常返回对包装器/接口对象的引用或类似的东西?