GCC内联程序集错误:错误:表达式后的垃圾`(%esp)'
我在研究gcc内联汇编。我的环境是Win 7 32bit,mingw-gcc 4.6.1。
我有个关于'm'约束的问题。下面是我的c函数代码:
static int asm_test(int a, int b)
{
int c = 0;
__asm__ __volatile__(".intel_syntax\n"
"mov eax, %1\n" //error
"mov edx, %2\n" //error
"add eax, edx\n"
"mov %0, eax\n" //error
".att_syntax"
:"=m"(c)\
:"m"(a),"m"(b)\
:"eax","edx"
);
return c;
}
static int asm_test(int a, int b)
{
int c = 0;
__asm__ __volatile__(
"movl %1, $eax\n" //error
"movl %2, $edx\n" //error
"addl $edx, $eax\n"
"movl $eax, %0\n" //error
:"=m"(c)\
:"m"(a),"m"(b)\
:"eax","edx"
);
return c;
}
这里的问题是GCC为%0
、%1
和%2
生成AT&T语法构造。如果您查看生成的程序集,它看起来像:
.intel_syntax
mov eax, 8(%ebp)
mov edx, 12(%ebp)
add eax, edx
mov -4(%ebp), eax
这不是有效的Intel语法。
通常,您不需要在内联程序集中包含显式的加载/存储操作--只需指定register约束,编译器就会自行生成加载/存储。这样做的好处是,即使变量(参数、局部变量)根本不在内存中,而是在寄存器中,您的代码仍然是正确的--这与显式地将内存加载/存储放在内存中的情况不同。
int asm_test(int a, int b)
{
__asm__ __volatile__ (
".intel_syntax\n"
"add %0, %1 \n"
".att_syntax \n"
:"+r"(a)
:"r"(b));
return a;
我们正在客户端的正式服堆上工作,以检测和解决内存泄漏。为此,我们定期使用jmap来收集必要的信息。 但上周我们无法进行转储,因为它触发了一个EOF错误并关闭了Tomcat实例。 我在网上搜索了一下,但找不到关于这个错误的任何具体信息。我们检测到,只有在使用Gc-First垃圾收集器算法时才会发生这种情况。 这是我们用来执行jmap的命令行: jmap文件heap.bin 服务器上的Java版本:J
在linux上,我似乎通过使用一些多线程来打破。就我所见,我正在设法在一个不是主GUI线程的线程上触发垃圾收集。这导致在实例,它试图从错误的线程调用堆栈,在linux上造成混乱。 下面的代码是我能想到的最小的例子。请注意,我没有使用做任何真正的工作,但是我不能以其他方式触发问题。上的方法验证正在从另一个线程中删除实例。典型输出为: 通过修改库代码,我可以验证是从与相同的地方调用的。 我的结论正确吗
这里是一个虚拟的*z++=*x++**y++指令。请注意,x、y和z指针寄存器必须指定为输入/输出,因为asm会修改它们。 在第一个示例中,在输入操作数中列出和有什么意义?同一份文件指出: 特别是,如果不将输入操作数指定为输出操作数,就无法指定输入操作数被修改。
问题内容: 这是一个非常奇怪的错误,当从服务器(通过PHP生成)中获取JSON时,在调用时会收到此错误: JSON错误:错误域= NSCocoaErrorDomain代码= 3840“操作无法完成。(可可错误3840。)”(结束时为垃圾。)UserInfo = 0x178467d00 {NSDebugDescription =结束时为垃圾。} 我的(NSData * kivaData)可以完美地抓
我有这个非常简单的打字稿文件: 然后我运行: 打字稿编译器(版本1.8.7,OS X)抱怨: 我如何修复这个错误?谢谢你。
我目前正在尝试创建一个日志解析器,它从一个输入文件(a.log)中获取以下格式的一系列ping报告:(194.12.224.34中的64字节:icmp_seq=1 ttl=47 time=66.7 ms)并构建一个输出文件(a.csv)。 经过多次尝试,我发现了下面的错误。我的同事给了我他的代码(如下),虽然写得不同,但本质上是一样的。他的代码给出了同样的错误,尽管他的代码在同一个任务中正常工作。