連千荣 發表於 2021-11-4 15:56:18

汇编语言功能字符串大小写转换实现实例详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>问题1:将data段中的第一个字符串转换成大写,第二个字符串转换成小写</li><li>问题2:将data段中每个单词的头一个字母改成大写字母</li><li>问题3:将data段中每个单词改为大写字母</li><li>问题4:将data段中每个单词的前4个字母改为大写字母</li><li>问题5:设计一个子程序,将一个全是字母的字符串转化成大写</li><li>问题6:设计一个子程序,将一个全是字母,以0结尾的字符串,转化成大写</li><li>复杂一点的对结构化数据的版本</li></ul></div><p class="maodian"></p><h2>问题1:将data段中的第一个字符串转换成大写,第二个字符串转换成小写</h2>
<p>分析:</p>
<p>如何转换成大小写</p>
<p>如果利用ASCII码进行转换的话,需要判断该字符是大写还是小写,汇编语言实现太过困难,可以对字符串的二进制进行分析。</p>
<p>在ASCII码中,大写字母的第五位为0,小写字母的第五位为1,可以对位取反进行大小写转换</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code,ds:data
data segment
        db 'BaSiC'
        db 'InfoMaTion'
data ends
;------------------------------------
;做法一
code segment
start:                mov ax,data
                mov ds,ax
                mov bx,0        ;设置ds:bx指向数据段               
                mov cx,5        ;对于第一个字符串进行循环转换
s:                mov al,ds:
                and al,11011111B;将字符的第五位转换成0,转换成大写字母
                mov ds:,al
                inc bx
                loop s
                mov bx,5        ;指向第二个字符串
                mov cx,11
s0:                mov al,ds:
                or al,00100000B          ;将字符的第五位转换成1,转换成小写字母
                mov ds:,al
                inc bx
                loop s
                mov ax,4c00h
                int 21h
code ends
;------------------------------------
;做法二,改进版:利用bx+idata实现代码的简化

code segment
start:                mov ax,data
                mov ds,ax
                mov bx,0
                mov cx,5
s:                mov al,ds:
                and al,11011111b
                mov ds:,al
                mov al,ds:
                or al,00100000b
                mov ds:,al
                inc bx
                loop s
code ends
;------------------------------------
end start</pre>
</div>
<p class="maodian"></p><h2>问题2:将data段中每个单词的头一个字母改成大写字母</h2>
<p>分析: 如何实现循环</p>
<p>该段数据是结构化的数据,则可以看做成一个二维数组,用一个变量定位行,用一个常量定义第一个字母</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code,ds:data
data segment
        db '1. file         '
        db '2. edit         '
        db '3. search       '
data ends
code segment
start:                mov ax,data
                mov ds,ax
                mov bx,0        ;ds:bx指定数据段,同时bx作为定义行的变量
                mov cx,3
s:                mov al,ds:        ;3作为常量,定义第一个字母
                and al,11011111b
                mov ds:,al
                add bx,16
                loop s
                mov ax,4c00h
                int 21h
code ends

end</pre>
</div>
<p class="maodian"></p><h2>问题3:将data段中每个单词改为大写字母</h2>
<p>分析: 1、对于这种结构化的数据,不仅需要一个变量定义行,同时也需要一个变量定义列</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code,ds:data,ss:stack
data segment
        db 'ibm             '
        db 'dec             '
        db 'vax             '
data ends
;--------------------------------------------
;做法一
code segment
start:                mov ax,data
                mov ds,ax
                mov bx,0
                mov cx,3
s0:                mov dx,cx        ;同时使用同一个变量进行循环,需要对外层循环的值保存
                mov si,0
                mov cx,3        ;cx设置成内层循环的次数
s:                mov al,ds:
                and al,11011111b
                mov ds:,al
                inc si               
                loop s
                add bx,16
                mov cx,dx        ;用dx中存放的外层循环恢复外层循环的计数器
                loop s0
                mov ax,4c00h
                int 21h
code ends
;--------------------------------------------
;做法二,利用栈保存外层循环的值
stack segment
        dw 8 dup(0)                ;利用栈段保存cx的值
stack ends
code segment
start:                mov ax,stack
                mov ss,ax
                mov sp,16        ;ss:sp指向栈段
                mov ax,data
                mov ds,ax
                mov bx,0        ;ds:bx指向数据段
                mov cx,3
s0:                push cx
                mov si,0
                mov cx,3
s:                mov al,ds:
                and al,11011111b
                mov ds:,al
                inc si
                loop s
                add bx,16
                pop cx
                loop s0
                mov ax,4c00h
                int 21h
code ends
;--------------------------------------------
end start</pre>
</div>
<p class="maodian"></p><h2>问题4:将data段中每个单词的前4个字母改为大写字母</h2>
<p>分析 如何定位每个字符串的内容</p>
<p>采用bx+si+idata来进行首字母的定位</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code,ds:data,ss:stack
data segment
        db '1. display      '
        db '2. brows      '
        db '3. replace      '
data ends
stack segment
        dw 8 dup(0)
stack ends
code segment
start:                mov ax,stack
                mov ss,ax
                mov sp,16
                mov ax,data
                mov ds,ax
                mov bx,0
                mov cx 3        ;设置外层循环只有3行
s0:                push cx
                mov si,0
                mov cx,4        ;设置内层循环只需4次
s:                mov al,ds:                ;设置需要改变的第一个字母
                and al,11011111b
                mov ds:,al
                inc si
                loop s
                add bx,16
                pop cx
                loop s0
                mov ax,4c00h
                int 21h
code ends

end start</pre>
</div>
<p class="maodian"></p><h2>问题5:设计一个子程序,将一个全是字母的字符串转化成大写</h2>
<p>分析: 子程序的设计需要注意两个问题:字符串的内容和长度</p>
<p>字符串的内容不可能全部放在子程序中,可以考虑在子程序中放入字符串的首地址,利用循环遍历字符串,循环的次数就是字符串的长度</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code,ds:data
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 ds:,11011111b
                        inc si
                        loop capital
                        ret
code ends

end start</pre>
</div>
<p class="maodian"></p><h2>问题6:设计一个子程序,将一个全是字母,以0结尾的字符串,转化成大写</h2>
<p>分析:</p>
<p>1、要处理以0结尾的字符串,需要识别结尾的0</p>
<p>采用jcxz进行判断最后的字符是否是0</p>
<p>2、循环的次数无法知道</p>
<p>所以不能用loop,只能使用jmp跳到循环开始处</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code,ds:data
data segment
        db 'conversation',0
data ends
code segment
start:                        mov ax,data
                        mov ds,ax
                        mov si,0                        ;ds:si指向数据段的开始处
                        call capital
                        mov ax,4c00h
                        int 21h
capital:                mov cl,ds:               
                        mov ch,0
                        jcxz ok                                ;如果字符串为0,则会跳出循环
                        and byte ptr ds:,11011111b
                        inc si
                        jmp short capital                ;跳转实现循环
ok:                        ret                                ;结束循环
code ends
end start</pre>
</div>
<p class="maodian"></p><h2>复杂一点的对结构化数据的版本</h2>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code,ds:data,ss:stack
data segment
        db 'word',0
        db 'unix',0
        db 'wind',0
data ends
stack segment
        db 8 dup(0)
stack ends
code segment
start:                        mov ax,data
                        mov ds,ax
                        mov bx,0
                        mov cx,3                ;外循环实现
s:                        mov si,bx
                        call capital
                        add bx,5                ;内循环的实现
                        loop s
                        mov ax,4c00h
                        int 21h
capital:                push cx
                        push si
change:                        mov cl,ds:
                        mov ch,0
                        jcxz ok
                        and byte ptr ds:,11011111b
                        inc si
                        jmp short change
ok:                        pop si
                        pop cx
                        ret
code ends
end</pre>
</div>
<p>以上就是汇编语言功能大小写转换实现实例详解的详细内容,更多关于汇编语言功能大小写转换的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>ARM汇编解决阶乘及大小写转换的问题</li><li>汇编语言进制转换之16进制转10进制</li><li>使用汇编实现字符串的大小写转换</li><li>汇编语言系列之汇编实现各种码制的转换(思路详解)</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编语言功能字符串大小写转换实现实例详解