我有一个Linux终端程序集的程序,它应该通过一系列数学操作,将最终值比较为20,然后使用if逻辑,报告或=关系。 代码是: segment .data out_less db “Z is less than 20.”, 10, 0 out_greater db “Z is greater than 20.”, 10, 0 out_equal db “Z is equal to 20.”, 10, 0 segment .bss segment .text global main extern printf main: mov eax, 10 mov ebx, 12 mov ecx, eax add ecx, ebx ;set c (ecx […]
//quick inline asm statements performing the swap_byte for key_scheduling inline void swap_byte(unsigned char *x, unsigned char *y) { unsigned char t; asm(“movl %1, %%eax;” “movl %%eax, %0;” :”=r”(t) :”r”(*x) :”%eax”); asm(“movl %1, %%eax;” “movl %%eax, %0;” :”=r”(*x) :”r”(*y) :”%eax”); asm(“movl %1, %%eax;” “movl %%eax, %0;” :”=r”(*y) :”r”(t) :”%eax”); } 在这里,我试图从x交换char并存储在y ,并且y与x交换相同。 我已经通过将movl更改为mov来编译这些指令,但没有成功。 编译/链接的问题在哪里? 以下是cygwin中编译的输出: $ […]
问题 我正在努力通过网络将原始结构发送到另一端的已知程序,但不得不担心用于对齐结构的静默引入的内存(其他问题,如字节顺序被覆盖)。 我正在使用的是: typedef struct __attribute__((packed)) { uint16_t field1; uint16_t field2; uint16_t field3; } packed_1_s; typedef struct __attribute__((packed)) { uint16_t fieldA; uint16_t fieldB; packed_1_s structArray[10]; } packed_2_s; typedef struct __attribute__((packed)) { uint16_t fieldX; packed_2_s fieldY; uint8_t arrayZ[20]; } data_s; 我理解通常,packed_1_s结构可以/将为结构的每个实例分配额外的空间,以将其填充到编译器的优选大小(取决于它所构建的硬件),并且有利的大小可以是2个字节的任何位置到64个字节(最近)。 通常情况下,如果我在packed_2_s中有一个packed_1_s的实例就没有问题,但是当我尝试将元素放入数组时,我会理解它们存在一些差异。 试图解决方案 gcc文档似乎建议通过简单地在packed_2_s定义中包含packed属性,即使它们是数组,这些字段也将尽可能紧密地包装,并且不会为packed_2_s结构添加空间以对齐元素数组。 关于align()属性的文档虽然表明数组的处理方式与其他字段不同,但需要在字段上直接设置align / packed属性,以便修改添加的额外间距以匹配指定的对齐(或缺少对齐)。 我尝试在structArray字段上设置packed属性,当它不起作用时,通过在上面的代码中设置arrayZ上的packed属性进行测试: packed_1_s structArray[10] __attribute__((packed)); uint8_t arrayZ[20] __attribute__((packed)); 两次尝试都给了我一个编译器警告,在这个上下文中没有理解packed属性并且会被跳过(我用“-Wall”构建的好东西)。 我希望绕过这个问题的方法是使用属性align(1),指示1字节的所需对齐,这与packed属性相当,但是文档说align()属性只能增加对齐和打包应该用于减少对齐。 […]
题 我正在测试一个计算Mandelbrot分形的简单代码。 我一直在检查它的性能,具体取决于函数中的迭代次数,它检查一个点是否属于Mandelbrot集。 令人惊讶的是,在添加-fPIC标志后,我的时间差异很大。 从我读到的开销通常可以忽略不计,我遇到的最高开销约为6%。 我大约30%。 任何建议将被认真考虑! 我的项目详情 我使用-O3标志,gcc 4.7.2,Ubuntu 12.04.2,x86_64。 结果如下 #iter C(fPIC)CC / C(fPIC) 1 0.01 0.01 1.00 100 0.04 0.03 0.75 200 0.06 0.04 0.67 500 0.15 0.1 0.67 1000 0.28 0.19 0.68 2000 0.56 0.37 0.66 4000 1.11 0.72 0.65 8000 2.21 1.47 0.67 16000 4.42 2.88 0.65 32000 8.8 5.77 […]
我需要使用gcc生成一个简单的“Hello World”ELF32可执行文件。 我似乎没有gcc-elf命令。 是否可以在不再构建gcc的情况下创建ELF二进制文件而不是a.out? (我假设它应该可以有一些选项,但我不确定如何继续)
对于一些长的错误,gcc输出是密集的并且有很多换行等。特别是当错误很微妙时,我可能需要10-30秒的眯眼用眼睛来解析它。 我已经开始在一个开放的代码编辑器窗口中粘贴它,以获得一些基本的语法突出显示并启用regex的重新格式化。 有没有人发明过更自动化的方法?
我有以下代码: int main(void) { struct { int x; } a, b; struct { int x; } c; struct { int x; } *p; b = a; /* OK */ c = a; /* Doesn’t work */ p = &a; /* Doesn’t work */ return 0; } 无法在GCC(3.4.6)下编译,并出现以下错误: test.c:8: error: incompatible types in assignment test.c:9: warning: […]
代码是: Push(size, (POINTER)(GetCar(i) == term_Null()? 0 : 1)); 这是C code push返回ABC的 typedef POINTER *ABC typedef void * POINTER ABC size; Push(ABC,POINTER); XYZ GetCar(int); typedef struct xyz *XYZ; XYZ term_Null(); long int i; 特别警告的原因是什么?
以下代码适用于GCC的C编译器,但不适用于C ++编译器。 是否有“快捷方式”在C ++中实现相同的结果? int array[10] = { [1] = 1, [2] = 2, [9] = 9 }; 编辑:嗯,我发现了这一点,澄清了一切。 http://eli.thegreenplace.net/2011/02/15/array-initialization-with-enum-indices-in-c-but-not-c/
假设我通过创建共享对象并使用LD_PRELOAD首先加载它来替换函数。 是否可以使该函数的参数与原始库中的参数不同? 例如,如果我替换pthread_mutex_lock ,那么代替参数pthread_mutex_t需要pthread_my_mutex_t 。 可能吗? 其次,除了函数之外,是否可以使用LD_PRELOAD更改结构声明? 例如,可以向结构添加一个字段。