如何在编译器不知道的情况下更改变量的值?

青儿

我想通过这个方法来验证 volatile 的作用。但是我的内联汇编代码似乎无法在编译器不知道的情况下修改 i 的值。根据我看的文章,我只需要写汇编代码就好 __asm { mov dword ptr [ebp-4], 20h }了,我想我写的和他写的一样。

实际输出:

before = 10
after = 123

预期输出:

before = 10
after = 10

文章链接:https ://www.runoob.com/w3cnote/c-volatile-keyword.html

#include <stdio.h>

int main() {
    int a, b;
    // volatile int i = 10;
    int i = 10;

    a = i;
    printf("before = %d\n", a);

    // Change the value of i in memory without letting the compiler know.
    // I can't run the following statement here, so I wrote one myself
    // mov dword ptr [ebp-4], 20h
    asm("movl $123, -12(%rbp)");

    b = i;
    printf("after = %d\n", b);
}
马丁·罗森瑙

我想验证volatile...的角色

你不能。

如果变量不是volatile,编译器可能会优化;不需要这样做。

编译器可能总是将任何变量视为volatile.

如何在编译器不知道的情况下更改变量的值?

创建第二个写入变量的线程。

例子

以下示例适用于 Linux(在 Windows 下,您需要与 不同的函数pthread_create()):

#include <stdio.h>
#include <pthread.h>

int testVar;
volatile int waitVar;

void * otherThread(void * dummy)
{
    while(waitVar != 2) { /* Wait */ }
    testVar = 123;
    waitVar = 3;
    return NULL;
}

int main()
{
    pthread_t pt;
    waitVar = 1;
    pthread_create(&pt, 0, otherThread, NULL);
    testVar = 10;
    waitVar = 2;
    while(waitVar != 3) { /* Wait */ }
    printf("%d\n", testVar - 10);
    return 0;
}

如果您使用 进行编译gcc -O0 -o x x.c -lpthread,编译器不会优化并且像所有变量一样工作volatileprintf()打印 113。

如果您使用-O3而不是编译-O0,则printf()打印 0。

如果您替换int testVarvolatile int testVar,则printf()始终打印 113(独立于-O0/ -O3)。

(使用 GCC 9.4.0 编译器测试。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

编译器如何在不知道编译时大小的情况下分配内存?

在编译时不知道密钥的情况下解码JSON值

在不知道函数代码中其性质的情况下分配数组或整数(但编译器知道)

如何在编译时不知道其子类型的情况下将存储为对象的DbSet <T>拆包?

如何在不知道索引值名称的情况下打印数组的值

如何在不知道变量名称的情况下读取查询字符串?

如何在不知道具体类型的情况下引用变量?

我如何在不知道图像ID的情况下更改其属性?

如何在不知道键/值类型的情况下测试接口{}是否为映射?

如何在不知道键的类型和值的类型的情况下遍历KeyValuePair的枚举

如何在不知道键的情况下提取对象每个值的返回类型

如何在不知道JSON值的情况下动态解析某些JSON?

如何在编译器选项设置为strict的情况下读取元素?

如何在golang编译时不知道protobuf3消息类型的情况下解析它?

我可以在编译时不知道websharper模板名称的情况下填充它吗

在编译和处理ObjectDisposedException时不知道其System.Type的情况下打开新Form

如何在不知道 Spark 中任何特定值的情况下根据 GroupBy 列的值选择列

如何在不知道当前值的情况下向php中的MySQL SET类型添加可能的值

如何在不知道C语言中[变量参数]类型的情况下访问特定参数?

如何在不知道已保存数据的变量名的情况下使用Octave中的加载功能?

如何在不知道小部件的字体系列/大小的情况下更改小部件的字体样式?

如何在不知道或更改密码的情况下以其他用户身份登录 Windows (Vista)?

如何在不知道挂载点的情况下知道设备UUID已挂载?

在不知道值的情况下检查python中几个变量的不等式

如何在不知道最初输入多少值的情况下将整数存储到数组中

Python Beautifulsoup:如何在不知道相应属性名称的情况下通过属性值查找标签?

如何在不知道泛型的情况下获取泛型类(单例)中静态字段的值

如何在不知道哪个较大的情况下找到两个值之间的差异?

如何在不知道键的情况下访问哈希表的第一个值?