小编Yur*_*que的帖子

如何使gcc编译器不优化诸如printf之类的标准库函数调用?

出于好奇,我想知道gcc是否可以通过某种方式不优化任何函数调用?

在生成的汇编代码中,printf函数由putchar代替。即使使用默认的-O0最小优化标志,也会发生这种情况。

#include <stdio.h>

int main(void) {
    printf("a");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Godbolt显示GCC9正在执行此操作,clang8使其保持不变。)

c x86 assembly gcc compiler-optimization

5
推荐指数
1
解决办法
217
查看次数

可以修改C中的字符串文字吗?

最近我有一个问题,我知道一个指向常量数组的指针(在下面的代码中初始化)位于该.rodata区域中,并且该区域仅可读。但是,我在模式C11中看到,此内存地址行为的写入将是不确定的。我知道Borland的Turbo-C编译器可以在指针指向的地方写,这是因为处理器在当时的某些系统上以实模式运行,例如MS-DOS?还是与处理器的操作模式无关?使用保护模式下的处理器,是否还有其他编译器可以写入指针并且不会导致任何内存破坏失败?

#include <stdio.h>

int main(void) {
    char *st = "aaa";
    *st = 'b'; 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在此代码与MS-DOS中的Turbo-C一起编译时,您将能够写入内存

c gcc x86-16

4
推荐指数
2
解决办法
208
查看次数

在x86_64模式下,寄存器中无法容纳64位数字

我在这里的PC上有一个Intel处理器,它以64位模式x86_64运行,如果我使用字寄存器或使用某些标志优化功能,则寄存器的大小为64位,该变量往往放在寄存器中,但是,如果我将值放在32位以上,则编译器会抱怨,即我的int不是64位,为什么会发生这种情况?如果将变量放在寄存器中,那不是64位,我什至没有得到它的内存地址?也就是说,它甚至没有放置在堆栈上。

#include <stdio.h>

int main(void) {

    register int x = 4294967296;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译:

gcc example.c -o example -Wall -Wextra

输出:

警告:隐式常量转换[-Woverflow]寄存器int x = 4294967296中溢出;

c c++ assembly gcc cpu-registers

2
推荐指数
1
解决办法
175
查看次数

Error installing gcc 3.0.1 for x86-64 architecture

I'm trying to compile the gcc 3.0.1 files. When I use configure, it gives an error with the following message

Configuration x86_64-unknown-linux-gnu not supported

gcc x86-64

0
推荐指数
1
解决办法
65
查看次数

使用针对x86架构的gcc编译器的双栈对齐问题

关于数据类型对齐的怀疑,我现在正在学习对齐,还有一些问题,所以我知道在用gcc编译i386体系结构时,linux中double对齐为4个字节,因此double的地址与a对齐4的倍数,但只有在使用数据结构时,才会在使用堆栈时发生

#include <stdio.h>

int main(void) {

    double x = 5; //     8 
    char s = 'a'; //    +1
    double y = 2; //   ---- = 9 + 8 = 17 + alignment = 20 

    //int x = 5; //     4
    //char s = 'a';    +1
    //int y = 2;     --------= 5 + 4 = 9 + alignment = 12 

    size_t a, b;
    a = (size_t)&s;
    b = (size_t)&y;

    printf("%zu", a - b); // it wasn't supposed to be 11 instead …
Run Code Online (Sandbox Code Playgroud)

c x86 gcc abi

0
推荐指数
1
解决办法
62
查看次数

标签 统计

gcc ×5

c ×4

assembly ×2

x86 ×2

abi ×1

c++ ×1

compiler-optimization ×1

cpu-registers ×1

x86-16 ×1

x86-64 ×1