ARM架构下这样的代码是什么结果?

leslielg 2018-03-16 03:18:28
unsigned short tmp;

tmp = *(unsigned short *)addr;

addr是一个地址。

这样的代码会发生什么?
如果有问题该如何修正??

只考虑ARM cortex系列架构。
...全文
537 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Acuity. 2018-06-05
  • 打赏
  • 举报
回复
引用 8 楼 leslielg 的回复:
[quote=引用 4 楼 qq_20553613 的回复:] 来个形象的:访问地址0x1234

int *p;
int a;
p = *(int*)0x1234;
*p = 0x23;  //写入
a = *p;       //读出
读出同理。
时间长了我忘了当初为什么要问这个问题了。我后来找到的答案是地址必须事先对齐,不要用非对齐访问。 你的回复带了太多假设条件: 1. 我原题的指针是unsigned short,只有16位 2.你给出的地址是一个4字节对齐的地址,但是在cortex系列芯片上,可以非对齐访问而不出错 3.同样的code,当你的addr要求的2个字节没有跨越字长时,是可以正确读取的,但是如果addr跨字长,读到的数据不对。 有兴趣的可以追一下,时间长了过程记不清了,结论就是先对齐地址再访问。 [/quote] 向大牛学习。
leslielg 2018-06-05
  • 打赏
  • 举报
回复
引用 4 楼 qq_20553613 的回复:
来个形象的:访问地址0x1234

int *p;
int a;
p = *(int*)0x1234;
*p = 0x23;  //写入
a = *p;       //读出
读出同理。
时间长了我忘了当初为什么要问这个问题了。我后来找到的答案是地址必须事先对齐,不要用非对齐访问。 你的回复带了太多假设条件: 1. 我原题的指针是unsigned short,只有16位 2.你给出的地址是一个4字节对齐的地址,但是在cortex系列芯片上,可以非对齐访问而不出错 3.同样的code,当你的addr要求的2个字节没有跨越字长时,是可以正确读取的,但是如果addr跨字长,读到的数据不对。 有兴趣的可以追一下,时间长了过程记不清了,结论就是先对齐地址再访问。
HScholar 2018-03-22
  • 打赏
  • 举报
回复
第二个逗号后面打错了,是:这个指针指向的地址里存着一个地址
HScholar 2018-03-22
  • 打赏
  • 举报
回复
引用 1 楼 leslielg的回复:
看了一圈,没人敢这样写code。那就算了
之所以没有人这么写,是因为这么写太简单了~~。你随便找一个stm32的库函数,里面比这难得比比皆是,当然跟这一样简单的非常少见~~
HScholar 2018-03-22
  • 打赏
  • 举报
回复
addr是一个指向指针的指针,这个指针指向一个指针,这个指针的地址里存着一个地址,你这行代码就是把那个地址赋给变量。这中写法很常见~~这种一般不会错,最多就是数据溢出~~要是发生了溢出那就用long啊~~扩大变量的大小
Acuity. 2018-03-17
  • 打赏
  • 举报
回复
来个形象的:访问地址0x1234

int *p;
int a;
p = *(int*)0x1234;
*p = 0x23;  //写入
a = *p;       //读出
读出同理。
dceacho 2018-03-17
  • 打赏
  • 举报
回复
如果addr==0x04, 则就是把地址0x00000004(32位)里的值赋给tmp 这代码就一强制的类型转换,会不会出问题就看具体情况了
Acuity. 2018-03-17
  • 打赏
  • 举报
回复
访问地址addr的内存。
leslielg 2018-03-16
  • 打赏
  • 举报
回复
看了一圈,没人敢这样写code。那就算了

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧