汇编学习笔记

image-20221016142140834

MPIS指令

MIPIS寄存器功能定义&汇编表示

image-20221016144745034

image-20221016150016486

MPIS指令格式

image-20221016143356490

image-20221016143737843

汇编形式与指令的对应

image-20221016144149066

image-20221016144222280

数据转移指令

image-20221016151558831

SW:转换的是int型的

SH:转换的是short型的

SB:转换的是char型的

且通过指令的操作码确认此次 转移数据的大小是什么单位的

而x86体系结构是根据操作数直接声明的

基地址

image-20221016152702320

按字编址,一个int变量32位占4个字节即为一个数组元素所占空间,所以这时应该加的偏移量是 4 ∗ 8 = 32 4*8=32 48=32

变址寄存器

image-20221026153324266

$1:g $5:i $3:基址

1:$6=4

2-3:$7=i*4

4:$4=基址+(i*4)

5:$4号寄存器一次间址,将内容放会$4寄存器中

6:g=g+$4号寄存器中的内容

7:i++

移位指令

image-20221017142647880

image-20221026150923809

MPIS指令执行过程

image-20221016145633898

image-20221016145653748

程序调用

临时寄存器是调用程序保存的;保存寄存器由被调用程序保存。

call\return\jump

image-20221026155525112

解释:

call 对应 jump and link

​ jal 10000 #将下一条要执行的指令地址放到31号寄存器中$31=PC + 4 ;然后跳转指令执行地址到10000去执行

return 对应 jump register

​ jr $31 #指令跳转到31寄存器中的地址去执行,即返回到上次函数调用的下一条指令地址

无条件转移指令 jump

j 10000 直接跳转到10000地址去执行指令

branch/compare

image-20221026171436951

image-20221026171539039

Example :if-then-else 语句和“=”判断

image-20221026171752110

Example:“less than”判断

image-20221026171928920

**Example:Loop循环 **

image-20221026172808284

指令功能应用实例
LB从存储器中读取一个字节的数据到寄存器中LB R1, 0(R2)
LH从存储器中读取半个字的数据到寄存器中LH R1, 0(R2)
LW从存储器中读取一个字的数据到寄存器中LW R1, 0(R2)
LD从存储器中读取双字的数据到寄存器中LD R1, 0(R2)
L.S从存储器中读取单精度浮点数到寄存器中L.S R1, 0(R2)
L.D从存储器中读取双精度浮点数到寄存器中L.D R1, 0(R2)
LBU功能与LB指令相同,但读出的是不带符号的数据LBU R1, 0(R2)
LHU功能与LH指令相同,但读出的是不带符号的数据LHU R1, 0(R2)
LWU功能与LW指令相同,但读出的是不带符号的数据LWU R1, 0(R2)
SB把一个字节的数据从寄存器存储到存储器中SB R1, 0(R2)
SH把半个字节的数据从寄存器存储到存储器中SH R1,0(R2)
SW把一个字的数据从寄存器存储到存储器中SW R1, 0(R2)
SD把两个字节的数据从寄存器存储到存储器中SD R1, 0(R2)
S.S把单精度浮点数从寄存器存储到存储器中S.S R1, 0(R2)
S.D把双精度数据从存储器存储到存储器中S.D R1, 0(R2)
DADD把两个定点寄存器的内容相加,也就是定点加DADD R1,R2,R3
DADDI把一个寄存器的内容加上一个立即数DADDI R1,R2,#3
DADDU不带符号的加DADDU R1,R2,R3
DADDIU把一个寄存器的内容加上一个无符号的立即数DADDIU R1,R2,#3
ADD.S把一个单精度浮点数加上一个双精度浮点数,结果是单精度浮点数ADD.S F0,F1,F2
ADD.D把一个双精度浮点数加上一个单精度浮点数,结果是双精度浮点数ADD.D F0,F1,F2
ADD.PS两个单精度浮点数相加,结果是单精度浮点数ADD.PS F0,F1,F2
DSUB两个寄存器的内容相减,也就是定点数的减DSUB R1,R2,R3
DSUBU不带符号的减DSUBU R1,R2,R3
SUB.S一个双精度浮点数减去一个单精度浮点数,结果为单精度SUB.S F1,F2,F3
SUB.D一个双精度浮点数减去一个单精度浮点数,结果为双精度浮点数SUB.D F1,F2,F3
SUB.PS两个单精度浮点数相减SUB.SP F1,F2,F3
DDIV两个定点寄存器的内容相除,也就是定点除DDIV R1,R2,R3
DDIVU不带符号的除法运算DDIVU R1,R2,R3
DIV.S一个双精度浮点数除以一个单精度浮点数,结果为单精度浮点数DIV.S F1,F2,F3
DIV.D一个双精度浮点数除以一个单精度浮点数,结果为双精度浮点数DIV.D F1,F2,F3
DIV.PS两个单精度浮点数相除,结果为单精度DIV.PS F1,F2,F3
DMUL两个定点寄存器的内容相乘,也就是定点乘DMUL R1,R2,R3
DMULU不带符号的乘法运算DMULU R1,R2,R3
MUL.S一个双精度浮点数乘以一个单精度浮点数,结果为单精度浮点数DMUL.S F1,F2,F3
MUL.D一个双精度浮点数乘以一个单精度浮点数,结果为双精度浮点数DMUL.D F1,F2,F3
MUL.PS两个单精度浮点数相乘,结果为单精度浮点数DMUL.PS F1,F2,F3
AND与运算,两个寄存器中的内容相与ANDR1,R2,R3
ANDI一个寄存器中的内容与一个立即数相与ANDIR1,R2,#3
OR或运算,两个寄存器中的内容相或ORR1,R2,R3
ORI一个寄存器中的内容与一个立即数相或ORIR1,R2,#3
XOR异或运算,两个寄存器中的内容相异或XORR1,R2,R3
XORI一个寄存器中的内容与一个立即数异或XORIR1,R2,#3
BEQZ条件转移指令,当寄存器中内容为0时转移发生BEQZ R1,0
BENZ条件转移指令,当寄存器中内容不为0时转移发生BNEZ R1,0
BEQ条件转移指令,当两个寄存器内容相等时转移发生BEQ R1,R2
BNE条件转移指令,当两个寄存器中内容不等时转移发生BNE R1,R2
J直接跳转指令,跳转的地址在指令中J name
JR使用寄存器的跳转指令,跳转地址在寄存器中JR R1
JAL直接跳转指令,并带有链接功能,指令的跳转地址在指令中,跳转发生时要把返回地址存放到R31这个寄存器中JAL R1 name
JALR使用寄存器的跳转指令,并且带有链接功能,指令的跳转地址在寄存器中,跳转发生时指令的放回地址放在R31这个寄存器中JALR R1
MOV.S把一个单精度浮点数从一个浮点寄存器复制到另一个浮点寄存器MOV.S F0,F1
MOV.D把一个双精度浮点数从一个浮点寄存器复制到另一个浮点寄存器MOV.D F0,F1
MFC0把一个数据从通用寄存器复制到特殊寄存器MFC0 R1,R2
MTC0把一个数据从特殊寄存器复制到通用寄存器MTC0 R1,R2
MFC1把一个数据从定点寄存器复制到浮点寄存器MFC1 R1,F1
MTC1把一个数据从浮点寄存器复制到定点寄存器MTC1 R1,F1
LUI把一个16位的立即数填入到寄存器的高16位,低16位补零LUI R1,#42
DSLL双字逻辑左移DSLL R1,R2,#2
DSRL双字逻辑右移DSRL R1,R2,#2
DSRA双字算术右移DSRA R1,R2,#2
DSLLV可变的双字逻辑左移DSLLV R1,R2,#2
DSRLV可变的双字罗伊右移DSRLV R1,R2,#2
DSRAV可变的双字算术右移DSRAV R1,R2,#2
SLT如果R2的值小于R3,那么设置R1的值为1,否则设置R1的值为0SLT R1,R2,R3
SLTI如果寄存器R2的值小于立即数,那么设置R1的值为1,否则设置寄存器R1的值为0SLTI R1,R2,#23
SLTU功能与SLT一致,但不带符号SLTU R1,R2,R3
SLTUI功能与SLT一致,但不带符号SLTUI R1,R2,R3
MOVN如果第三个寄存器的内容为负,那么复制一个寄存器的内容到另外一个寄存器MOVN R1,R2,R3
MOVZ如果第三个寄存器的内容为0,那么复制一个寄存器的内容到另外一个寄存器MOVZ R1,R2,R3
TRAP根据地址向量转入管态
ERET从异常中返回到用户态
MADD.S一个双精度浮点数与单精度浮点数相乘加,结果为单精度
MADD.D一个双精度浮点数与单精度浮点数相乘加,结果为双精度
MADD.PS两个单精度浮点数相乘加,结果为单精度


指令功能应用实例
lb/lh/lw从存储器中读取一个byte/half word/word的数据到寄存器中如 lb 1,0(2)
sb/sh/sw把一个byte/half word/word的数据从寄存器存储到存储器中如 sb 1,0(2)
add/addu把两个定点寄存器的内容相加add 1,2,3(1=2+3);u为不带符号加。
addi/addiu把一个寄存器的内容加上一个立即数add 1,2,#3(1=2+3);u为不带符号加。
sub/subu把两个定点寄存器的内容相减。
div/divu两个定点寄存器的内容相除。
mul/mulu两个定点寄存器的内容相乘。
and/andi与运算,两个寄存器中的内容相与and 1,2,3(1=2 &3);i为立即数。
or/ori或运算。
xor/xori异或运算。
beq/beqz/benz/bne条件转移eq相等,z零,ne不等。
j/jr/jal/jalrj直接跳转;jr使用寄存器跳转;
lui把一个16位的立即数填入到寄存器的高16位,低16位补零。
sll/srl逻辑左移/右移sll 1,2,#2。
slt/slti/sltui如果2的值小于3,那么设置1的值为1,否则设置1的值为0。slt 1,2,$3。
mov/movz/movn复制,n为负,z为零。mov 1,2; movz 1,2,3(3为零则复制2到1)。
trap根据地址向量转入管态。
eret从异常中返回到用户态。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值