原文地址: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
|
这一系列教程就收藏到这里,我非常喜欢这个博主的排版~~所以以后就偷偷拿来用了。。。以后学会了,我也自己做一个~