Call指令和Ret指令讲解04 - 零基础入门学习汇编语言51
2011-01-28 00:26
661 查看
第十章:Call指令和Ret指令讲解04
让编程改变世界Change the world by program
批量数据的传递
前面的例程中,子程序cube只有一个参数,放在bx中。如果有两个参数,那么可以用两个寄存器来放,可是如果需要传递的数据有3个、4个或更多直至N个,我们怎样存放呢?寄存器的数量终究有限,我们不可能简单地用寄存器来存放多个需要传递的数据。对于返回值,也有同样的问题。
在这种时候,我们将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。
对于具有批量数据的返回结果,也可用同样的方法。
接下来我们来看下具体的落实……
编程:将data段中的字符串转化为大写。
[codesyntax lang="asm"]assume cs:code data segment db 'conversation' data ends code segment start: …… code ends end start
[/codesyntax]
我们看一个例子,设计子程序
功能:将一个全是字母的字符串转化为大写。子程序
[caption id="attachment_377" align="aligncenter" width="300"]
![](https://oscdn.geek-share.com/Uploads/Images/Content/201101/76937cb4aed3cf91cf22a37f6137109a.gif)
将一个全是字母的字符串转化为大写[/caption]
源程序代码
[codesyntax lang="asm"]
assume cs:code data segment db 'conversation' data ends code segment start: mov ax,data mov ds,ax mov si,0 ;ds:si指向字符串(批量数据)所在空间的首地址 mov cx,12 ;cx存放字符串的长度 call capital mov ax,4c00h int 21h capital: and byte ptr [si],11011111b inc si loop capital ret code ends end start
[/codesyntax]
注意:除了寄存器、内存传递参数外,还有一种通用的方法使用栈来传递参数。关于这种技巧请参看附注4。
寄存器冲突的问题
设计一个子程序:
功能:将一个全是字母,以0结尾的字符串,转化为大写。程序要处理的字符串以0作为结尾符,这个字符串可以如下定义:db ‘conversation’,0
分析分析~
应用这个子程序 ,字符串的内容后面定要有一个0,标记字符串的结束。子程序可以依次读取每个字符进行检测,如果不是0,就进行大写的转化,如果是0,就结束处理。由于可通过检测0而知道是否己经处理完整个字符串 ,所以子程序可以不需要字符串的长度作为参数。我们可以直接用jcxz来检测0。
子程序实现代码:
[caption id="attachment_378" align="aligncenter" width="300"]![](https://oscdn.geek-share.com/Uploads/Images/Content/201101/a5dcc3fd026819eaaf71a1d08109da88.gif)
将一个全是字母,以0结尾的字符串,转化为大写[/caption]
子程序的应用
将data段中字符串全部转化为大写[codesyntax lang="asm"]
assume cs:code data segment db ‘word',0 db ‘unix',0 db ‘wind',0 db ‘good',0 data ends
[/codesyntax]
完整的程序代码(源代码下载)
问题10.2
前面的程序在思想上完全正确,但在细节上却有些错误,把错误找出来。提示:问题在于cx的使用
实验十 编写子程序
1. 显示字符串
2. 解决除法溢出问题
3. 数值显示
连续三道题都有点难度,大家慎重斟酌!记住,没有过不去的坎!!坚持下来就是成功!!
[buy] 获得所有教学视频、课件、源代码等资源打包 [/buy]
[Downlink href='http://kuai.xunlei.com/d/LUCRGIHFRQNB']视频下载[/Downlink]
相关文章推荐
- Call指令和Ret指令讲解04 - 零基础入门学习汇编语言51
- Call指令和Ret指令讲解06 - 零基础入门学习汇编语言53
- Call指令和Ret指令讲解06 - 零基础入门学习汇编语言53
- Call指令和Ret指令讲解03 - 零基础入门学习汇编语言50
- Call指令和Ret指令讲解03 - 零基础入门学习汇编语言50
- Call指令和Ret指令讲解05 - 零基础入门学习汇编语言52
- Call指令和Ret指令讲解01 - 零基础入门学习汇编语言48
- Call指令和Ret指令讲解05 - 零基础入门学习汇编语言52
- Call指令和Ret指令讲解01 - 零基础入门学习汇编语言48
- Call指令和Ret指令讲解02 - 零基础入门学习汇编语言49
- Call指令和Ret指令讲解02 - 零基础入门学习汇编语言49
- 寄存器(内存访问)04 - 零基础入门学习汇编语言16
- 内中断04 - 零基础入门学习汇编语言63
- 寄存器(内存访问)04 - 零基础入门学习汇编语言16
- 数据处理的两个基本问题04 - 零基础入门学习汇编语言41
- 内中断04 - 零基础入门学习汇编语言63
- 寄存器(CPU工作原理)04 - 零基础入门学习汇编语言09
- 数据处理的两个基本问题04 - 零基础入门学习汇编语言41
- 寄存器(CPU工作原理)04 - 零基础入门学习汇编语言09
- [BX]和loop指令04 - 零基础入门学习汇编语言26