汇编语言-王爽编程
能够修改IP,或者同时修改CS和IP的指令统称为转移指令
转移指令就是能够控制CPU执行内存中某处代码的指令模块化
call 和 ret指令都是转移指令,都修改IP, 或者同时修改CS和IP,它们常常被共同用于实现子程序的设计。spa
ret指令用栈中的数据,修改IP的内容,实现近转移;
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;设计
CPU执行ret指令,至关于进行:
pop IPblog
实际变动为:
(IP) = ( (ss)*16 + (sp) )
(sp) = (sp) + 2内存
CPU执行retf指令,至关于进行:
pop IP
pop CSget
实际变动为:it
(IP) = ( (ss)*16 + (sp) )
(sp) = (sp) + 2
(CS) = ( (ss)*16 + (sp) )
(sp) = (sp) + 2程序设计
CPU执行call指令时候,进行两步操做:
(1)将当前的IP或者CS和IP压入栈中;
(2)转移class
call指令不能实现短转移
call和ret指令共同支持了汇编语言编程中的模块化设计,在实际的编程中,程序的模块化必不可少,
由于现实问题比较复杂,对现实问题进行分析,须要将其转化成为相互联系、不一样层次的子问题,这是必须解决的方式,利用call和ret指令,能够用简洁的方法,实现多个相互联系、功能独立的子程序,用于解决一个复杂的问题。
子程序中使用的寄存器,极可能在主程序中也要使用,形成了寄存器使用上的冲突
如何避免这种冲突呢?可能存在如下两个方案:
(1)在编写子程序的程序时候,注意查看子程序中有没有用到会产生冲突的寄存器,若是有,调用者使用别的寄存器;
(2)在编写子程序时候,不要使用会产生冲突的寄存器
分析两个方案的可行性:
(1)这将给调用子程序的程序的编写形成很大的麻烦,由于必需要当心检查子程序中是否有将产生冲突的寄存器,例如:若是子程序中使用了寄存器bx和cx,则主程序(调用者)不能使用bx, cx寄存器
(2)该方案不能实现,由于编写子程序的时候,没法知道未来的调用状况
上面的设想都不可行,咱们但愿:
(1)编写调用子程序的程序的时候,没必要关心子程序到底使用了哪些寄存器;
(2)编写子程序的时候,没必要关心调用者使用了哪些寄存器;
(3)不会发生寄存器冲突
解决问题的简洁方法是:在子程序开始将子程序中全部用到的寄存器的内容都保存起来,在子程序返回前再恢复,可使用栈来保存寄存器中的内容