请教一个关于从奇数地址取值出现的问题

2020-01-23 14:40发布

本帖最后由 justdomyself 于 2014-5-26 19:52 编辑

#define                        MEM_W(x)                        ((WORD) *((WORD  *)(x)) )

typedef struct
{
  WORD ID;                  // Message Identifier
  BYTE LEN;                 // Data length (0-8)
  BYTE RTR;
  BYTE BUF[8];              // Data buffer
} CAN_MSG;


CAN_MSG msg,*pmsg;
msg.BUF[0]=0X20;
msg.BUF[1]=0X05;
msg.BUF[2]=0X60;
msg.BUF[3]=0X00;

pmsg=&msg;


WORD   tmp=MEM_W(&pmsg->BUF[1]);

为何tmp的值是5 而不是0x6005

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
justdomyself
1楼-- · 2020-01-24 09:46
laujc 发表于 2014-5-26 16:58
WORD   tmp=MEM_W(&pmsg->BUF[1]); 这个是先取&pmsg了,呵呵,学习了。

WORD   tmp=MEM_W(&(pmsg->BUF[1]));效果也一样啊
qlb1234
2楼-- · 2020-01-24 13:50
甚麼?tmp的值不是0x6005?你怎麼看的?
justdomyself
3楼-- · 2020-01-24 17:22
qlb1234 发表于 2014-5-26 17:16
甚麼?tmp的值不是0x6005?你怎麼看的?

设断点   观察变量的值
xf331785508
4楼-- · 2020-01-24 19:58
 精彩回答 2  元偷偷看……
justdomyself
5楼-- · 2020-01-25 01:56
xf331785508 发表于 2014-5-26 18:19
0x60被抹了??你读读Buf[2]的值:WORD   tmp2 = pmsg->BUF[2];

没有被抹掉,tmp2的值是有的
   tmp=MEM_W(& (pmsg->BUF[1]) );
[0xe3a00005]   mov      r0,#5
[0xe19050b4]   ldrh     r5,[r0,r4]
   tmp=MEM_W(&msg.BUF[1]);
[0xe3a00009]   mov      r0,#9
[0xe19050bd]   ldrh     r5,[r0,r13]
   
   tmp2=pmsg->BUF[2];
[0xe5d46006]   ldrb     r6,[r4,#6]
   

细看可以发现反汇编是 ldrh 半字加载指令      就不知道怎么编译器就编译成ldrh了   如果是LDR就是正常的值
justdomyself
6楼-- · 2020-01-25 04:06
貌似找到原因了:
   tmp=MEM_W(& (pmsg->BUF[2]) );
   tmp=MEM_W(& (pmsg->BUF[0]) );
这两个可以正常取值,也就是说不能从奇地址进行双字节或者四字节的数据读取

一周热门 更多>