反汇编RETN 0x0c的理解
来源:互联网 发布:hp智能扫描软件 编辑:程序博客网 时间:2024/05/01 12:54
1.CALL指令:
CALL指令可不是如唤指令,而是子程序调用指令。那么汇编语言中的子程序是什么呢?子程序能被其它程序调用,在实现某种功能后能自动返回到调用程序去的程序。其最后一条指令一定是返回指令,故能保证得新返回到调用它的程序中去。也可调用其它子程序,甚至可自身调用。
我们可以暂时把子程序理解为一个代码段,是一个模块化的代码面。这个代码段可以完成某一特定功能,当程序在执行过程中需要用到这一功能,将会进入这个代码段。这块代码段执行完毕后,会跳出这块代码段。而进入代码段这一过程就是子程序的调用,也就是这里所说的CALL指令所要完成的工作。
反汇编经常看到的CALL指令的基本格式如下:
CALL 地址1
功能:调用地址1处的子程序
CALL指令分为两种情况,一种是段内转移;另一种是段间转移。这两种情况类似于JMP指令的相对跳转和绝对跳转(只不过相对跳转的JMP指令会有short标识)。
在CALL指令进行的是段内转移的情况时,跟在CALL后面的地址1为一个相对位移;而CALL指令进行的是段间转移的情况时,跟在CALL后面的地址1为一个绝对内存地址。
(1)段内转移的CALL指令等价于两条指令:
push eip
jmp 目的位置
也就是说,执行段内转移的CALL指令时,相当于先后执行以上两条指令。
(2)段间转移的CALL指令等价于三条指令:
push CS
push eip
jmp 目的位置
2.RETN/RETF指令:
按照前面讲CALL指令举的那个例子,CALL指令是进入子程序的指令,而例子中所说的跳出子程序这一过程也需要2条指令,它们是RETN/RETF。
RETN/RETF是跳出子程序的指令,被称为返回指令。RETN指令用于从段内转移CALL进的子程序中返回;RETF指令用于从段间转移CALL进的子程序中返回。
RETN/RETF在反汇编代码中呈现的形式如下:
RETN
RETN 操作数1
RETF
RETF 操作数1
RETN等价于一条指令:POP eip
RETF等价于两条指令:
POP eip
POP CS
CALL指令可不是如唤指令,而是子程序调用指令。那么汇编语言中的子程序是什么呢?子程序能被其它程序调用,在实现某种功能后能自动返回到调用程序去的程序。其最后一条指令一定是返回指令,故能保证得新返回到调用它的程序中去。也可调用其它子程序,甚至可自身调用。
我们可以暂时把子程序理解为一个代码段,是一个模块化的代码面。这个代码段可以完成某一特定功能,当程序在执行过程中需要用到这一功能,将会进入这个代码段。这块代码段执行完毕后,会跳出这块代码段。而进入代码段这一过程就是子程序的调用,也就是这里所说的CALL指令所要完成的工作。
反汇编经常看到的CALL指令的基本格式如下:
CALL 地址1
功能:调用地址1处的子程序
CALL指令分为两种情况,一种是段内转移;另一种是段间转移。这两种情况类似于JMP指令的相对跳转和绝对跳转(只不过相对跳转的JMP指令会有short标识)。
在CALL指令进行的是段内转移的情况时,跟在CALL后面的地址1为一个相对位移;而CALL指令进行的是段间转移的情况时,跟在CALL后面的地址1为一个绝对内存地址。
(1)段内转移的CALL指令等价于两条指令:
push eip
jmp 目的位置
也就是说,执行段内转移的CALL指令时,相当于先后执行以上两条指令。
(2)段间转移的CALL指令等价于三条指令:
push CS
push eip
jmp 目的位置
2.RETN/RETF指令:
按照前面讲CALL指令举的那个例子,CALL指令是进入子程序的指令,而例子中所说的跳出子程序这一过程也需要2条指令,它们是RETN/RETF。
RETN/RETF是跳出子程序的指令,被称为返回指令。RETN指令用于从段内转移CALL进的子程序中返回;RETF指令用于从段间转移CALL进的子程序中返回。
RETN/RETF在反汇编代码中呈现的形式如下:
RETN
RETN 操作数1
RETF
RETF 操作数1
RETN等价于一条指令:POP eip
RETF等价于两条指令:
POP eip
POP CS
而带有操作数的RETN/RETF指令则是在POP之后,执行ESP=ESP+操作数1。
==============================================================================================
call编辑
这个命令是访问子程序的一个汇编基本指令。也许你说,这个我早就知道了!别急请继续看完。
call真正的意义是什么呢?我们可以这样来理解:1.向堆栈中压入下一行程序的地址;2.JMP到call的子程序地址处。例如:
00401029 . E8 DA240A00 call 004A3508
0040102E . 5A pop edx
在执行了00401029以后,程序会将0040102E压入堆栈,然后JMP到004A3508地址处!
RET编辑
与call对应的就是RET了。对于RET我们可以这样来理解:1.将当前的ESP中指向的地址出栈;2.JMP到这个地址。
堆栈平衡原理编辑
如果要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址。
0 0
- 反汇编RETN 0x0c的理解
- 反汇编的call和retn
- 反汇编的call和retn
- 汇编中retn 4的含义详析
- linux反汇编理解
- retn 指令理解
- push 0x******* retn 的应用
- 反汇编反出来的
- 反汇编反出来的
- Cortex-M0反汇编中关于PC的理解
- retn
- 反汇编的学习
- 反汇编的后记
- gdb 的反汇编
- VS的反汇编
- 反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- Java 学习笔记(0x0C) 抽象类
- 从反汇编理解堆栈及printf
- ViewPager绑定ViewPagerIndicator时onPageChangeListener监听不到的问题
- 元首名言的中德对照版本
- linux之syslog
- Git的使用以及GitHub的配置
- Linux查看端口号
- 反汇编RETN 0x0c的理解
- Android Studio Mac 快捷键
- 基于TCP/IP的手机聊天游戏(附带源码和解释)之服务器端类
- Ubuntu
- swift_UIButton
- 主函数与中断函数共享变量问题
- AngularJs的基础——常用指令
- iOS第三方数据库FMDB的使用介绍
- 关于说话