使用call和ret实现汇编中的子程序
本文由发表于8年前 | 汇编语言 | 暂无评论 |  被围观 6,022 views+

在汇编中,我们可以使用call和ret实现子程序的机制。ret指令使用栈中的数据,修改IP的内容,从而实现近转移。retf指令使用栈中的数据,修CS和IP的内容,从而实现远转移。call指令执行时需要进行两步的操作:① 将当前的IP或CS和IP压入栈中;②转移。

子程序的框架如下:

汇编代码
assume cs:code
code segment
	main: :
		  :
		  call sub1	;调用子程序sub1
		  :
		  :
		  mov ax,4c00h
		  int 21h

	sub1: :	;子程序开始
		  :
		  call sub2	;调用子程序sub2
		  :
		  :
		  ret	;子程序返回

	sub2: :	;子程序sub2开始
		  :
		  ret	;子程序返回
code ends	;结束代码段
end main

以下是一个例子:将一个由字母和以0结尾的字符串,转化为大写。

汇编代码
;说明:将一个由字母和以0结尾的字符串转换为大写
;参数:ds:si指向字符串的首地址
;结果:无返回值
assume cs:code
data segment
	db 'Java',0
	db 'good',0
	db 'unix',0
	db 'yeah',0
data ends

code segment 
	start:mov ax,data
		  mov ds,ax
		  mov bx,0

		  mov cx,4	;循环4次
	    s:mov si,bx	;设置每次循环时的字母所在的偏移地址
	      call capital	;调用capital子程序转换成大写
	      add bx,5	;bx偏移5个字节,转入下一个字符串的循环处理
	      loop s

		  mov ax,4c00h
		  int 21h

  capital:push cx
  		  push si	;子程序中需要使用的寄存器入栈保存

   change:mov cl,[si] ;处理该字符串的字母
  		  mov ch,0
  		  jcxz ok	;如果 (cx)=0 则表示到达字符串的末尾结束处理,退出子程序
  		  and byte ptr [si],11011111b	;and操作转换字母为大写
  		  inc si	;si加1
  		  jmp short change	;跳到change继续处理

  	   ok:pop si	
  	      pop cx	;si,cx出栈恢复原来的值
  	      ret	;返回子程序继续处理
code ends

end start

关于字母大小写的转换的方法,参考本站的另外一篇文章:汇编中的大小写字母转换的方法

除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/achieved-using-the-call-and-ret-in-the-compilation-routine.html
关键字: ,
arthinking 指弹吉他 && 技术 more
分享到:
 
2011 4/18
文章评论
    没有评论
给我留言

有人回复时邮件通知我
汇编语言的相关文章
随机文章 本月热门 热评
1 数据结构笔记 – 排序算法 希尔排序算法 2011/9/21
2 MyEclipse中修改CSS样式不起作用的解决方法 2011/6/4
3 Javascript笔记 – Javascript中的JSON和对象 2012/5/22
4 JVM笔记 – 高效并发(Java内存模型与线程) 2015/3/1
5 Javascript笔记 – Javascript中的变量 2012/5/22
6 为交换机进行端口安全的配置 2011/5/20
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
猜您喜欢
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.