MIPS 汇编指令学习
mips的32个寄存器
Registers also have symbolic names reflecting their conventional8 use:
$0 $zero constant 0
$1 $at used by assembler
$2 $v0 function result
$3 $v1 function result
$4 $a0 argument 1
$5 $a1 argument 2
$6 $a2 argument 3
$7 $a3 argument 4
$8 $t0 unsaved temporary
$9 $t1 unsaved temporary
$10 $t2 unsaved temporary
$11 $t3 unsaved temporary
$12 $t4 unsaved temporary
$13 $t5 unsaved temporary
$14 $t6 unsaved temporary
$15 $t7 unsaved temporary
$16 $s0 saved temporary
$17 $s1 saved temporary
$18 $s2 saved temporary
$19 $s3 saved temporary
$20 $s4 saved temporary
$21 $s5 saved temporary
$22 $s6 saved temporary
$23 $s7 saved temporary
$24 $t8 unsaved temporary
$25 $t9 unsaved temporary
$26 $k0 reserved for OS kernel
$27 $k1 reserved for OS kernel
$28 $gp pointer to global data
$29 $sp stack pointer
$30 $fp frame pointer
$31 $ra return address
寄存器号 符号名 用途
0 始终为0 看起来象浪费,其实很有用
1 at 保留给汇编器使用
2-3 v0,v1 函数返回值
4-7 a0-a3 前头几个函数参数
8-15 t0-t7 临时寄存器,子过程可以不保存就使用
24-25 t8,t9 同上
16-23 s0-s7 寄存器变量,子过程要使用它必须先保存
然后在退出前恢复以保留调用者需要的值
26,27 k0,k1 保留给异常处理函数使用
28 gp global pointer;用于方便存取全局或者静态变量
29 sp stack pointer
30 s8/fp 第9个寄存器变量;子过程可以用它做frame pointer
31 ra 返回地址
硬件上这些寄存器并没有区别(除了0号),区分的目的是为了不同的编译器产生的代码可以通用
=========================================
lui 中i表示加载常数
li r, c:加载16bit或32bit常数到r
lui r, c:加载16bit常数到r的高16位load constant halfword c into upper halfword of register r
(translation of pseudo instructions)
伪指令 翻译的实际指令
not r, s ==> nor r, s, $0
move r, s ==> or r, s, $0
li r, c ==> ori r, $0, c load immediate (c: 16 bit constant)
li r, 0xABCDEF00==> lui $at, 0xABCD和ori r, $at, 0xEF00 (c: 32 bit constant)
and $t0, $t0, 0xFFFFFF00==> lui $at, 0xFFFF
ori $at, 0xFF00
and $t0, $t0, $at
.ascii s ASCII encoded characters of string s
.asciiz s like .ascii, null-terminated
.word w1, w2, . . . 32-bit words w1, w2, . . .
.half h1, h2, . . . 16-bit halfwords h1, h2, . . .
.byte b1, b2, . . . 8-bit bytes b1, b2, . . .
.float f1, f2, . . . 32-bit single precision floating point numbers f1, f2, . . .
.double d1, d2, . . . 64-bit double precision floating point numbers d1, d2, . . .
.space n n zero bytes
使用la伪指令访问数据区
la $t0, str
lb $t1, ($t0) # access byte at address $t0 (’f’)
add $t0, $t0, 3
lb $t2, ($t0) # access byte at address $t0 + 3 (’b’)
.data
str: .asciiz "foobar"
load word/halfword/byte at address a into target register r
lw r, a
lh r, a sign extension
lb r, a sign extension
lhu r, a no sign extension
lbu r, a no sign extension
store word/halfword/byte in register r at address a
sw r, a
sh r, a stores low halfword
sb r, a stores low byte
Example (copy a sequence of n bytes from address src to address dst):
.text
.globl __start
__start:
# length n of byte sequence - 1
li $t0, 5
copy:
lb $t1, src($t0) # pseudo! (src: 32 bits wide)
sb $t1, dst($t0)
sub $t0, $t0, 1
bgez $t0, copy
.data
src: .byte 0x11, 0x22, 0x33, 0x44, 0x55, 0x66
dst: .space 6
=========================================
http://www.mips-in-china.com/Study/ShowArticle.asp?ArticleID=147
mfc0 - move from c0
cfc0 - copy from c0
mfc0 t0,c0_status
lui at,0x1000
ori at,at,0x1f
or t0,t0,at
xori t0,t0,0x1f
mtc0 t0,c0_statu
于协处理器CP0的访问,需要使用特别的指令。这些指令属于“特权级指令”,只有在内核态(Kernel Mode)下才能执行。如果在用户态下,会引起一个异常(Exception)。
对CP0的主要操作有以下的指令:
mfc0 rt, rd 将CP0中的rd寄存器内容传输到rt通用寄存器;
mtc0 rt, rd 将rt通用寄存器中内容传输到CP0中寄存器rd;
mfhi/mflo rt 将CP0的hi/lo寄存器内容传输到rt通用寄存器中;
mthi/mtlo rt 将rt通用寄存器内容传输到CP0的hi/lo寄存器中;
当MIPS体系结构演进到MIPS IV的64位架构后,新增了两条指令dmfc0和dmtc0,向CP0的寄存器中读/写一个64bit的数据。
r4k MIPS CPU中和异常相关的控制寄存器(这些寄存器由协处理器cp0控制,有独立的存取方法)有:
1.status 状态寄存器
31 28 27 26 25 24 16 15 8 7 6 5 4 3 2 1 0
------------------------------------------------------------------
| cu0-3|RP|FR|RE| Diag Status| IM7-IM0 |KX|SX|UX|KSU|ERL|EXL|IE|
------------------------------------------------------------------
其中KSU,ERL,EXL,IE位在这里很重要:
KSU: 模式位 00 -kernel 01--Supervisor 10--User
ERL: error level,0->normal,1->error
EXL: exception level,0->normal,1->exception,异常发生是EXL自动置1
IE: interrupt Enable, 0 -> disable interrupt,1->enable interrupt
(IM位则可以用于enbale/disable具体某个中断,ERL||EXL=1 也使得中断不能响应)
系统所处的模式由KSU,ERL,EXL决定:
User mode: KSU = 10 && EXL=0 && ERL=0
Supervisor mode(never used): KSU=01 && EXL=0 && ERL=0
Kernel mode: KSU=00 || EXL=1 || ERL=1
2.cause寄存器
31 30 29 28 27 16 15 8 7 6 2 1 0
----------------------------------------------------------------
|BD|0 | CE | 0 | IP7 - IP0 |0|Exc code | 0 |
----------------------------------------------------------------
异常发生时cause被自动设置
其中:
BD指示最近发生的异常指令是否在delay slot中
CE 发生coprocessor unusable异常时的coprocessor编号(mips有4个cp)
IP: interrupt pending, 1->pending,0->no interrupt,CPU有6个中断
引脚,加上两个软件中断(最高两个)
Exc code:异常类型,所有的外设中断为0,系统调用为8,...
3.EPC
对一般的异常,EPC包含:
. 导致异常的指令地址(virtual)
or. if 异常在delay slot指令发生,该指令前面那个跳转指令的地址
当EXL=1时,处理器不写EPC
4.和存储相关的:
context,BadVaddr,Xcontext,ECC,CacheErr,ErrorEPC
以后再说
一般异常处理程序都是先保存一些寄存器,然后清除EXL以便嵌套异常,
清除KSU保持核心态,IE位看情况而定;处理完后恢复一些保存内容以及CPU状态
=========================================
=========================================
=========================================
MIPS 指令集(共 31条) | ||
|
||
注 意:因为MIPS16只有16个16位的寄存器,所以JAL指令中$31改成$15, 所有立即数均无需扩展,LUI指令直接就是将立即数付给RT寄存器。 |
MIPS 汇编指令学习相关推荐
- ARM汇编指令学习---基于启动文件startup.S分析
本文主要是基于启动文件startup.s对ARM汇编指令进行学习分析. 以 . 开头一般是伪汇编/操作指令,形如: .section伪操作来定义一个段,形如: .section .testsectio ...
- ARM汇编指令学习笔记(一)
(一)数据常量定义汇编指令EQU EQU用于为程序中的常量.标号等定义一个有效的字符名称,类似于C语言中的#define,当表达式为32位常量时,可指定表达式的数据类型,CODE16,CODE32,D ...
- 80C51汇编指令学习
80C51汇编指令(111条)按字节数可以分为:单字节指令(49条),双字节指令(45条),三字节指令(17条) 单字节指令如INC A;其中操作助记符INC占5个Bit,累加器A占1个Bit,共占6 ...
- 汇编指令学习(AND,OR,XOR,NOT)
一.AND指令 逻辑与运算,二进制位都为1时,才为1,否则为0,置eax为5,置ebx为6,运行下面指令,结果会赋值给eax 5二进制:0101 6二进制:0110 与结果是 0100,十进制是4 a ...
- 汇编指令学习(MOV,MOVSX,MOVZX,LEA,XCHG)
一.MOV指令 1.将十六进制0x1234数值,赋值给eax寄存器 mov eax,0x1234 2.将十六进制0x123数值,赋值给内存地址为ebx mov dword [ebx],0x123 3. ...
- 汇编指令学习(CMP,TEST)
一.CMP比较指令,相当于SUB命令 比较两个操作数,如果两个数相等,zf标志位就为1,将eax,ebx的值置为1,执行下面指令,je这个跳转指令就会根据zf标志位进行跳转 cmp eax,ebx j ...
- 汇编指令学习(ADD,SUB,MUL,DIV,XADD,INC,DEC,NEG)
一.ADD加法操作指令 将eax置1,ebx置2,运行下面命令,将结果保存到eax add eax,ebx 扩展:adc需要再加上CF标志位的值 adc eax,ebx 二.SUB减法操作指令 将ea ...
- 汇编指令学习(JMP、JE、JS、JP,JO,JB)
一.JMP无条件跳转 不用看标志位,jmp后面跟一个内存地址,直接跳转到该地址 jmp 0x0046B994 二.JE(JZ)条件跳转 当ZF标致为1的时候发生跳转,为0的时候不跳转,可以双击标志位, ...
- mips架构汇编指令
mips架构特点 MIPS32 架构中是没有 EBP 寄存器的,程序函数调用的时候是将当前栈指针向下移动 n 比特到该函数的 stack frame 存储组空间,函数返回的时候再加上偏移量恢复栈 传参 ...
最新文章
- 「 每日一练,快乐水题 」717. 1比特与2比特字符
- python开三次方_python实现三次样条插值
- Ant Design入门之介绍
- 【解题报告+感想感言】2019年第十届蓝桥杯【C++省赛B组】【第五题:迷宫】
- Android开发之APP打开小程序后小程序无法返回APP,无法打开APP,launchApp无法返回app的原因
- Linux查找命令find、loacte、whereis、which、type梳理
- HMM隐马尔科夫模型浅析
- github page hexo博客gitee_GitHub+hexo快速搭建个人博客
- java修改excel图表数据源,导出excel图表文件
- 【蓝桥杯】Java_B组2015年省赛真题
- pytest系列教程——4、fixture详解
- deepin linux 安装 磁盘管理,deepin安装教程
- 浅谈几款软件的创新点
- 速求CAD序列号和密钥
- 足球foteball英文
- js 声明——有无var的区别
- CSS3各个模块详解
- 城市道路十字路口的通行规则是“红灯停,绿灯行”,请用信号量和PV操作描述交通信号灯和汽车通过十字路口的同步行为
- 新浪微博长链接字数统计问题
- 绝地大逃杀官方指定迅游加速
热门文章
- python——数据类型
- 4,postman和newman的联合使用
- C++程序员必读的经典著作
- fatal error C1083: Cannot open include file: 'ceconfig.h': No such file or directory
- data too long for column的解决方法
- 痛与快乐有一个代码是什么_养一只真大型犬的生活是什么样的?铲屎官:痛并快乐着!...
- [Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形
- RxSwift之UI控件UIActivityIndicatorView与UIApplication扩展的使用
- iOS之仿QQ好友列表展开收缩效果的实现
- 13.2.8 用户认证