汇编基础教程(二)——常用汇编指令之其他指令

原文地址:http://www.tinpont.com/knowledge/assembly_instruction_others.html

-----------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------------------------

最后一篇关于汇编指令的文章,介绍一下剩余的常用汇编指令。除了之前提到的指令,剩下还有三个指令,分别是nop控制令、call函数调用指令和ret函数返回指令。


NOP控制令(no operation)


此指令除了占用1个字节内存空间、消耗1个指令时间外,没有任何作用,通常用于修改汇编指令后的空间对齐。格式如下:
1
NOP    // 此指令将不会影响任何东西,占用内存空间大小为一字节



CALL函数调用指令(call)


此指令先将下一条指令地址先PUSH到堆栈,然后跳转到目标地址。格式如下:
1
CALL dst

dst可以是寄存器、立即数和地址,此指令相当于PUSH指令与JMP指令的结合,例如:
1
2
3
0085BD30 CALL 0085BD3A    // 执行后地址0085BD35压入堆栈,ESP寄存器减四
0085BD35 MOV EAX,1    // 此处被跳过
0085BD3A MOV EAX,2    // 执行CALL后跳转到此处,最后EAX寄存器值为2



RET/RETN/RETF函数返回指令(return/return near/return far)


此指令先POP栈顶一个4字节数,然后跳转到此地址。格式如下:
1
RET

此指令相当于POP指令与JMP指令的结合,例如:
1
2
3
4
0085BD44 PUSH 0085BD4F    // 地址压栈
0085BD49 RETN    // 先POP,再跳转到POP的地址
0085BD4A MOV EAX,1    // 因为跳转到0x0085BD4F,所以此条指令将被跳过
0085BD4F MOV EAX,2    // 最后执行此指令,EAX寄存器的值为2



因为函数相关指令比较重要,所以最后我们再看一段代码熟悉一下:
1
2
3
4
5
6
0085BD60 CALL 0085BD6C    // 1、执行后PUSH了0x0085BD65并且跳转到0x0085BD6C
0085BD65 MOV EAX,1    // 4、跳转到此处后,寄存器EAX赋值为1
0085BD6A JMP SHORT 0085BD72    // 5、代码继续执行到此处,跳转到0x0085BD72
0085BD6C MOV EAX,2    // 2、寄存器EAX首先赋值为2
0085BD71 RETN    // 3、执行POP,数据为刚才PUSH的0x0085BD65,跳转到此地址
0085BD72 MOV EAX,3    // 6、最后代码运行到此处,寄存器EAX赋值为3
-----------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------------------------

这一系列教程就收藏到这里,我非常喜欢这个博主的排版~~所以以后就偷偷拿来用了。。。以后学会了,我也自己做一个~

原文地址:https://www.cnblogs.com/xiaowangba/p/6314757.html