在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!)    创芯人才网--重磅上线啦!
查看: 6316|回复: 2

旧问题新问(关于MIPS的非地址对齐访问)

[复制链接]
发表于 2007-3-15 20:54:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
菜鸟请问各位高手,我现在从x86向mips(bcm1250)作移植,用的Tornado2.2,在进行非对齐地址的访问时程序不能响应,无法读到值,接着作了几个实验用不同的方式访问该地址的值,结果如下:
char *p_buffer;/*注:p_buffer实际上是从函数传进的参数,在其偏移27个字节处为4字节表示的数1*/
char *p;
UINT data;
方式1:直接赋值(原来x86下的访问方式)
p = p_buffer + 27;
data = *(UINT*)p;
结果:程序不响应,不能成功为data赋值。
方式2:采用非紧凑格式的结构体强制转换,再取其成员变量值
tpyedef struct T_TEST_T
{
  UINT test_data;
}T_TEST_T
T_TEST_T *test;
test = (T_TEST_T *)(p_buffer + 27);
data = test->test_data;
结果:程序不响应,不能成功为data赋值。
方式3:采用紧凑格式的结构体
tpyedef struct T_TEST_T
{
  UINT test_data;
}__attribute__ ((packed))T_TEST_T
T_TEST_T *test;
test = (T_TEST_T *)(p_buffer + 27);
data = test->test_data;
结果:程序运行正常,可以成功为data赋值,data = 1。
方式4:直接内存拷贝
p = p_buffer + 27;
memcpy(&data, p, sizeof(UINT));
结果:程序运行正常,可以成功为data赋值,data = 1。
方式5:单字节读取再位或
p = p_buffer + 27;
data = *(unsigned char *)p;
data = (data<<8) | *(unsigned char *)(p + 1);
data = (data<<8) | *(unsigned char *)(p + 2);
data = (data<<8) | *(unsigned char *)(p + 3);
结果:程序运行正常,可以成功为data赋值,data = 1。
另外,p_buffer首地址打印为0x87ab0c80,p_buffer+27处地址打印为0x87ab0e1b。
根据查阅的网上资料,MIPS确实要求字节对齐的访问,但是不知道以上5种方式从本质上有何区别,或者编译器在处理以上5种方式时有何不同,为什么前两种方式不能正常访问,而后面三种方式可以访问。另外由于移植过程中该类问题较多,若都用以上可以访问的三种方式之一修改工作量大且容易出错,不知是否有全局修改的办法,比如在编译选项中设置允许非对齐访问等。(对于紧凑格式的结构体访问方式,有资料说对于有些编译器是可以自动作处理的,显然小弟使用的gcc有此处理非对齐访问的能力,但不知能否提到全局使用)
小弟先在此感谢各位大侠的指点了^_^!
发表于 2007-3-19 12:11:43 | 显示全部楼层
ding a ,wo yao money
发表于 2007-4-14 00:48:39 | 显示全部楼层
同问同问
谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

关闭

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-28 23:25 , Processed in 0.032318 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表