gcc(最新版本: __assume() )是否具有类似于icc所支持的__assume()内置的“assume”子句? 例如, __assume( n % 8 == 0 );
我在asm中编写了一个引导加载程序,并希望在我的项目中添加一些已编译的C代码。 我在这里创建了一个测试函数: test.c的 __asm__(“.code16\n”); void print_str() { __asm__ __volatile__(“mov $’A’ , %al\n”); __asm__ __volatile__(“mov $0x0e, %ah\n”); __asm__ __volatile__(“int $0x10\n”); } 这是asm代码(引导加载程序): hw.asm [org 0x7C00] [BITS 16] [extern print_str] ;nasm tip start: mov ax, 0 mov ds, ax mov es, ax mov ss, ax mov sp, 0x7C00 mov si, name call print_string mov al, ‘ ‘ […]
我的代码有很多复杂的#define错误代码,这些代码不容易解码,因为它们嵌套在几个级别。 有没有优雅的方法我可以获得#defines列表及其最终数值(或者他们可能是什么)? 举个例子: #define CREATE_ERROR_CODE(class, sc, code) ((class << 16) & (sc << 8) & code) #define EMI_MAX 16 #define MI_1 EMI_MAX #define MODULE_ERROR_CLASS MI_1 #define MODULE_ERROR_SUBCLASS 1 #define ERROR_FOO CREATE_ERROR_CODE(MODULE_ERROR_CLASS, MODULE_ERROR_SUBCLASS, 1) 我会有大量类似的#defines匹配ERROR _ [\ _ W _] +,我想枚举,以便我总是有一个程序可以输出的错误代码的当前列表。 我需要数值,因为这是所有程序将打印出来的(不,它不是打印出字符串的选项)。 对gcc或任何其他编译器的建议会有所帮助。
我想在我的程序中获取_GLOBAL_OFFSET_TABLE_的地址。 一种方法是在Linux中使用nm命令,可能将输出重定向到文件并解析该文件以获取_GLOBAL_OFFSET_TABLE_的地址。 但是,这种方法似乎效率很低。 有哪些更有效的方法呢?
在阅读http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects时 ,我遇到了这个例子: \#define max(a,b) \ ({ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a > _b ? _a : _b; }) // WHY DOES THIS LINE WORK? 你可以像函数一样使用它,即max(1,2)是一个评估为2的表达式。 我的问题是, ({ statment-list last-expression; })构造如何计算last-expression的值? 具体来说,这个结构的解析树是什么样的? 我认为{ }总是指复合语句,而语句没有值。 我试着在C语法中挖掘,仍然无法解决这个问题。
我对一些内联汇编代码有些麻烦。 我知道应该做些什么,但我想念“怎么样”! 我有这个“几乎”工作的校验和function: static unsigned long cksum_unroll( unsigned short **w, int *mlen) { int len; unsigned short *w0; unsigned long sum=0; len = *mlen; w0 = *w; while( len >= 8) { asm volatile ( “ldmia %[w0]!, {v1, v2}\n\t” “adds %[sum], %[sum], v1\n\t” “adcs %[sum], %[sum], v2\n\t” “adcs %[sum], %[sum], #0” : [sum] “+r” (sum) […]
我有以下代码: #include #include #include long long lzcnt(long long l) { return __lzcnt64(l); } int main(int argc, char** argv) { printf(“%lld\n”, lzcnt(atoll(argv[1]))); return 0; } 使用不同的编译器和选项运行(显示程序集): 铛 $ clang -Wall src/test.c -D__LZCNT__ && ./a.out 2047 53 0000000000400560 : 400560: 55 push %rbp 400561: 48 89 e5 mov %rsp,%rbp 400564: 48 89 7d f0 mov %rdi,-0x10(%rbp) 400568: […]
我已经看到并使用了如下的C ++代码: int myFourcc = ‘ABCD’; 它适用于最近的GCC版本,不知道最近的版本。 这个function是否在标准中? 这叫什么? 我在网上搜索时遇到了麻烦…… 编辑: 我也发现了这些信息,对于未来的观察者: 来自gcc文档 编译器一次为一个字符定义一个多字符字符常量,将前一个值左移每个目标字符的位数,然后在截断到目标宽度的新字符的位模式中输入字符。 最终的位模式为int类型,因此无论单个字符是否有符号都是有符号的(与版本3.1及更早版本的GCC略有不同)。 如果常量中的字符数多于目标int中的字符数,则编译器会发出警告,并忽略多余的前导字符。 例如,具有8位字符的目标的’ab’将被解释为(int) ((unsigned char) ‘a’ * 256 + (unsigned char) ‘b’)’, and ‘\234a’ as ( int)((unsigned char)’\ 234’* 256 +(unsigned char)’a’)’。
免责声明:以下示例只是一个快速了解问题的虚拟示例。 如果您正在考虑现实问题,请考虑任何动态编程。 问题:我们有一个n * m矩阵,我们想要复制上一行中的元素,如下面的代码所示: for (i = 1; i < n; i++) for (j = 0; j < m; j++) x[i][j] = x[i-1][j]; 方法:必须按顺序执行外循环迭代,它们将按顺序执行。 内环可以并行化。 我们希望最小化创建和杀死线程的开销,因此我们只想创建一次线程团队,但是,这似乎是OpenMP中不可能完成的任务。 #pragma omp parallel private(j) { for (i = 1; i < n; i++) { #pragma omp for scheduled(dynamic) for (j = 0; j < m; j++) x[i][j] = […]
我的代码中有一个关键循环,具有以下形状: int myloop(int a, …..){ /* some stuff */ // Critical loop while(…){ /* Some Stuff */ if(a == 1){ // ….. } else if(a == 2){ // ….. } else if(a == 3){ // ….. } else{ // …. } } } 由于循环从不接触“a”的值,所采用的分支将永远不会改变,但由于此循环非常重,因此需要多次测试“a”的值,这是完全没有必要的。 最好的事情可能是复制循环,以便在循环开始之前可以测试“if”,但这意味着复制了两种情况共同的许多东西,并将导致非常难看的代码…… 有没有办法要求GCC / G ++在编译时复制这段代码? 或者其他任何避免测试这么多次的技巧? 谢谢您的帮助 ! Nathann