首页 > 代码库 > 汇编中利用堆栈进行现场保护与恢复
汇编中利用堆栈进行现场保护与恢复
设有下面一段子程序:
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
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
汇编中利用堆栈进行现场保护与恢复
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。