justdomyself 发表于 2014-5-26 16:33:47

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

本帖最后由 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;            // Data buffer
} CAN_MSG;


CAN_MSG msg,*pmsg;
msg.BUF=0X20;
msg.BUF=0X05;
msg.BUF=0X60;
msg.BUF=0X00;

pmsg=&msg;


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

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

justdomyself 发表于 2014-5-26 16:35:29

char buf[]={0x11,0x22,0x33,0x44};
       
        test=MEM_B(buf);
        test=MEM_W(buf);
        test=MEM_DW(buf);

但是这样又能正确的取到值

justdomyself 发表于 2014-5-26 16:52:29


   tmp=MEM_W(&pmsg->BUF);
   mov      r0,#5
   ldrh   r5,
   tmp=MEM_W(&msg.BUF);
   mov      r0,#5
   ldrh   r5,


为啥反汇编就成了ldrh半字读取   ,奇怪
          
   

qlb1234 发表于 2014-5-26 16:52:36

送你一張圖。

justdomyself 发表于 2014-5-26 16:58:27

qlb1234 发表于 2014-5-26 16:52
送你一張圖。

如果看出问题,请明言

laujc 发表于 2014-5-26 16:58:53

WORD   tmp=MEM_W(&pmsg->BUF); 这个是先取&pmsg了,呵呵,学习了。

justdomyself 发表于 2014-5-26 17:01:35

WORD   tmp=MEM_W(&(pmsg->BUF));效果也一样啊

justdomyself 发表于 2014-5-26 17:02:48

laujc 发表于 2014-5-26 16:58
WORD   tmp=MEM_W(&pmsg->BUF); 这个是先取&pmsg了,呵呵,学习了。

WORD   tmp=MEM_W(&(pmsg->BUF));效果也一样啊

qlb1234 发表于 2014-5-26 17:16:02

甚麼?tmp的值不是0x6005?你怎麼看的?

justdomyself 发表于 2014-5-26 18:02:07

qlb1234 发表于 2014-5-26 17:16
甚麼?tmp的值不是0x6005?你怎麼看的?

设断点   观察变量的值

xf331785508 发表于 2014-5-26 18:19:14

0x60被抹了??你读读Buf的值:WORD   tmp2 = pmsg->BUF;

justdomyself 发表于 2014-5-26 18:24:27

xf331785508 发表于 2014-5-26 18:19
0x60被抹了??你读读Buf的值:WORD   tmp2 = pmsg->BUF;

没有被抹掉,tmp2的值是有的
   tmp=MEM_W(& (pmsg->BUF) );
   mov      r0,#5
   ldrh   r5,
   tmp=MEM_W(&msg.BUF);
   mov      r0,#9
   ldrh   r5,
   
   tmp2=pmsg->BUF;
   ldrb   r6,
   

细看可以发现反汇编是 ldrh 半字加载指令      就不知道怎么编译器就编译成ldrh了   如果是LDR就是正常的值

justdomyself 发表于 2014-5-26 18:48:05

貌似找到原因了:
   tmp=MEM_W(& (pmsg->BUF) );
   tmp=MEM_W(& (pmsg->BUF) );
这两个可以正常取值,也就是说不能从奇地址进行双字节或者四字节的数据读取

justdomyself 发表于 2014-5-26 18:55:14

   tmp=MEM_W(& (pmsg->BUF) );
   mov      r0,#5
   ldrh   r5,

上代码中r4是一个偶地址,r4+r0就变成了奇地址

ldrh   r5,就出现了问题

armok 发表于 2014-5-26 19:36:07

页: [1]
查看完整版本: 请教一个关于从奇数地址取值出现的问题