使用call和ret实现汇编中的子程序
本文由发表于7年前 | 汇编语言 | 暂无评论 |  被围观 7,569 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 Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2011 4/18
文章评论
    没有评论
给我留言

有人回复时邮件通知我
汇编语言的相关文章
随机文章 本月热门 热评
1 对象引用循环导致的 net.sf.json.JSONException: There is a cycle in the hierarchy 2013/5/30
2 为什么API文档如此重要 2013/1/12
3 来自《Effective Java》的57条程序设计建议 2012/9/24
4 org.hibernate.id.IdentifierGenerationException错误解决方法 2011/10/2
5 Linux下find,sed,tr,grep,cut,wc等常用命令的使用和相关实例解析 2011/6/10
6 Java多线程FAQ汇总 2012/3/6
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

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

联系我们:admin@itzhai.com

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