- 1、本文档共38页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
转正答辩胶片
杭州迪普科技有限公司 MIPS汇编及KDB入门 czk 目录 通用寄存器及常用CP0寄存器功能介绍 基本汇编指令 Mips汇编中的一些隐式规则 常用kdb命令 使用kdb定位问题的具体方法 通用寄存器 汇编语言以行为单位,由指令和寄存器组成,mips汇编沿袭c语言赋值语句风格,目标寄存器在左,源操作数在右 Mips共有32个通用寄存器,其中$0,$31这两个寄存器有特殊作用,其它寄存器硬件没有做限制,理论上可以随便使用,但为了可读性和兼容性,基本上所有mips处理器都遵循下面的习惯用法,相应于习惯用法对寄存器有一套命名约定,定义在内核regdef.h头文件中,经过这个头文件的预处理后,反汇编后的汇编代码中寄存器就不再是$0,$1…$30,$31这些编号,而是头文件中定义的习惯命名,也叫助记符 寄存器作用说明 0$ 0?? :5000dc008cdb388e0$ 4?? : dfd514008ffb3d58 8ffb3e280$ 8?? : da84f394 da84f374 ffffff00 0$12?? :8c4a9920 bc400000 bfc048000$16?? :0000000e8cdb38000$20?? :00000000000000500$24?? :dfcc00000$28?? : 8ffb2000 8ffb3d48 db0589f4 dfcc0054 编号 别名 作用 $0 zero 永远返回0 $1 at (assembly temporary)保留给汇编器使用 $2-$3 v0-v1 子程序返回值 $4-$7 a0-a3 (argument)调用子程序时前4个参数 寄存器作用说明 常用cpo寄存器 异常程序计数器即异常返回地址(EPC):保存异常返回点,即导致异常的指令地址,使用kdb定位问题的入口 原因寄存器(cause):记录异常类型,只有一位比较重要,最高位表示异常发生在分支延迟槽,这时真正导致异常指令应该是epc的下一条指令 状态寄存器(SR):与通常状态寄存器是只读的不同,cpo的SR是可写的,用于控制cpu的工作模式:尾端,协处理器使能,中断使能,大写端配置等 ErrorEPC寄存器:发生cache error时,异常受害指令为ErrorEPC 基本汇编指令 加载和存储(load/store) ld,lw,lh(lhu),lb(lbu): 加载双字(double 8字节,64位系统才有),字(word),半字(half),字节(byte) lw v0,4(s0) ? v0 = *(s0 +4); lhu,lbu(u:unsigned)指加载无符号数,因为mips通用寄存器都是32位的,而判断一个数的正负时,只看最高位,所以在加载半字和一个字节时需要根据加载数的最高位(lhu:bit15,lb:bit7)符号扩展或0扩展到所有高位(lbu即0扩展) li (load immediate)加载一个常数:li a0,0x1234 ? a0 = 0x1234 lui 上位加载一个立即数: lui a0,0x1234 ? a0 = 0 sd,sw,sh,sb:存储双字,字,半字,字节,存储指令不存在符号扩展的问题: sw v0,4(s0) ? *(s0 +4) = v0; 基本汇编指令 算术/逻辑运算 addu,daddu addiu,daddiu 32/64位加法(指令前缀d代表64位操作,一般只在64位系统上出现,i代表操作数有常数,后续不再列举) addu a2,a2,s5 ? a2 = a2+s5; subu 减法 : subu v0,a0,v0 ? v0 = a0-v0; and 逻辑与: and v0,a0,v0 ? v0 = a0v0; or 逻辑或: or v0,a0,vo ? v0 = a0|v0; xor 逻辑异或: xor v0,a0,vo ? v0 = a0 ^vo; nor 逻辑取反: nor v0,a0,vo ? v0 = ~(a0|v0); sll 逻辑左移(shift left log
文档评论(0)