我试图理解这个来自_hypercall0内联汇编代码。 asm volatile (“call hypercall_page+%c[offset]” \ : “=r” (__res) \ : [offset] “i” (__HYPERVISOR_##name * sizeof(hypercall_page[0])) \ : “memory”, “edi”, “esi”, “edx”, “ecx”, “ebx”, “eax”) 我无法找到第一行中%c的含义的信息。 我没有在GCC手册最明显的部分找到任何信息,这解释了%[name] ,但没有找到%c[name] 。 还有其他我应该看的地方吗?
在ARM ABI文档中,我遇到了如下定义的函数: __value_in_regs struct bar foo(int a, int b) { … } 但是GCC( 4.3.3 )不允许它,我能找到的只是对一些RealView编译器的引用。 从GCC有没有办法做到这一点? 我已经尝试过-freg-struct-return但它并没有什么区别。 因为它是一个ABI我无法改变原始程序,并返回一个常规结构破坏堆栈。 如果可以避免,我宁愿不使用组件,因为它没有必要。 谢谢!
我正在测试的示例代码有一些问题,因为我的abs函数没有返回正确的结果。 abs(-2)输出-2(顺便说一句,这是绝对值函数,如果不清楚的话) 在有点绝望之后,我最终得到了以下代码 #include unsigned int abs(int x) { return 1; } int main() { printf(“%d\n”, abs(-2)); return 0; } 这没有任何用处,但它可以显示我的问题。 当输出为1时,输出-2。 如果我将函数名称更改为其他内容(例如abs2),则结果现在是正确的。 此外,如果我将其更改为接收两个参数而不是一个,它也可以解决问题。 我明显的猜测:与标准absfunction发生冲突。 但这仍然无法解释为什么输出为-2(如果使用标准abs函数,它应为2)。 我试着检查两个版本的汇编输出(使用名为abs和abs2的函数) 这是两个组件的diff输出: 23,25c23,25 < .globl abs < .type abs, @function .globl abs2 > .type abs2, @function > abs2: 54c54 .size abs2, .-abs2 71c71,74 movl -4(%rbp), %eax > movl %eax, […]
下面是一个非常简单的例子。 它在Mac OS X(Snow Leopard)上使用gcc编译得很好。 在运行时它输出总线错误:10。这里发生了什么? char* a = “abc”; a[0] = ‘c’;
我有一个简单的程序,我用于物理模拟。 我想知道如何在OpenMP中实现某种线程范例。 int main() { #define steps (100000) for (int t = 0;t < steps; t++) { firstParallelLoop(); secondParallelLoop(); if (!(t%100)) { checkpoint(); } } } void firstParallelLoop() {// In another file.c #pragma omp parallel for for (int i = 0; i < sizeOfSim;i++) { //Some atomic floating point ops. } } 以前,我使用pthreads并在我的双核笔记本电脑上获得1.7加速。 使用OpenMP时,我似乎无法获得任何加速。 我怀疑问题是线程组/池正在快速创建和销毁,带来了灾难性的影响。 […]
发布的代码直接从流行的SDL2教程的示例中复制,以确保不是我犯了一些愚蠢的错误。 我对示例所做的只是更改有问题的图像文件的路径,我将类型bool更改为int,将false更改为0并将true更改为1.据我所知,没有任何特定于C ++的内容。 无论我做什么,一切似乎都有效,但是当用CC / GCC进行编译时(我认为这真的是同样的交易)我最终得到了一个分段错误,我怀疑是close(),我一直无法确定。 用G ++编译可以防止分段错误。 解决方案当然很简单,只需使用G ++,但我非常想知道问题所在。 main.c中: //Using SDL and standard IO #include #include //Screen dimension constants const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; //Starts up SDL and creates window int init(); //Loads media int loadMedia(); //Frees media and shuts down SDL void close(); //The window we’ll be […]
这是我在尝试用gcc编译一个简单的hello world程序时得到的。 c:\>gcc hello.c hello.c:9:2: warning: no newline at end of file C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: cannot open output file a.exe : Permission denied collect2: ld returned 1 exit status 它与Windows 7管理权限有关吗? 如果正在创建输出文件但无法打开,它位于何处? 对不起,如果这是一个noobie问题太多了。 到目前为止,我一直在使用Dev-C ++来编译我的源代码。 我尝试使用谷歌搜索错误,但我发现所有文件已经打开,但在任务管理器中没有提到这样的exe。 编辑:该文件也位于C:\ hello.c 如果我把它放在其他驱动器中,我能做到吗? 当我将文件放在D:\并尝试使用cd d:\将其更改为任何其他驱动器时不会更改驱动器。
我有UNICODE应用程序,我们使用_T(x),其定义如下。 #if defined(_UNICODE) #define _T(x) L ##x #else #define _T(x) x #endif 我知道L被定义为wchar_t,在任何平台上都是4个字节。 如果我错了,请纠正我。 我的要求是我需要L为2个字节。 因此编译器hack我开始使用-fshort-wchar gcc标志。 但是现在我需要将我的应用程序移动到zSeries,在那里我无法看到-fshort-wchar标志在该平台中的效果。 为了让我能够在zSeries上移植我的应用程序,我需要以这样的方式修改_T()宏,即使在使用L ## x并且不使用-fshort-wchar标志之后,我需要获得2byte宽字符data.Can有人告诉我如何更改L的定义,以便我可以在我的应用程序中将L定义为2个字节。
我正在使用Ubuntu Linux 10.0.4上的Android NDK Linux构建编译一个简单的程序。 //no includes!!! int main() { int a = 1, b = 2, c = -1; return a + b + c – ( a + b + c); } 当我为gcc运行这个bash脚本时, bin=’/media/sdb/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin’ rm -r ./obj/*.* $bin/arm-linux-androideabi-gcc -c ./main.c -o ./obj/main.o $bin/arm-linux-androideabi-gcc ./obj/main.o -o ./obj/main.exe gcc的输出给出了来自ld ( arm-linux-androideabi-ld )的消息,它终止为7(第二个以逗号分隔的是ARM)信号。 这个简单的程序甚至不会在Linux上编译,请帮忙!
如何在内联汇编gcc中读取stdin并写入stdout,就像我们在NASM中这样做: _start: mov ecx, buffer ;buffer is a data word initialised 0h in section .data mov edx, 03 mov eax, 03 ;read mov ebx, 00 ;stdin int 0x80 ;Output the number entered mov eax, 04 ;write mov ebx, 01 ;stdout int 0x80 我尝试从内联汇编中的stdin读取,然后将输入分配给x: #include int x; int main() { asm(” movl $5, %%edx \n\t” ” […]