用call和ret实现子程序
来源:互联网 发布:吉布提军事基地 知乎 编辑:程序博客网 时间:2024/05/17 07:10
ret和call是另外两种转移指令,它们与jmp的主要区别是,它们还包含入栈和出栈的操作。具体的原理如下:
ret操作相当于:pop ip(直接将栈顶元素赋值给ip寄存器)
call s的操作相当于:push ip
jmp s(先将ip的值压栈,再跳转)
retf的操作相当于:pop ip
pop cs
call dword ptr s相当于:push cs
push ip
这两组指令为我们编写含子函数的程序提供了便利,一般的格式如下:
main:
………
call s
…….. a
s: ……..
call s1
………. b
ret
s1: ……….
call s2
……… c
ret
s2: ……… d
call s3
ret
s3: ……..
ret
分析以上的程序,假设call的下一条指令的偏移地址分别为:a、b、c、d
随着程序的执行,ip指向call指令,CPU将这条指令放入指令缓冲器,执行上一条指令,然后ip指向下一条指令,ip = a。执行call指令,根据call的原理先执行a入栈,此时栈中的情况如下
然后跳转到s,执行到call指令处时,ip = b,b首先入栈,然后跳转到s1
执行到s1处的call指令时,ip = c,c入栈,然后跳转到s2
执行到s2处的call指令时,ip = d,d入栈,然后跳转到s3
执行到s3处的ret指令时,栈顶元素出栈,ip = d,程序返回到s2中,到ret时,ip = c,程序返回到s1,再次执行ret,ip = b,程序返回到s,执行ret,ip = a,程序返回到main中,接下来正常执行main中的代码,知道整个程序结束。
- 用call和ret实现子程序
- 汇编语言子程序调用call和ret
- 十八、使用call和ret指令实现子程序的调用和返回
- 170411 PyQt5-控件透明,汇编-call和ret配合、子程序
- 十九、用call和ret指令实现模块化程序设计
- 关于CALL和RET
- call和ret
- CALL和RET指令
- call和ret指令
- call 和 ret 指令
- CALL和RET指令
- call命令和ret命令来实现子模块调用
- ret和call的原理
- 汇编语言--call和ret指令
- call指令和ret指令
- call和ret指令用法
- call和ret指令(8086)
- 汇编学习笔记--CALL和RET指令
- 【java基础】转发&&重定向
- BZOJ 1012 单调队列+二分
- Linux下进程间通信--管道通信
- C语言读取配置文件以及128字节对齐.bin配置文件
- JavaScript语言的数据类型
- 用call和ret实现子程序
- C++中的权限问题
- 10.15
- 二十五岁,给自己的人生第一课(敬业)
- 7E解一元二次方程
- 1619-7 张良 十月二十三号总结 [连续第二十三天]
- 文件操作函数(3)
- 10.16
- 调试Segmentation Fault错误