打印

我也来孔乙己,出道小题

[复制链接]
1586|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ahwei|  楼主 | 2008-4-6 22:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
u08 buf[16];
void main( void )
{
  u32 var;
  u08 *pbuf;
  u32 *ptr;
  u32 i;
  
  pbuf = (u08*)((u32)(buf +4) & (~3L));
  for(i = 0; i < sizeof(buf) - 4; i++)
     pbuf = i;
  ptr = (u32*)(pbuf + 3);
  var = *ptr;
    //执行到此var的值是多少?
}
假设u08为8位无符号整形数,u16为16位无符号整形数,u32为32位无符号整形数,测试的平台均为little endia处理器,请回答
在下列平台下,var的值是多少?
1. x86架构PC机
2. 32位的嵌入式little endia处理器
3. 16位的嵌入式little endia处理器
4. 8位的嵌入式处理器

这是一道讨论题,你可以把你认为正确的答案及理由都写出来。

相关帖子

沙发
ayb_ice| | 2008-4-7 10:08 | 只看该作者

其实就是考编译器数据类型转换的问题

使用特权

评论回复
板凳
ahwei|  楼主 | 2008-4-7 14:00 | 只看该作者

这个题也不是那么简单的.

使用特权

评论回复
地板
dld2| | 2008-4-7 14:23 | 只看该作者

Re

ARM下会出异常吧。没实测。

使用特权

评论回复
5
IceAge| | 2008-4-7 20:41 | 只看该作者

alignment。 这是cpu 对齐方式的不同

不仅仅是compiler 的问题。32bit 的 x86 因为历史兼容关系(兼容8088, 8086, 80386, 80486...),可以access 8bit, 16-bit 数据,若不对齐,只是多出一次存取而已。ptr = (u32*)(pbuf + 3), ptr 的地址可以是 pbuf+3.

但很多其他的 16-bit, 32-bit cpu,16bit, 32bit 无法被分割,即必须对齐,这时 ptr = (u32*)(pbuf + 3),ptr 的地址是 pbuf 或者是(u32*)pbuf +3 (这里的u08 实际上是 32-bit, 因为此cpu 没有8bit的内部register, char 被当作32bit 处理) , 或者compiler直接给出编译警告或错误.  

使用特权

评论回复
6
ahwei|  楼主 | 2008-4-7 22:21 | 只看该作者

从我用过的处理器来说,硬件还不能产生异常

楼上基本解释到要点。
arm,msp430, c6000硬件都不能捕获这个异常。
上面的代码完全符合c标准,编译器不会报错,某些软件模拟器在单步的情况下能检测到。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

151

帖子

0

粉丝