MIPS 下非对齐访问的问题
来源:互联网 发布:mysql 登录失败设置 编辑:程序博客网 时间:2024/06/06 02:30
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
- MIPS 下非对齐访问的问题
- MIPS 下非对齐访问的问题
- mips下非对齐访问问题分析
- RISC 下非对齐访问的问题
- 非对齐地址访问问题
- 非对齐地址访问问题
- arm 下C编程的非对齐访问
- ARM非对齐访问
- 结构体成员非对齐访问所带来的思考
- ARM处理器关于非对齐存储的访问规则
- 单片机的非对齐访问导致硬件错误
- ARM体系中存储系统非对齐的存储访问操作
- ARM体系中存储系统非对齐的存储访问操作
- STM32F0非对齐访问引起的硬件错误及其排除
- STM32F0非对齐访问引起的硬件错误及其排除
- mips下的syscall
- DSP C6000汇编,数据字节非对齐问题的处理
- cortex-m3非对齐访问引发HardFault
- 找出那个数字出现3次的数字
- C#三层架构思路
- 国内一些ML好的网站
- Objective-C和Java的简单对比
- 【SICP练习】149 练习4.5
- MIPS 下非对齐访问的问题
- gulp plugins 插件介绍(推荐阅读)
- 好像是半年没有写博客了,最近是有多懒了
- JAVA 使用Aspose.Words组件生产Word或PDF文件
- Openssh rpm 包制作
- SQL中的正则表达式
- Haar特征原理与icvCreateIntHaarFeatures方法的具体实现附详细注释—— 人脸识别的尝试系列(二)
- Qt3升至Qt4需要注意的几件事项浅谈
- Java数据库编程中的常用技巧