汇编学习笔记

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. 学习基础知识:了解计算机体系结构、寄存器、内存和指令集等基础概念是必要的。可以先阅读相关的书籍或在线教程,掌握这些基本概念。 2. 掌握汇编语言的语法和指令集:每种计算机体系结构都有自己的汇编语言语法和指令集。选择一种你感兴趣的体系结构(如x86、ARM等),并学习它的汇编语言。 3. 练习编写和调试汇编代码:通过编写简单的汇编代码来熟悉语法和指令集。使用调试器来单步执行代码并观察寄存器和内存的变化。 4. 分析已编译程序:选择一个目标程序进行逆向分析。使用反汇编器将程序转换为汇编代码,并分析代码的逻辑和功能。这有助于理解程序的结构和运行过程。 5. 使用调试器进行动态分析:通过调试器来动态地执行程序,并观察程序在运行时的行为。使用断点、内存查看器和寄存器查看器等工具来分析程序的状态和数据。 6. 学习逆向工程工具和技术:了解常用的逆向工程工具和技术,如IDA Pro、OllyDbg、Ghidra等。掌握这些工具的使用可以提高你的逆向分析能力。 7. 参考优秀资源:阅读与逆向工程和汇编语言相关的书籍、论文和博客,关注相关的社区和论坛。与其他逆向工程师交流经验也是很有帮助的。 记住,逆向工程是一个需要耐心和实践的过程。持续学习和实践将帮助你提高逆向分析的技能。祝你在学习汇编语言和逆向工程的过程中取得好成果!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值