CALL和RET指令

CALL和RET指令


1.ret和retf指令

补充:call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP

  1. ret指令用栈中的数据,修改IP的内容,从而实现近转移
  2. retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移
  3. CPU执行ret指令时,相当于进行: pop IP
    1. (IP) = ( (ss) * 16 + (sp) )
    2. (sp) = (sp) + 2
  4. CPU执行retf指令时,相当于进行:pop IP, pop CS
    1. (IP) = ( (ss) * 16 + (sp) )
    2. (sp) = (sp) + 2
    3. (CS) = ( (ss) * 16 + (sp) )
    4. (sp) = (sp) + 2
assume cs:code 
stack seqment
	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 ;ax入栈
		mov bx, 0
		ret ;ret指令执行后,(IP)=0,CS:IP指向代码段的第一条指令。可以push cs  push ax  retf
code ends
end start

2.call指令

call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作:

  1. 将当前的IP或CS和IP压入栈中
  2. 转移(jmp)

call指令不能实现短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同:

  1. call 标号(近转移):CPU执行此种格式的call指令时,相当于进行 push IP jmp near ptr 标号

  2. call far ptr 标号(段间转移):CPU执行此种格式的call指令时,相当于进行:push CS,push IP jmp far ptr 标号

  3. call 16位寄存器:CPU执行此种格式的call指令时,相当于进行: push IP jmp 16位寄存器

  4. call word ptr 内存单元地址:CPU执行此种格式的call指令时,相当于进行:push IP jmp word ptr 内存单元地址

    mov sp, 10h
    mov ax, 0123h
    mov ds:[0], ax
    call word ptr ds:[0]
       
    ;执行后,(IP)=0123H,(sp)=0EH
    
  5. call dword ptr 内存单元地址:CPU执行此种格式的call指令时,相当于进行:push CS push IP 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)=0CH
    

3.call和ret的配合使用

;call和ret的配合使用案例
    
assume cs:code
code segment
start:	mov ax,1
	    mov cx,3
     	call s ;1)CPU指令缓冲器存放call指令,IP指向下一条指令(mov bx, ax),执行call指令,IP入栈,jmp
     	
	    mov bx,ax	;4)IP重新指向这里  bx = 8
     	mov ax,4c00h
     	int 21h
     s: add ax,ax
     	loop s;2)循环3次ax = 8
	    ret;3return : pop IP
code ends
end start
            
;call 与 ret 指令共同支持了汇编语言编程中的模块化设计
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值