搜索
bottom↓
回复: 14

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

[复制链接]

出0入8汤圆

发表于 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[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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入8汤圆

 楼主| 发表于 2014-5-26 16:35:29 | 显示全部楼层
char buf[]={0x11,0x22,0x33,0x44};
       
        test=MEM_B(buf);
        test=MEM_W(buf);
        test=MEM_DW(buf);

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

出0入8汤圆

 楼主| 发表于 2014-5-26 16:52:29 | 显示全部楼层

   tmp=MEM_W(&pmsg->BUF[1]);
[0xe3a00005]   mov      r0,#5
[0xe19050b4]   ldrh     r5,[r0,r4]
   tmp=MEM_W(&msg.BUF[1]);
[0xe3a00005]   mov      r0,#5
[0xe19050bd]   ldrh     r5,[r0,r13]


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

出0入0汤圆

发表于 2014-5-26 16:52:36 | 显示全部楼层
送你一張圖。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

 楼主| 发表于 2014-5-26 16:58:27 | 显示全部楼层

如果看出问题,请明言

出0入4汤圆

发表于 2014-5-26 16:58:53 | 显示全部楼层
WORD   tmp=MEM_W(&pmsg->BUF[1]); 这个是先取&pmsg了,呵呵,学习了。

出0入8汤圆

 楼主| 发表于 2014-5-26 17:01:35 | 显示全部楼层
WORD   tmp=MEM_W(&(pmsg->BUF[1]));效果也一样啊

出0入8汤圆

 楼主| 发表于 2014-5-26 17:02:48 | 显示全部楼层
laujc 发表于 2014-5-26 16:58
WORD   tmp=MEM_W(&pmsg->BUF[1]); 这个是先取&pmsg了,呵呵,学习了。

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

出0入0汤圆

发表于 2014-5-26 17:16:02 | 显示全部楼层
甚麼?tmp的值不是0x6005?你怎麼看的?

出0入8汤圆

 楼主| 发表于 2014-5-26 18:02:07 | 显示全部楼层
qlb1234 发表于 2014-5-26 17:16
甚麼?tmp的值不是0x6005?你怎麼看的?

设断点   观察变量的值

出0入0汤圆

发表于 2014-5-26 18:19:14 | 显示全部楼层
0x60被抹了??你读读Buf[2]的值:WORD   tmp2 = pmsg->BUF[2];

出0入8汤圆

 楼主| 发表于 2014-5-26 18:24:27 | 显示全部楼层
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就是正常的值

出0入8汤圆

 楼主| 发表于 2014-5-26 18:48:05 | 显示全部楼层
貌似找到原因了:
   tmp=MEM_W(& (pmsg->BUF[2]) );
   tmp=MEM_W(& (pmsg->BUF[0]) );
这两个可以正常取值,也就是说不能从奇地址进行双字节或者四字节的数据读取

出0入8汤圆

 楼主| 发表于 2014-5-26 18:55:14 | 显示全部楼层
   tmp=MEM_W(& (pmsg->BUF[1]) );
[0xe3a00005]   mov      r0,#5
[0xe19050b4]   ldrh     r5,[r0,r4]

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

ldrh     r5,[r0,r4]就出现了问题
头像被屏蔽

出0入0汤圆

发表于 2014-5-26 19:36:07 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 02:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表