gpt4 book ai didi

c - 编译器如何在中等内存模型中解析地址?

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:04 25 4
gpt4 key购买 nike

我是小/中型内存模型 CPU 编程的新手。我正在使用一个嵌入式处理器,它有 256KB 的闪存代码空间包含在地址 0x00000 到 0x3FFFF 中,20KB 的 RAM 包含在地址 0xF0000 到 0xFFFFF 中。有编译器选项可供选择小型、中型或大型内存模型。我选择了中号。我的问题是,编译器如何区分代码/闪存地址和 RAM 地址?

例如,我在 RAM 地址 10 处有一个 1 字节变量,在实际地址 10 处有一个 const 变量。我做了类似的事情:

value = *((unsigned char *)10);

编译器将如何在实际地址 10 或(虚拟?)地址 10 之间进行选择。我想如果我想在实际地址 10 处指定值,我会使用:

value = *((const unsigned char *)10);

?

此外,您能否解释一下我认为与答案相关的以下代码:

uint32_t var32;     // 32 bit unsigned integer.
unsigned char *ptr; // 2 byte pointer.

ptr = (unsigned char *)5;
var32 = (uint32_t)ptr;
printf("%lu", var32)

代码打印 983045(0xf0005 十六进制)。看起来不现实,一个16位的变量怎么返回一个大于16位所能存储的值呢?

最佳答案

阅读您的编译器文档以了解有关每种内存模型的详细信息。

它可能有各种指针,例如char near * 为 2 字节,char far * 为 4 字节。或者(或同时),它可能包含更改代码页的说明,您必须手动调用这些代码页。

how can a 16 bit variable return a value greater than what 16 bits can store?

不能。您的代码将指针转换为 32 位 int。 , 和 0xF0005 可以放入 32 位 int。根据你的描述,我猜 char * 只是指向数据区,你会使用不同类型的指针指向代码区。

关于c - 编译器如何在中等内存模型中解析地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25675509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com