Tag: 标志

我如何摆脱__x86.get_pc_thunk.ax的召唤

我试图编译并将一个非常简单的C程序转换为汇编语言。 我使用的是Ubuntu,操作系统类型是64位。 这是C程序。 void add(); int main() { add(); return 0; } 如果我使用gcc -S -m32 -fno-asynchronous-unwind-tables -o simple.S simple.c这就是我的汇编源代码文件应该是这样的: .file “main1.c” .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp andl $-16, %esp call add movl $0, %eax movl %ebp, %esp popl %ebp ret .size main, .-main .ident “GCC: (Debian 4.4.5-8) 4.4.5” […]

没有进位标志的大整数加法

在汇编语言中,通常有一条指令可以添加两个操作数和一个进位。 如果要实现大整数加法,只需添加最小的整数而不带进位,将下一个整数与进位相加。 如何在C或C ++中有效地执行此操作,而我无法访问进位标志? 它应该适用于几个编译器和体系结构,所以我不能简单地使用内联汇编等。

从C程序读取标志寄存器

为了好奇,我试图读取标志寄存器并以一种很好的方式将其打印出来。 我已经尝试使用gcc的asm关键字阅读它,但我无法让它工作。 任何提示怎么做? 我正在运行Intel Core 2 Duo和Mac OS X.以下代码就是我所拥有的。 我希望能告诉我是否发生溢出: #include int main (void){ int a=10, b=0, bold=0; printf(“%d\n”,b); while(1){ a++; __asm__ (“pushf\n\t” “movl 4(%%esp), %%eax\n\t” “movl %%eax , %0\n\t” :”=r”(b) : :”%eax” ); if(b!=bold){ printf(“register changed \n %d\t to\t %d”,bold , b); } bold = b; } } 这给出了分段错误。 当我运行gdb时,我得到了这个: Program received signal EXC_BAD_ACCESS, […]

C bitflag枚举应该如何转换为C ++?

C ++主要是C的超集,但并非总是如此。 特别是,虽然C和C ++中的枚举值都隐式转换为int,但反之则不然:只有在C中,int会转换回枚举值。 因此,通过枚举声明定义的bitflags无法正常工作。 因此,这在C中是可以的,但在C ++中则不行: typedef enum Foo { Foo_First = 1<<0, Foo_Second = 1<<1, } Foo; int main(void) { Foo x = Foo_First | Foo_Second; // error in C++ return 0; } 如何有效和正确地处理这个问题,理想情况下不会损害使用Foo作为变量类型的调试器友好性质(它会分解成手表中的组件位标志等)? 还要考虑可能有数百个这样的标志枚举,以及数千个使用点。 理想情况下,某种有效的运算符重载可以解决问题,但它确实应该是高效的; 我想到的应用程序是受计算限制的,并且具有快速的声誉。 澄清:我正在将一个大型(> 300K)的C程序翻译成C ++,所以我在运行时和开发人员时间都在寻找有效的翻译。 只需在所有适当的位置插入演员阵容可能需要数周时间。

CMake交叉编译:忽略工具链文件中的C标志

我使用cmake进行交叉编译。 在我的工具链文件中有一行 SET(CMAKE_C_FLAGS “-std=gnu99”) 此变量未再次在CMakeLists.txt中设置。 当我运行cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..这个标志被忽略。 更详细: flags.cmake行显示一个空的C_FLAGS =行。 但是在CMakeOutput.log我可以找到一行Build flags: -std=gnu99 。 我发现第二次运行cmake .. (同样有或没有指定工具链文件)修复了这个问题。 但为什么我第一次运行cmake时没有设置? 编辑:添加了MNWE 的CMakeLists.txt: cmake_minimum_required(VERSION 2.6) project(myproject) SET(files src/main.c) add_executable(myexec ${files}) avr.cmake: SET(CMAKE_SYSTEM_NAME Generic) SET(CMAKE_C_COMPILER avr-gcc) SET(CMAKE_C_FLAGS “-std=gnu99”)