文档详情

MIPS汇编.pptx

发布:2016-12-04约4.97千字共21页下载文档
文本预览下载声明
MIPS汇编汇编语言指令格式: [标签:]操作符[操作数] [#注释]标签:可选 标记内存地址,必须跟冒号 通常在数据和代码段出现操作符: 定义操作(如add,sub等)操作数: 指明操作需要的数据 可以是寄存器、内存变量或常数 大多数指令有3个操作数 L1:addiu $t0,$t0,1MIPS汇编程序框架.data伪指令 定义程序的数据段,程序的变量需要在该伪指令下定义,汇编程序会分配和初始化变量的存储空间.text伪指令 定义程序的代码段.global伪指令 声明一个符号位全局的,全局符号可以被其他的文件引用,用该伪指令声明一个程序的main过程寻址直接寻址 la $t0,var1 把var1在主存中的地址拷贝到寄存器t0。var1可以是标签地址间接寻址 lw $t2,($t0) 把t0存放的地址处的字拷贝到t2中 sw $t2,($t0) 把t2中的字存储到t0中地址所指向的主存位置基址寻址 lw $t2,4($t0) 把t0中地址加4所得的地址所对应的主存中的字载入寄存器t2中,4为偏移量数据定义 [名字:]伪指令 初始值[,初始值]….数据定义的例子:跳转(绝对地址)指令:JAL(Iump-and-Link):调用指令 jal label #$31=PC+8,jump 在$ra=PC+8中保存返回地址并跳转到相应的过程JR(Jump Register):返回指令 jr Rs #PC=Rs,将控制转移到任意地址 跳转到在寄存器Rs(PC=Rs)中存储的地址所在指令 j label #只能到达2^28个字节的页内指令 目标地址的高4位是当前PC的高4位值 JALR(Jump-and-Link Register) jalr Rd,Rs #Rd=PC+8,PC=Rs 在Rd=PC+8中存储返回地址,跳转到寄存器Rs(PC=Rs)中存储的地址所在过程,地址仅在运行时可知分支(PC相对寻址)指令:PC+labelb label goto labelbeq s,t,label if(s==t)goto labelbeql s,t,label if(s==t)goto label)beq可能分支变体,仅当分支放生时才执行延迟槽指令beqz s,label if(s==0)goto label,可能分支变体beqzlbgez s,label if(s=0)goto labelbgtz s,label if(s0)goto labelbne s,t,label if(s!=t)goto label,可能分支变体bnelbnez s,label if(s!=0)goto label,可能分支变体bnezlblez s,label if(s=0)goto label),可能分支变体blezlbltz s,label if(s0)goto label),可能分支变体bltzl存储器访问lw t,addr t=*((int *)addr),32位加载,64位CPU上符号扩展lwl t,addr 向左加载一个字,非对齐加载lwr t,addr 向右加载一个字lh d,addr 16位加载,符号扩展到整个寄存器,d=*((signed short *)addr)lhu d,addr 16位加载,零扩展到整个寄存器,d=*((unsigned short *)addr)lbu d,addr 8位加载,零扩展到整个寄存器,d=*((unsigned char *)addr)lb d,addr 8位加载,符号扩展到整个寄存器,d=*((signed char *)addr)lwc2 cd ,addr 32位加载到协处理器2寄存器,如果实现了的话,很少见lwxc1 fd,t(b) 采用索引(寄存器+寄存器)地址加载32位浮点,常写为l.s,fd=*((float *(t+b)li d,j 将常数j的值放入到寄存器d中lui t,u (Load Upper Immediat)上位加载立即数(常数u符号扩展到64位寄存器),t=u16ldc1 d,addr 64位加载协处理器1(浮点)寄存器,常写成l.dldc2 d,addr 64位加载协处理器2寄存器,如果采用了协处理器2并且宽度为64位的话ll(load linked)和sc(store conditional)组成原子操作: ll d,off(b) …… sc t,off(b) ll从内存读取一个字,以实现接下来的RMW操作,sc向内存中写入一个字,以完成前面的RMW操作。“ll d,off(b)”指令执行后,处理器会记住ll操作,“sc t,off(b)”会检查上次ll指令执行后的RMW操作是否是原子操作(不存在其他对这个地址的操作),若是,t的值会被
显示全部
相似文档