Call指令和Ret指令讲解04 – 零基础入门学习汇编语言51

第十章:Call指令和Ret指令讲解04

让编程改变世界

Change the world by program

批量数据的传递

前面的例程中,子程序cube只有一个参数,放在bx中。如果有两个参数,那么可以用两个寄存器来放,可是如果需要传递的数据有3个、4个或更多直至N个,我们怎样存放呢?

寄存器的数量终究有限,我们不可能简单地用寄存器来存放多个需要传递的数据。对于返回值,也有同样的问题。

在这种时候,我们将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。

对于具有批量数据的返回结果,也可用同样的方法。

接下来我们来看下具体的落实……

编程:将data段中的字符串转化为大写。

assume cs:code

data segment

    db 'conversation'

data ends

code segment

start:

    ……

code ends

end start

我们看一个例子,设计子程序

功能:将一个全是字母的字符串转化为大写。

子程序

宽客网,量化投资,宽客俱乐部

将一个全是字母的字符串转化为大写

源程序代码

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

注意:除了寄存器、内存传递参数外,还有一种通用的方法使用栈来传递参数。关于这种技巧请参看附注4。

寄存器冲突的问题

设计一个子程序:

功能:将一个全是字母,以0结尾的字符串,转化为大写。

程序要处理的字符串以0作为结尾符,这个字符串可以如下定义:db ‘conversation’,0

分析分析~

应用这个子程序 ,字符串的内容后面定要有一个0,标记字符串的结束。子程序可以依次读取每个字符进行检测,如果不是0,就进行大写的转化,如果是0,就结束处理。

由于可通过检测0而知道是否己经处理完整个字符串 ,所以子程序可以不需要字符串的长度作为参数。我们可以直接用jcxz来检测0。

子程序实现代码:

宽客网,量化投资,宽客俱乐部

将一个全是字母,以0结尾的字符串,转化为大写

子程序的应用

将data段中字符串全部转化为大写

assume cs:code

data segment

    db ‘word',0

    db ‘unix',0

    db ‘wind',0

    db ‘good',0

data ends

完整的程序代码(源代码下载)

问题10.2

前面的程序在思想上完全正确,但在细节上却有些错误,把错误找出来。

提示:问题在于cx的使用

实验十 编写子程序

  1. 显示字符串
  2. 解决除法溢出问题
  3. 数值显示

连续三道题都有点难度,大家慎重斟酌!

记住,没有过不去的坎!!坚持下来就是成功!!

视频下载
技术, IT技术, 汇编语言, 视频教程

原文发布于宽客论坛,点击阅读原文



                                                    风险提示及免责条款

市场有风险,投资需谨慎。本文不构成个人投资建议,也未考虑到个别用户特殊的投资目标、财务状况或需要。用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部