考虑这个function: void foo(){ //do something } 在assembly中,它看起来像这样(不准确): push something ;do stuff pop something ret 但我不想要这个生成的代码( RET , PUSH , POP ……)。 我只想要一个代码块的标签,所以我必须回复自己: void bar(){ //do something asm(“iret”) //i want to use this function as a ISR } 在汇编中,它看起来像这样: ; do something iret 没有PUSH , POP或RET 。 是否有任何预处理器指令或关键字可以让我实现这一目标? 我在Windows下使用GCC和NASM ,我正在尝试生成自己的中断服务例程(ISR)。
我试图在我的断言/exception处理程序中获取调用堆栈回溯。 不能include “execinfo.h”因此不能使用int backtrace(void **buffer, int size); 。 此外,尝试使用__builtin_return_address()但根据: http : //codingrelic.geekhold.com/2009/05/pre-mortem-backtracing.html …在一些架构上,包括我心爱的MIPS,只有__builtin_return_address(0)可以正常工作.MIPS没有帧指针,这使得很难向后走回堆栈。 帧0可以直接使用返回地址寄存器。 如何重现完整的调用堆栈回溯?
我希望我的所有C程序默认使用选项-Wall -pedantic -ansi进行编译。 有没有办法让Eclipse在所有项目中默认将这些标志添加到编译器命令中?
我正在使用GNU C Vector Extensions ,而不是Intel的_mm_*内在函数。 我想做与英特尔的_m256_loadu_pd内在相同的事情。 逐个分配值很慢:gcc生成的代码有4个加载指令,而不是一个单独的vmovupd ( _m256_loadu_pd确实生成)。 typedef double vector __attribute__((vector_size(4 * sizeof(double)))); int main(int argc, char **argv) { double a[4] = {1.0, 2.0, 3.0, 4.0}; vector v; /* I currently do this */ v[0] = a[0]; v[1] = a[1]; v[2] = a[2]; v[3] = a[3]; } 我想要这样的东西: v = (vector)(a); 要么 v […]
#include int main() { unsigned char c; c = 300; printf(“%d”,c); return 0; } 输出是否可以预测或未定义?
我有这样的代码: $ cat test.c #include typedef struct { const int x; } SX; static SX mksx(void) { return (SX) { .x = 10 }; } void fn(void) { SX sx; while((sx = mksx()).x != 20) { printf(“stupid code!”); } } 关于其正确性的2条意见: $ for i in gcc clang; do echo “$i SAYS:”; $i -c -std=c99 -pedantic […]
编译C程序的主要步骤是什么? 通过编译,我的意思是(可能是错误的)使用gcc从包含C代码的纯文本中获取二进制文件。 我很想了解这个过程的一些关键点: 到那天结束时,我需要将我的C代码转换为我的CPU应该理解的语言。 那么,谁在乎了解我的CPU特定指令呢? 操作系统? gcc是否将任何C转换为汇编语言? 我知道(实际猜测)对于每种处理器类型,我将需要一个汇编程序来解释(?)汇编代码并转换为我的CPU特定指令。 这个汇编程序(谁发货)在哪里? 它是否附带操作系统? 如果我用文本编辑器打开二进制文件,为什么我看不到0和1?
所以我正在编写一个使用pthread来管理所有IO的点对点聊天客户端,当我编译文件时,gcc给了我错误 client.c: In function ‘accepted_daemon’: client.c:115:1: error: expected ‘while’ before ‘void’ void * ^ client.c: In function ‘listen_daemon’: client.c:176:1: error: expected ‘while’ before ‘int’ int main(int argc, char *argv[]) ^ 我的程序的源代码是 #include #include #include #include #include #include #include #include #include #define error(s, e, …) error_at_line (s, e, __FILE__, __LINE__, __VA_ARGS__) #include #include #include #include #define […]
我写了一个简单的内核,试图将两个字符写入帧缓冲区。 如果我在内核中定义一个字符串文字,我在启动时会得到以下输出: Booting ‘os’ kernel /boot/kernel.elf Error 13: Invalid or unsupported executable format Press any key to continue… 否则,如果我定义了两个字符,我得到以下内容(注意输出开头的’ab’): abBooting ‘os’ kernel /boot/kernel.elf [Multiboot-elf, , , shtab=0x102168, entry=0x1001f0] 装载机 我在汇编中编写了加载程序: global loader ; the entry symbol for ELF MAGIC_NUMBER equ 0x1BADB002 ; define the magic number constant FLAGS equ 0x0 ; multiboot flags CHECKSUM equ […]
这是结构声明代码。 struct list_el { int val; struct list_el * next; }; typedef struct list_el item; 当我编写这样的函数时,编译器会给出错误。 它说cur undeclared before first use 。 bool delete(item* item) { assert(item != NULL); item* cur = NULL; cur = head; item* prev = NULL; while (cur) { if (cur == item) { if (prev == NULL) { head = […]