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

来源:互联网 发布:js表单重置的方法 编辑:程序博客网 时间:2024/04/29 01:07
设有下面一段子程序:
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
1 0