本帖最后由 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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
WORD tmp=MEM_W(&(pmsg->BUF[1]));效果也一样啊
设断点 观察变量的值
没有被抹掉,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就是正常的值
tmp=MEM_W(& (pmsg->BUF[2]) );
tmp=MEM_W(& (pmsg->BUF[0]) );
这两个可以正常取值,也就是说不能从奇地址进行双字节或者四字节的数据读取
一周热门 更多>