call和ret指令用法

call和ret都是转移指令,它们都可以修改IP或者同时修改CS:IP,它们被共同用来实现子程序的设计


ret和retf区别

ret是用栈中的数据修改IP的值,实现近转移(段内转移)

retf是用栈中的数据修改cs:IP的值,实现远转移(段间转移)

1cpu执行ret时,执行以下操作

(IP)=((ss)*16+(sp)) (sp)=(sp)+2

相当于pop ip

2cpu执行retf时,执行以下操作

(IP)=((ss)*16+(sp)) (sp)=(sp)+2

(CS)=((ss)*16+(sp)) (sp)=(sp)+2

相当于POP IP和POP CS



call指令:cpu执行call时执行以下操作

1将当前IP或CS和IP压入栈中,PUSH IP 或者 PUSH IP   PUSH  CS 

2转移(jmp)

call不能实现段内短转移(就是jmp short),除此之外,call实现转移方法和jmp原理相同


ccall 标号  功能:将当前IP压栈后,转到标号处执行

cpu执行call时,执行以下操作、

1 (sp)=(sp)-2 ((ss)*16+(sp))=(ip)

相当于 push ip

2(IP)=(IP)+16位位移

相当于jmp near ptr 标号

注意:压栈的IP是call指令的下一条指令(参考cpu执行指令的过程,指令放入缓冲区,cpu指向下一条指令)

实验如下程序证明:

assume cs:code
code segment
	start:mov ax,0
	      call S
	      inc ax
	    S:pop ax
	      add ax,ax
	      pop bx
	
	      mov ax,4c00h
	      int 12h				 	  	 		
code ends
end start

程序如图:


pop ax时 ax的值是0006,ip=0006时是inc ax的指令


call far ptr 标号 功能:将当前CS和IP压栈

cpu执行这种格式的call指令时执行以下操作

1 (sp)=(sp)-2 ((ss)*16+(sp))=(cs)

相当于 push cs

(sp)=(sp)-2 ((ss)*16+(sp))=(ip)

相当于pus ip

2(cs)=标号所在的段地址(cs)(IP)=标号所在的偏移地址(IP)

相当于jmp far ptr 标号



call 16位寄存器 功能:将当前ip入栈,ip=16位寄存器

cpu执行这种格式的call指令时执行以下操作

(ip)=(sp)-2 ((ss)*16+(sp))=(ip

相当于 puship

2 (ip)=(16位寄存器)

相当于jmp 16位寄存器



call word ptr 内存单元地址

汇编解释:1 push ip 2 jmp word ptr 内存单元地址(ip=内存单元的数据)

calldword ptr 内存单元地址

汇编解释:1 push cspush ip2jmp dword ptr 内存单元地址(cs=内存单元高位的数据 ip=内存单元低位的数据)内存单元地址cs放在高位地址,ip放在地位地址



一个具有一定功能的程序段为子程序(函数),在需要的时候用call执行,用ret返回,call对应ret

实现程序如下:

assume cd:code
data segment
	db 'ILoveProgramming'
data ends


code segment
	  start:mov ax,data
			mov ds,ax
			mov si,0	;用si指向数据的首地址
			mov cx,16	;数据长度16
			call capital 	;调用转换字符大小的子程序
			mov ax,4c00h
			int 21h
			
	capital:and byte ptr [si],11011111b
			inc si
			loop capital	
			ret		;循环结束后回到call指令的下一条指令继续执行
code ends
end start













  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值