根据mips寄存器的用途迅速定位问题

在遇上一些偶尔才能出现的bug的时候, 根据寄存器的相关信息结合汇编语句, 可以迅速定位到问题, 提高debug的效率.

正好今天项目上报了一个bug, 死机的, 用这个方法很快定位到问题.

死机的一些打印:

#AP!# exception!

Coprocessor Unusable exception

EPC[0x80240760], CAUSE[0x1080002c], SR[0xff03], SP[0x80c0b558]!

showcs 80240760 80c0b558 80103510

OSIntNesting=0 OSLockNesting=0

先看寄存器:

ra:[0x8010351]  epc[0x80240760]  fp:[0x80034e70]  gp:[0x80618b48]  at:[0xfffffffe]

t9:[0x8001306]  t8:[0x00000008]  t7:[0x00000000]  t6:[0x00000005]  t5:[0x00000000]

t4:[0x816baff]  t3:[0x00000000]  t2:[0x00000000]  t1:[0x80fbd330]  t0:[0x806f0000]

s7:[0x8023f55]  s6:[0x80034ed0]  s5:[0x80c0c27c]  s4:[0x8111fdb0]  s3:[0x80c0be28]

s2:[0x0000000]  s1:[0x80c0b6c4]  s0:[0x800341f0]

a3:[0x80c0b4c]  a2:[0x000000fe]  a1:[0x80c0b588]  a0:[0x00000000]  

v1:[0x8024075]  v0:[0x000000fe]

注意这边的a0寄存器.

相应的汇编:

80240758 <xxxx_func>:

80240758:    27bdffe8     addiu    sp,sp,-24

8024075c:    afbf0014     sw    ra,20(sp)

80240760:    90830204     lbu    v1,516(a0)  //这边有问题

80240764:    3c0280ab     lui    v0,0x80ab

80240768:    2442b778     addiu    v0,v0,-18568

8024076c:    00033180     sll    a2,v1,0x6

80240770:    00031900     sll    v1,v1,0x4

由于a0一般用来做参数传递, 所以检查这个函数的参数的定义.

typedef struct

{

void *dir;

tchar_t name[256];

    u8 use_logic; //正好是516的偏移

u32 file_num;

}xxx;

结合函数中的语句, 有p_dj->use_logic的操作, 因此这个死机是由于传递的这个参数是NULL导致的.

==============================下面是网上找的mips寄存器的介绍================================

表格来自 http://blog.sina.com.cn/s/blog_6cf6b58d0100lot7.html


;REGISTER


NAME


USAGE


$0


$zero


常量0(constant value 0)


$1


$at


保留给汇编器(Reserved for assembler)


$2-$3


$v0-$v1


函数调用返回值(values for results and expressionevaluation)


$4-$7


$a0-$a3


函数调用参数(arguments)


$8-$15


$t0-$t7


暂时的(或随便用的)


$16-$23


$s0-$s7


保存的(或如果用,需要SAVE/RESTORE的)(saved)


$24-$25


$t8-$t9


暂时的(或随便用的)


$28


$gp


全局指针(Global Pointer)


$29


$sp


堆栈指针(Stack Pointer)


$30


$fp


帧指针(Frame Pointer)


$31


$ra


返回地址(return address)

时间: 2024-10-14 16:50:11

根据mips寄存器的用途迅速定位问题的相关文章

8086CPU各寄存器的用途

8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器.(2)指令指针.(3)标志寄存器和(4)段寄存器等4类. 1.通用寄存器有8个, 又可以分成2组,一组是数据寄存器(4个),另一组是指针寄存器及变址寄存器(4个). 数据寄存器分为:AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.BH&BL=BX(base):基址寄存器,常用于地址索引:CH&C

32位寄存器

 32位  16位 8位寄存器  EAX  AX AH AL  ECX  CX CH CL  EDX  DX DH DL  EBX  BX BH BL  ESP  SP    EBP  BP    ESI  SI    EDI  DI   寄存器        主要用途                                                                    存储范围 EAX            累加器                        

CPU的内部架构和工作原理 (转,相当不错)

一直以来,总以为CPU内部真是如当年学习<计算机组成原理>时书上所介绍的那样,是各种逻辑门器件的组合.当看到纳米技术时就想,真的可以把那些器件做的那么小么?直到看了Intel CPU制作流程及AMD芯片的制作流程的介绍不禁感慨,原来科技是如此的发达. 本文我们以Intel为例对CPU的工作原理做简单介绍,仅仅是简单介绍,那么AMD,ARM,MIPS甚至PowerPC你应该会触类旁通才对. 还记得那是1968年7月18日,鲍勃-诺斯和戈登-摩尔的新公司在美国加利福尼亚州,美丽的圣弗朗西斯科湾畔芒

PowerPC汇编指令集

PowerPC 体系结构规范(PowerPC Architecture Specification)公布于 1993 年,它是一个 64位规范 ( 也包括 32 位子集 ).差点儿全部常规可用的 PowerPC(除了新型号 IBM RS/6000 和全部IBM pSeries 高端server)都是 32 位的. PowerPC 处理器有 32 个(32 位或 64 位)GPR(通用寄存器)以及诸如 PC(程序计数器,也称为 IAR/指令地址寄存器或 NIP/下一指令指针).LR(链接寄存器).

ASM:《X86汇编语言-从实模式到保护模式》第12章:存储器的保护

12章其实是11章的拓展,代码基本不变,就是在保护模式下展开讨论. ★PART1:存储器的保护机制 1. 修改段寄存器的保护 当执行把段选择子传到段寄存器的选择器部分的时候,处理器固件在完成传送之前,要检查和确认选择子是正确的,并且该选择子选择的描述符也是正确的.假如索引号是正确的,也就是说明索引号8+7要小于等于边界.如果超过边界,那么处理器就会终止处理,产生异常中断13,同时段寄存器的原值保持不变. 同时处理器还要对描述符的类别进行检查,如果描述符的类别进行确认,举个例子来说,如果描述符的类

软件优化理论基础以及方法论小结.

就像我其他博文中说的,对于软件的优化除开算法,全部都是为流水线服务的.所以优化的时候要时刻记住一这点.由于优化的东西比较杂,我写的不是很好,所以在文章的最后,我会试着提炼出一些通用性的原则. 由于之前在WPS上写的,所以代码没有用模版来排版,各位看官就将就着看吧..我也只是为了提炼一次知识,真正的优化还是认真看一遍书来的好. 有哪些方法优化软件? 通常有两种方式,一种是通过编译器,另一种则是自己写.因为编译器会考虑到特殊情况,所以能做的优化很多时候并不是特别多.这时候就需要自己写优化来帮助 一.

mipsel汇编指令学习

MIPS汇编语言基础 MIPS的系统结构及设计理念比较先进,其指令系统经过通用处理器指令体系MIPS I.MIPS II.MIPS III.MIPS IV.MIPS V,以及嵌入式指令体系MIPS16.MIPS32到MIPS64的发展. MIPS32的架构是一种基于固定长度的定期编码指令集,并采用导入/存储(load/store)数据模型.经改进,这种架构可支持高级语言的优化执行.在路由器中,经常使用的一种MIPS架构就是MIPS32. MIPS寄存器 RISC的一个显著特点就是大量使用寄存器.

x80386汇编

EAX寄存器:EAX称为累加器,常用于算数运算.布尔操作.逻辑操作.返回函数结果等.EBX寄存器:EBX称为基址寄存器,常用于存档内存地址.ECX寄存器:ECX称为计数寄存器,常用于存放循环语句的循环次数,字符串操作中也常用.EDX寄存器:称为数据寄存器,常常和EAX一起使用. 5.变址寄存器 变址寄存器 顾名思义,变址的含义是内存地址会变动的,也就是说变址寄存器中存放在变动的内存地址.80386架构中有两个变址寄存器,分别是ESI和EDI.ESI和EDI寄存器:ESI:ESI称为源变址寄存器,

Linux及安全 内核分析计算机是如何工作的

Linux及安全 内核分析计算机是如何工作的 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验内容: 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 二.实验过程: 在Linux模拟器上,打开一个shell命令运行器,在Code文件夹中建立一个c文件,用vi命令运行,打开main.c文件,输入一个简单的c程序,用gcc -S -o main.s main.c -m