王爽《汇编语言》 第10章 call和ret指令.ppt
文本预览下载声明
第10章 call和ret指令 * ret和 retf 指令 call指令 ret和call指令配合完成子程序调用 mul乘法指令 模块化程序设计 一、返回指令ret和retf 格式:ret ;实现近转移,相当于pop ip 格式:retf; 实现远转移,相当于pop ip ,pop cs assume cs:code stack segment db 16 dup(0) stack ends code segment mov ax,4c00h int 21h start: mov ax,stack mov ss,ax mov sp,16 mov ax,0 push ax mov bx,0 ret code ends end start assume cs:code stack segment db 16 dup(0) stack ends code segment mov ax,4c00h int 21h start: mov ax,stack mov ss,ax mov sp,16 mov ax,0 push cs push ax mov bx,0 retf code ends end start 一、返回指令ret和retf 格式:ret ;实现近转移,相当于pop ip 格式:retf; 实现远转移,相当于pop ip ,pop cs 例10-1.补全程序,实现从内存1000:0处开始执行指令。 assume cs:code stack segment db 16 dup(0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax, push ax mov ax, push ax retf code ends end start ret和retf指令执行时,将当前堆栈内容分别出栈给 ip 或 ip和cs,以实现指令的近或远转移。 二、call指令 执行call指令的功能相当于: 1、push ip或push cs、push ip; 2、修改当前ip或ip和cs指向目的地址。 Call指令的主要格式: 根据位移转移 转移的目的地址在指令中 转移地址在寄存器中 转移地址在内存中 1、依据位移进行转移的call指令 格式: call 标号 功能:将当前IP压栈,IP=IP+16位的位移量,转移到标号处执行。 例10-2 下面的程序执行后,AX中的数值为多少? 内存地址 机 器 码 汇编指令 1000:0 B8 00 00 MOV AX,0 1000:3 E8 01 00 CALL S 1000:6 40 INC AX 1000:7 58 S:POP AX 2、转移的目的地址在指令中的call指令 格式: call far ptr 标号 功能: 将当前CS、IP压栈,用标号所在地址修改CS和IP实现远转移。 例10-3 下面的程序执行后,AX中的数值为多少? 内存地址 机 器 码 汇编指令 1000:0 B8 00 00 MOV AX,0 1000:3 9A 09 00 00 10 CALL FAR PTR S 1000:8 40 INC AX 1000:9 58 S:POP AX ADD AX,AX POP BX ADD AX,BX 3、转移地址在寄存器中的call指令 格式: call reg(16位的寄存器) 功能: 将当前IP压栈,用寄存器中的值修改IP实现近转移。 例10-4 下面的程序执行后,AX中的数值为多少? 内存地址 机 器 码 汇编指令 1000:0 B8 06 00 MOV AX,6 1000:2 FF D0 CALL AX 1000:5 40 INC AX 1000:6 MOV BP,SP ADD AX,[BP] 4、转移地址在内存中的call指令 格式: call word (dword) ptr [内存单元] 功能: 将当前IP或IP、CS压栈,用内存单元中的字或双字修改IP或IP和CS。 mov sp , 10h mov ax , 0123h mov ds:[0] , ax mo
显示全部