模块化程序设计
- 调用子程序:cal指令
- 返回:ret指令
- 示例
mov ax,0
call s
mov ax,4cOOh
int 21h
s:add ax,1
ret ;返回call s 的下一句
- 实质:流程转移指令,它们都修改IP,或同时修改CS和IP
call指令
-
字面意思:调用子程序
-
实质︰流程转移
- call指令实现转移的方法和jmp指令的原理相似
-
格式:call标号
-
CPU执行call指令,进行两步操作∶
- 将当前的IP或CS和IP压入栈中
- 转移到标号处执行指令。
-
call标号
- 16位位移“标号”处的地址– call指令后的第一个字节的地址
- 16位位移的范围为-32768~32767,用补码表示
- 16位位移由编译程序在编译时算出。
指令“call far ptr标号”实现的是段间转移
-
CPU执行“call far ptr标号”时的操作
-
(sp)=(sp)-2_
((ss)×16+(sp)=(CS)(sp)=(sp)-2
((ss)×16+(sp))=(IP) -
(CS)=标号所在的段地址
(IP)=标号所在的偏移地址
-
-
"call far ptr标号”相当于
push CS
push IP
jmp far ptr 标号 -
call标号类似"jmp near ptr 标号”,对应的机器指令中为相对于当前IP的转移位移,**而不是转移的目的地址,**实现段内转移。
-
指令“call far ptr 标号”实现的是段间转移!
转移地址在寄存器中的call指令
-
指令格式
- call 16位寄存器
-
功能
- (sp)=(sp)-2
- ((ss)*16+(sp))=(IP)
- (IP)=(16位寄存器)
-
相当于进行
- push IP
- jmp 16位寄存器
转移地址在内存中的call指令
- call word ptr内存单元地址
- 相当于:
- push lP
- jmp word ptr 内存单元地址
mov sp,10h
mov ax,0123h
mov ds:[0],ax
call word ptr ds:[0]
执行后,(IP)=0123H,(sp)=OEH
- call dword ptr内存单元地址
- 相当于
- push s
- push P
- jmp dword ptr 内存单元地址
mov sp,10h
mov ax,0123h
mov ds:[0],ax
mov word ptr ds:[2],0
call dword ptr ds:[0]
执行后,(CS)=0,(IP)=0123H,(sp)=OCH
返回指令:ret和retf
-
ret指令
- 用栈中的数据,修改IP的内容,从而实现近转移;
-
retf指令
- 用栈中的数据,修改CS和IP的内容,从而实现远转移;