- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]第3章微处理器及其系统2
(2) CALL 过程名 这是无条件调用过程指令。 为便于模块化设计,往往把程序中某些具有独立功能的部分编写成独立的程序模块,一般称之为子程序。子程序结构相当于高级语言中的过程,所以,“过程”即“子程序”; 调用过程也即调用子程序。CALL指令将迫使CPU暂停执行调用程序(或称为主程序)后续的下一条指令(即断点),转去执行指定的过程;待过程执行完毕,再用返回指令RET将程序返回到断点处继续执行。 8086/8088 指令系统中把处于当前代码段的过程称为近过程,用NEAR表示,而把其他代码段的过程称为远过程,用FAR表示。调用过程时,是近过程,只需将当前IP值入栈;如果是远过程,则必须将当前CS和IP的值一起入栈。 CALL指令也有4种不同的寻址方式和4种基本格式。 ① CALL N_PROC N_PROC是一个近过程名,采用段内直接寻址方式。 执行段内直接调用指令CALL时,第1步操作是把过程的返回地址(即调用程序中CALL指令的下一条指令的地址)压入堆栈中,以便过程返回调用程序(主程序)时使用。第2步操作则是转移到过程的入口地址去继续执行。指令中的近过程名将给出目标(转向)地址(即过程的入口地址)。 ②CALL BX 这是一条段内间接寻址的调用过程指令,事先已将过程入口的偏移地址置入BX寄存器中。在执行该指令时,调用程序将转向由BX寄存器的内容所指定的某内存单元。 ③CALL F_PROC F_PROC是一个远过程名,它可以采用段间直接和段间间接两种寻址方式来实现调用过程。在段间调用的情况下,则把返回地址的段地址和偏移地址先后压入堆栈。 CALL IPH IPL 代码段 数据段 对于 CALL WORD PTR [SI]这条指令 若:(DS) = 8000H,(SI) = 1200H 则指令操作图示如下。 81200H 81201H (SS段) (SP) 低地址 高地址 (IPL) (IPH) (SP) 段内间接调用示意图 段间直接调用与段间间接调用的应用示例 【例3.75】 有一条段间直接调用指令CALL 2000H:5600H,调用的段地址为2000H,偏移地址为5600H。执行该指令后,调用程序将转移到物理地址为25600H的过程入口去继续执行。 【例3.76】 有一条段间间接调用指令CALL DWORD PTR [DI],调用地址在DI、DI+1、DI+2、DI+3所指的4个连续内存单元中,前2个字节为偏移地址,后2个字节为段地址。若DI=0AH,DI+1=45H,DI+2=00H,DI+3=63H,则执行该指令后,将转移到物理地址为6750AH的过程入口去继续执行。 CALL 代码段 数据段 IPH IPL CSH CSL [DI] [DI]+1 [DI]+2 [DI]+3 段间间接调用示意图 CALL DWORD PTR [DI] (SS段) (SP) 低地址 高地址 (SP) (SP) (IPL) (IPH) (CSL) (CSH) ④RET 弹出值 从过程返回(RET)指令应安排在过程的出口即过程的最后一条指令处。功能是从堆栈顶部弹出由CALL指令压入的断点地址值,迫使CPU返回到调用程序的断点去继续执行。 RET指令与CALL指令相呼应,CALL指令安排在调用过程中,RET指令安排在被调用的过程末尾处。并且,为了能正确返回,返回指令的类型要和调用指令的类型相对应。 在8086/8088指令系统中,段内返回与段间返回的指令形式是一样的,都是RET,但它们的指令代码却不同,段内返回指令的代码为C3H(或C2H),而段间返回指令的代码为CBH(或CAH)。 跳转指令 主程序 IP 继续执行 主程序 执行子程序 转子程序 压栈 出栈 返回主程序 (a) 段内子程序调用 IP(下) 保存原来IP值,IP赋新值 RET:恢复IP原来的值 IP赋新值 cs:100 mov ax,1234h cs:103 mov bx,2345h cs:106 call sub1 cs:109 mov dx,cx cs:10B nop cs:200 sub1: add ax,bx cs:202 mov cx,ax cs:204 ret 假设SS=1100H, SP=100H,观察堆栈区及IP指针的变化。 低地址 (SP)=100H 高地址 (SP)=0FEH 进栈方向 执行CALL SUB1 指令后, 原来IP值109H入栈, IP赋新值200H。 09 低地址 高地址 01
文档评论(0)