查看MIPS 下非对其访问问题的源代码
←
MIPS 下非对其访问问题
跳转到:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== 问题 == RISC 下,使用访存指令读取或写入数据单元时,目标地址必须是所访问之数据单元字节数的整数倍,这个叫做地址对齐 在 MIPS 平台上,lh 读取一个半字时,存储器的地址必须是 2 的整数倍; lw 读取一个字时,存储器的地址必须是 4的整数倍; sd 写入一个双字时,存储器的地址必须是 8 的整数倍。倘若访存时,目标地址不对齐,则会引起异常,典型的是系统提示“总线错误”后,直接杀死进程。 看一个测试程序: <source lang=c> #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 " ".set noreorder " //"lwr $10, 1(%1) " //"lwl $11, 4(%1) " //"or $10, $11 " "ld $10, 2(%1) " /* %1 is double word aligned, %1+2 is double word unaligned */ "sd $10, %0 " ".set reorder " ".set mips0 " : "=m"(*(row)) : "r"(row+4) : "$8", "$9", "$10" ); } int main() { printf("--------------------------------------------------------- "); printf(" Testing Godson2 unaligned access Instruction "); printf("--------------------------------------------------------- "); // sysmips(MIPS_FIXADE, 0); unaligned_access(data); printf("result is: 0x%04x %04x %04x %04x ", data[3], data[2], data[1], data[0]); } </source> 在龙芯2E的系统上,程序运行后系统提示“非法指令”后退出。 CISC 下(如x86)访存时,如果目标地址不对齐,CPU 不会陷入异常,因为其内部有处理非对齐访问的微程序。 <br><br>
返回到
MIPS 下非对其访问问题
。
个人工具
3.128.199.130
该IP地址的讨论
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面