汇编中利用堆栈进行现场保护与恢复

设有下面一段子程序:

mov ah,2

mov dl,13

int 21h

看了就知道上面这段程序是调用了int 21来输出十六进制13。

那么,如果主程序直接这样调用:

mov ax,1

mov dx,1

call 上面的代码

sub ax,1

sub dx,1

可以看出ax,dx初始化的时候就是1,那么虽然程序可以执行成功,但是,到call下面那句就不再是我们主程序所给出的值了,因为子程序也就是上面输出13的那段代码改变了ax和dx的值。

堆栈是内存中的一个特殊区域,可以先把ax和dx放到堆栈,然后再执行完子程序的时候再从堆栈中取出来那么ax和dx值就还是执行子程序前的情况了:(所以可以这样修改上面的那段主要代码段)

mov ax,1

mov dx,1

push ax;把ax放入堆栈

push dx;把dx放入堆栈

call 上面的代码;调用子程序

pop dx;取出堆栈

pop ax;取出堆栈

sub ax,1

sub dx,1

时间: 2024-08-25 17:30:56

汇编中利用堆栈进行现场保护与恢复的相关文章

GCC中的堆栈保护机制

以堆栈溢出为代表的缓冲区溢出已成为最为普遍的安全漏洞,由此引发的安全问题比比皆是.我们知道攻击者利用堆栈溢出漏洞时,通常会破坏当前的函数栈.在gcc中,通过编译选项可以添加 函数栈的保护机制,通过重新对局部变量进行布局来实现,达到监测函数栈是否非破坏的目的. gcc中有3个与堆栈保护相关的编译选项 -fstack-protector:启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码. -fstack-protector-all:启用堆栈保护,为所有函数插入保护代码. -fn

汇编中函数调用时的堆栈结构

call之前会将实参压入堆栈, call的时候会将当前IP,也就是返回地址压入堆栈,然后跳转 跳转到子程序后会, 先把ebp压栈, 然后mov ebp, esp 这样就可以通过ebp来取局部变量 执行完后会有一条leave指令,其实就是 mov esp, ebp pop ebp leave执行完后,就ret ret指令是用栈中的数据,修改IP的内容,从而实现跳转. C类型呢是在call语句后面加一条 add esp, 00000008 而另外两种则是在子程序中利用 ret 0008, 来弹出堆栈

CORTEX-M3中断的现场保护问题

在<Cortex-M3 Devices Generic User Guide.pdf>中介绍了异常入栈和出栈的情况,详见2.3 Exception model.Cortex-M3内核的寄存器如下. 异常发生时,入栈的寄存器是R0~R3+R12+PC+LR+SP.为啥袒护R0‐R3以及R12呢, R4‐R11就是下等公民?(摘自<Cortex-M3权威指南 >第9章) 原来,在ARM上,有一套的C函数调用标准约定(< C/C++ rocedure Call Standard f

VC中利用多线程技术实现线程之间的通信

文章来源:[url]http://www.programfan.com/article/showarticle.asp?id=2951[/url] 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.

汇编中Enter与Leave指令

Enter的作用相当==push ebp和mov ebp,esp 这后面两句大家很熟悉吧?函数开始一般都是这两句 Leave的作用相当==mov esp,ebp和pop ebp 而这后面这两句也很常见,函数调用完后一般的用到 以上的Enter和leave的作用分别函数开始和结束 Win32汇编中局部变量的使用方法可以解释一个很有趣的现象:在DOS汇编的时候,如果在子程序中的push指令和pop指令不配对,那么返回的时候ret指令从堆栈里得到的肯定是错误的返回地址,程序也就死掉了.但在Win32汇

Intent七大属性,Activity的启动方式,横竖屏切换的生命周期,现场保护--&gt;

---------------------------------Intent七大属性------------------------------------- 第一类:启动,有ComponentName(显式),Action(隐式),Category(隐式). 第二类:传值,有Data(隐式),Type(隐式),Extra(隐式.显式). 第三类:启动模式,有Flag. ---------------------------------------Activity的启动方式----------

16位汇编中的伪指令

汇编中的伪指令(基于汇编编译器MASM讲解) 一丶什么是伪指令,以及作用 首先我们用汇编开发效率低,如何才能开发效率高,甚至开发速度比C语言或这个高级语言快 答案: 伪指令 什么是伪指令 伪指令是汇编编译器提供的,比如昨天我们写的汇编代码,假设调用一个Call我们每次都要手工处理 保存栈底,开辟就变量空间,保存寄存器环境....每次都要做,特别麻烦,所以编译器帮我们提供了伪指令,只要我们 按照汇编编译器的语法去写,那么这些汇编编译器则会自动帮我们补全 比如昨天的代码: ;调用开始,把参数压栈 m

内存四域,变量声明和定义,寄存器,c内嵌汇编,auto,堆栈,常量,静态变量

 1.内存四大区域 2.在程序中,变量的声明可以有多份,定义只能有一份 3.寄存器在cpu里面,没有地址 4.c语言内嵌汇编语言 5.auto变量 自动分配内存,自动释放内存. 6.栈的大小由编译器决定 修改栈的方式,右击项目à属性à配置属性à链接器à系统à堆栈保留大小 7.卡死cpu,卡死内存的程序 8.在堆上申请空间后赋值后,不可以释放内容.要通过free方法进行释放对空间. 9.常量字符串在代码区.代码区是智能读的. 10.常量本质 10.静态变量,全局变量的差别 A全局变量可以跨文件

汇编中,BP,SP有何区别?分别怎么使用?

bp寄存器,跟其它什么BX,AX一样的用法, SP是用在栈上的,配合SS使用,像SS:SP SS上放段地址,SP上放偏移地址. 寻址时,像[bp],相当于SS:[bp] 就是说它默认使用SS 像BX默认使用CS---------------------------------------------------ss栈段寄存器sp栈顶指针寄存器bp默认的栈寻址寄存器--------------------------------------------------- sp会随着带有堆栈操作的指令(