本章是介绍call和ret指令,它们都是转移指令,都修改IP,或者同时修改CS和IP。它们经常被共同用来实现子程序的设计,本章内容属于汇编语言中实现子程序的基础。 由于内容也很复杂,故一步一步进行解析。
一、ret和retf指令
这两个指令相对简单:
1、ret指令用栈中的数据,修改IP的内容,从而实现近转移
CPU执行ret指令时,相当于进行:pop IP。
而栈中的数据,则由((ss)*16+(sp))决定,即:
(IP)=((ss)*16+(sp)),并且指令指针寄存器sp要自加2,即:(sp)=(sp)+2。
当然,这些操作会由CPU在执行ret指令时自动完成。
2、retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移
CPU执行retf指令时,相当于进行:
pop IP
pop CS
同理,在CUP执行reft时,会进行下面4步操作:
1)(IP)=((ss)*16+(sp))
2)(sp)=(sp)+2
3)(CS)=((ss)*16+(sp))
4)(sp)=(sp)+2
也就是说,当IP指向栈底的sp、在CUP执行reft时,会将栈底的第一个字单元的内容,出栈后赋值给IP,然后将栈底的第二个字单元的内容,赋值给CS,从而改变CS和IP的内容。
所谓的“实现近转移”(ret指令)和“实现远转移”(retf指令),区别就在于,ret指令只修改IP,而retf指令既要修改IP,还要修改CS。
二、call指令
call指令相对复杂,从对栈单元内容进行操作(push和pop)的角度来看,实际上ret指令和reft指令是call指令的逆向操作;或者说,在调用子程序的时候,先会用call指令,然后用r

第10章 call和ret指令&spm=1001.2101.3001.5002&articleId=141234983&d=1&t=3&u=a2334ddf769143ab8871bb57bb738d69)
490

被折叠的 条评论
为什么被折叠?



