阅读 413

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

这篇文章主要为大家介绍了汇编语言功能大小写转换实现的实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

目录
  • 问题1:将data段中的第一个字符串转换成大写,第二个字符串转换成小写

  • 问题2:将data段中每个单词的头一个字母改成大写字母

  • 问题3:将data段中每个单词改为大写字母

  • 问题4:将data段中每个单词的前4个字母改为大写字母

  • 问题5:设计一个子程序,将一个全是字母的字符串转化成大写

  • 问题6:设计一个子程序,将一个全是字母,以0结尾的字符串,转化成大写

  • 复杂一点的对结构化数据的版本

问题1:将data段中的第一个字符串转换成大写,第二个字符串转换成小写

分析:

如何转换成大小写

如果利用ASCII码进行转换的话,需要判断该字符是大写还是小写,汇编语言实现太过困难,可以对字符串的二进制进行分析。

在ASCII码中,大写字母的第五位为0,小写字母的第五位为1,可以对位取反进行大小写转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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:[bx]
        and al,11011111B  ;将字符的第五位转换成0,转换成大写字母
        mov ds:[bx],al
        inc bx
        loop s
        mov bx,5    ;指向第二个字符串
        mov cx,11
s0:     mov al,ds:[bx]
        or al,00100000B   ;将字符的第五位转换成1,转换成小写字母
        mov ds:[bx],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:[bx]
        and al,11011111b
        mov ds:[bx],al
        mov al,ds:[bx+5]
        or al,00100000b
        mov ds:[bx+5],al
        inc bx
        loop s
code ends
;------------------------------------
end start

问题2:将data段中每个单词的头一个字母改成大写字母

分析: 如何实现循环

该段数据是结构化的数据,则可以看做成一个二维数组,用一个变量定位行,用一个常量定义第一个字母

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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:[bx+3]    ;3作为常量,定义第一个字母
        and al,11011111b
        mov ds:[bx+3],al
        add bx,16
        loop s
        mov ax,4c00h
        int 21h
code ends
  
end

问题3:将data段中每个单词改为大写字母

分析: 1、对于这种结构化的数据,不仅需要一个变量定义行,同时也需要一个变量定义列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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:[bx+si]
        and al,11011111b
        mov ds:[bx+si],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:[bx+si]
        and al,11011111b
        mov ds:[bx+si],al
        inc si
        loop s
        add bx,16
        pop cx
        loop s0
        mov ax,4c00h
        int 21h
code ends
;--------------------------------------------
end start

问题4:将data段中每个单词的前4个字母改为大写字母

分析 如何定位每个字符串的内容

采用bx+si+idata来进行首字母的定位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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:[bx+si+3]     ;设置需要改变的第一个字母
        and al,11011111b
        mov ds:[bx+si+3],al
        inc si
        loop s
        add bx,16
        pop cx
        loop s0
        mov ax,4c00h
        int 21h
code ends
  
end start

问题5:设计一个子程序,将一个全是字母的字符串转化成大写

分析: 子程序的设计需要注意两个问题:字符串的内容和长度

字符串的内容不可能全部放在子程序中,可以考虑在子程序中放入字符串的首地址,利用循环遍历字符串,循环的次数就是字符串的长度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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:[si],11011111b
            inc si
            loop capital
            ret
code ends
  
end start

问题6:设计一个子程序,将一个全是字母,以0结尾的字符串,转化成大写

分析:

1、要处理以0结尾的字符串,需要识别结尾的0

采用jcxz进行判断最后的字符是否是0

2、循环的次数无法知道

所以不能用loop,只能使用jmp跳到循环开始处

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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:[si]     
            mov ch,0
            jcxz ok             ;如果字符串为0,则会跳出循环
            and byte ptr ds:[si],11011111b
            inc si
            jmp short capital           ;跳转实现循环
ok:         ret             ;结束循环
code ends
end start

复杂一点的对结构化数据的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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:[si]
            mov ch,0
            jcxz ok
            and byte ptr ds:[si],11011111b
            inc si
            jmp short change
ok:         pop si
            pop cx
            ret
code ends
end

以上就是汇编语言功能大小写转换实现实例详解的详细内容

原文链接:https://blog.csdn.net/hc1151310108/article/details/82732303


文章分类
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐