MIPS 下非对齐访问的问题

http://bbs.ednchina.com/BLOG_ARTICLE_766646.HTM


MIPS 下使用访存指令读取或写入数据单元时,目标地址必须是所访问之数据单元字节数的整数倍,这个叫做地址对齐。


比如在 MIPS 平台上,lh 读取一个半字时,存储器的地址必须是 2 的整数倍; lw 读取一个字时,存储器的地址必须是 4的整数倍; sd 写入一个双字时,存储器的地址必须是 8 的整数倍。倘若访存时,目标地址不对齐,则会引起异常,典型的是系统提示“总线错误”后,直接杀死进程。

看一个测试程序(龙芯2E平台):

#include <stdio.h>
#include <sys/sysmips.h>

unsigned short data[] = {
  0x1, 0x2, 0x3, 0x4,
  0x55aa, 0x66bb, 0x77cc, 0x0000,
};

inline void unaligned_access(unsigned short * const row)
{
  asm volatile
    (
        ".set mips3\n\t"
        ".set noreorder\n\t"

        //"lwr $10, 1(%1)\n\t"
        //"lwl $11, 4(%1)\n\t"
        //"or $10, $11\n\t"
        "ld $10, 2(%1)\n\t"     /* %1 is double word aligned, %1+2 is double word unaligned */
        "sd $10, %0\n\t"

        ".set reorder\n\t"
        ".set mips0\n\t"
        : "=m"(*(row))
        : "r"(row+4)
        : "$8", "$9", "$10"
    );
}

int main()
{
  printf("---------------------------------------------------------\n");
  printf(" Testing Godson2 unaligned access Instruction \n");
  printf("---------------------------------------------------------\n\n");

// sysmips(MIPS_FIXADE, 0);

  unaligned_access(data);

  printf("result is: 0x%04x %04x %04x %04x\n", data[3], data[2], data[1], data[0]);

}

程序运行后系统提示“非法指令”后退出。


CISC 下(如x86)访存时,如果目标地址不对齐,CPU 不会陷入异常,因为其内部有处理非对齐访问的微程序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值