1、,MIPS汇编基础,汇编语言程序设计,第五章 MIPS汇编基础,MIPS汇编程序框架,5.1 MIPS指令集简介,MIPS指令集简介,4,北方工业大学信息学院,MIPS背景知识,MIPS指令集简介,5,北方工业大学信息学院,MIPS背景知识,MIPS指令集简介,6,北方工业大学信息学院,指令集特点(与X86指令集对比),MIPS指令集简介,7,北方工业大学信息学院,指令集特点(与X86指令集对比),MIPS指令集简介,8,北方工业大学信息学院,指令集特点(与X86指令集对比),MIPS指令集简介,9,北方工业大学信息学院,MIPS基本地址空间,kseg0只需要把最高位清零(&0 x7fffff
2、ff),这些地址就被转换为物理地址,然后把它们连续地映射到物理内存的低端512M(0 x0000 0000-0 x1FFF FFFF)空间。因为这种映射是很简单的,不需要MMU转换,通常把这些地址称为“非翻译无需转换的”(Unmapped)地址区域,kseg1通过将最高3位清零(&0 x1fffffff)的方法来把这些地址映射为相应的物理地址,是“非翻译无需转换的”(Unmapped)地址区域。注意,kseg1不使用缓存(Uncached)。kseg1是唯一的在系统重启时能正常工作的内存映射地址空间。,kseg2这段地址空间只能在核心态下使用并且要经过MMU转换。在MMU 设置好之前,不能存取
3、这段区域。除非你在写一个真正的操作系统,一般来说你不需要使用这段地址空间。,kuseg这些是用户模式下可用的地址,即MIPS规范约定用户空间为2G。在带有MMU的机器里,这些地址都将由MMU转换。除非已经设置好MMU,否则不要使用这2G 地址。,第五章 MIPS汇编基础,MIPS汇编程序框架,5.2 MIPS通用寄存器和指令格式,MIPS通用寄存器和指令格式,12,北方工业大学信息学院,MIPS通用寄存器和指令格式,13,北方工业大学信息学院,特殊寄存器,MIPS32架构中定义的特殊寄存器有三个:PC(Program Counter程序计数器)、HI(乘除结果高位寄存器)、LO(乘除结果低位寄
4、存器)。进行乘法运算时,HI和LO保存乘法运算的结果,其中HI存储高32位,LO存储低32位;进行除法运算时,HI和LO保存除法运算的结果,其中HI存储余数,LO存储商。,MIPS通用寄存器和指令格式,14,北方工业大学信息学院,MIPS指令类型,MIPS通用寄存器和指令格式,15,北方工业大学信息学院,R型指令,MIPS通用寄存器和指令格式,16,北方工业大学信息学院,I型指令,MIPS通用寄存器和指令格式,17,北方工业大学信息学院,J型指令,MIPS通用寄存器和指令格式,18,北方工业大学信息学院,【例5.1】根据MIPS指令操作码定义以及指令格式给出以下指令的各个字段的十进制值:add
5、$8,$17,$18,答:指令是R格式指令,第一个字段和最后一个字段的值分别为0和32。第二个字段为17第三个字段为18第四个字段为8第五个字段未使用被设置为0,MIPS通用寄存器和指令格式,19,北方工业大学信息学院,访问存储器指令,MIPS通用寄存器和指令格式,20,北方工业大学信息学院,取存储器地址:LA。LA类似x86里的lea指令。,例如:la$a0,mymessage。将存储器的地址给寄存器,即将mymessage的地址给$a0也就是10000000h.,MIPS通用寄存器和指令格式,21,北方工业大学信息学院,存储器取指令:LB和LW。LB是取一个字节,LW是取一个字。除此之外L
6、B和LW的使用方法一致。,例如:lb$t1,array。该指令的意思是将array这个地址中取一个字节放到$t1寄存器中。,MIPS通用寄存器和指令格式,22,北方工业大学信息学院,lb也可以直接从地址中取字节。,例如:lb$t1,0 x10000000,直接从地址10000000h取一个字节到寄存器$t1。,MIPS通用寄存器和指令格式,23,北方工业大学信息学院,存储器存指令:SB和SW。SB是存一个字节,SW是存一个字。,例如:sb$t1,address。该指令的意思将$t1寄存器中的一个字节33放到address地址中去。,MIPS通用寄存器和指令格式,24,北方工业大学信息学院,MI
7、PS寻址模式,立即数寻址-操作数是位于指令自身中的常数。,例如:addi$s4,$t5,-73例如:ori$t3,$t7,0 xFF,寄存器寻址-操作数是寄存器。,例如:add$s0,$t2,$t3例如:sub$t8,$s1,$0,MIPS通用寄存器和指令格式,25,北方工业大学信息学院,MIPS寻址模式,基址寻址或偏移寻址-例如lw和sw,是将16位地址字段做符号扩展成32位与PC相加,操作数在内存中,其地址是指令中基址寄存器和常数的和。,例如:lw$s4,72($0)地址=$0+72例如:sw$t2,-25($t1)地址=$t1 25,MIPS通用寄存器和指令格式,26,北方工业大学信息学
8、院,MIPS寻址模式,PC相对寻址-条件分支指令在进行分支跳转时,使用相对PC寻址方式来确定PC的新值,将16位地址左移2位与PC(已更新为PC+4)相加。,第五章 MIPS汇编基础,MIPS汇编程序框架,5.3 MIPS汇编程序框架,MIPS汇编程序框架,29,北方工业大学信息学院,MIPS源程序框架,.data伪指令用来定义程序的数据段,程序的变量需要在该伪指令下定义。汇编程序会分配和初始化变量的存储空间。,.text伪指令用来定义程序的代码段。,.global伪指令声明某一个符号为全局变量,全局符号可被其他的符号引用。,MIPS汇编程序框架,30,北方工业大学信息学院,数据段,MIPS汇
9、编程序框架,31,北方工业大学信息学院,数据段,(1)var1:.word 3#声明一个 word 类型的变量 var1,同时给其赋值为 3(2)array1:.byte a,b#声明一个存储2个字符的数组array1,并赋值 a,b(3)array2:.space 40#为变量 array2 分配 40字节(bytes)未使用的连续空间(4)str1:.ascii“Hello worldn”#声明一段字符串,内容为:”Hello worldn”,数据声明的格式为:变量名:数据类型 变量值,MIPS汇编程序框架,32,北方工业大学信息学院,代码段,MIPS指令的基本格式如下:标号:操作符 操作
10、数#注释 其中标号部分可选,用于标记内存地址,若定义标号则后面必须添加冒号。操作符用于定义操作(如add,sub等)。操作数:用于指明操作需要的数据。可以是寄存器、内存变量或常数。大多数指令有3个操作数。,MIPS汇编程序框架,33,北方工业大学信息学院,系统调用Syscall,.data#数据段str:.asciiz Hello MIPS Assmbly!n#定义字符串str.text#代码段 la$a0,str#将str的地址赋给寄存器$a0 li$v0,4#将寄存器$v0赋值为4 syscall#调用syscall,打印字符串str li$v0,10#将寄存器$v0赋值为10 sysca
11、ll#调用syscall,退出程序,MIPS汇编程序框架,34,北方工业大学信息学院,系统调用Syscall,MIPS汇编程序框架,35,北方工业大学信息学院,【例5-2】程序的功能是从键盘读出一个字符并显示,试用MIPS汇编语言写出。,data#数据段 msg_read:.asciiz Give number:#定义字符串msg_read msg_print:.asciiz nNumber=#定义字符串msg_print.text#代码段 la$a0,msg_read#将msg_read地址赋给寄存器$a0 li$v0,4#将寄存器$v0赋值为4 syscall#调用syscall,输出字符
12、串msg_read li$v0,5#将寄存器$v0赋值为5 syscall#调用syscall,读取一个整型 move$t1,$v0#将寄存器$v0的值赋给寄存器$t1 li$v0,4#将寄存器$v0赋值为4 la$a0,msg_print#将msg_ print地址赋给寄存器$a0 syscall#调用syscall,输出字符串msg_ print li$v0,1#将寄存器$v0赋值为1 move$a0,$t1#将寄存器$t1的值赋给寄存器$a0 syscall#调用syscall,打印一个整型 li$v0,10#将寄存器$v0赋值为10 syscall#调用syscall,退出程序,5.4
13、 MARS调试工具介绍,MIPS模拟器,37,北方工业大学信息学院,MARS是MIPS Assembler and Runtime Simulator(MIPS汇编器和运行时模拟器)的缩写能够运行和调试MIPSMARS采用JARA开发,需要JARA运行库http:/courses.missouristate.edu/KenVollmar/MARS/轻量级的IDE,只有4M,MIPS模拟器界面,38,北方工业大学信息学院,32个寄存器,代码编辑区,运行情况和结果显示,代码段,数据段,存储器空间使用约定,39,北方工业大学信息学院,.datastr:.asciiz HelloMIPS Assmbl
14、y!n,.text.globl main main:,la$a0,strli$v0,4,syscallli$v0,10 syscall,0 x00400000,0 x10010000,0 x10040000,0 x7fffeffc,保留,系统内存区,栈,静态数据,正文(指令),动态数据(堆),课后作业,40,北方工业大学信息学院,1.MIPS指令分为R、I、J三种类型的指令,下列关于MIPS指令格式的描述中,正确的是()(多选)A、指令长度固定B、操作码字段长度固定C、指令中寄存器字段长度固定 D、立即数字段长度固定2、下列关于 MIPS 寻址的下列描述中,正确的是()(多选)A、相对寻址时,将32位地址左移两位的目的是为了实现按32位整数边界对齐存放B、伪直接寻址时,26位直接地址左移两位的目的是为了使32位地址的低两位为0,实现按32位的整数边界对齐存放C、立即数寻址时,指令中的立即数直接送给指令中指定的寄存器D、MIPS指令中不单独设置寻址方式字段,THANK YOU,