原文地址:http://www.tinpont.com/knowledge/assembly_instruction_others.html
-----------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------------------------
最后一篇关于汇编指令的文章,介绍一下剩余的常用汇编指令。除了之前提到的指令,剩下还有三个指令,分别是nop控制令、call函数调用指令和ret函数返回指令。
NOP控制令(no operation)
此指令除了占用1个字节内存空间、消耗1个指令时间外,没有任何作用,通常用于修改汇编指令后的空间对齐。格式如下:
1
|
NOP
//
此指令将不会影响任何东西,占用内存空间大小为一字节 |
CALL函数调用指令(call)
此指令先将下一条指令地址先PUSH到堆栈,然后跳转到目标地址。格式如下:
dst可以是寄存器、立即数和地址,此指令相当于PUSH指令与JMP指令的结合,例如:
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字节数,然后跳转到此地址。格式如下:
此指令相当于POP指令与JMP指令的结合,例如:
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 |
这一系列教程就收藏到这里,我非常喜欢这个博主的排版~~所以以后就偷偷拿来用了。。。以后学会了,我也自己做一个~