call指令和ret指令

模块化程序设计

  • 调用子程序: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指令,进行两步操作∶

    1. 将当前的IP或CS和IP压入栈中
    2. 转移到标号处执行指令。
  • call标号

    • 16位位移“标号”处的地址– call指令后的第一个字节的地址
    • 16位位移的范围为-32768~32767,用补码表示
    • 16位位移由编译程序在编译时算出。

指令“call far ptr标号”实现的是段间转移

  • CPU执行“call far ptr标号”时的操作

    1. (sp)=(sp)-2_
      ((ss)×16+(sp)=(CS)

      (sp)=(sp)-2
      ((ss)×16+(sp))=(IP)

    2. (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的内容,从而实现远转移;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值