yuyuhongss 发表于 2011-2-6 21:28:57

实验11

本帖最后由 yuyuhongss 于 2011-2-6 21:35 编辑

我先把题目抄下来:

编写一个程序,将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母,描述如下:
名称:letterc
功能:将以0结尾的字符串中的小写字母转变成大写字母
参数:ds:si指向字符串首地址

应用举例:assume cs:code

data segment
        db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends

code segment

start:
                mov ax,data
                mov ds,ax
                mov si,0
                call letterc
               
                mov ax,4c00h
                int 21h
               
               
letterc:
.
.
.
.
code ends

end start注意需要进行转化的是字符串中的小写字母a~z,而不是其他字符。


为了易读我用了几个子程序分开,不过本质是一样的

偶的代码编译通过,运行没问题:assume cs:code

data segment
        db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends

code segment

start:
                mov ax,data
                mov ds,ax
                mov si,0
                call letterc
               
                mov ax,4c00h
                int 21h
               
               
letterc:
                cmp byte ptr ds:,0
                je ok
                inc si
                       
is_a_to_z:
                cmp byte ptr ds:,61h ;61h为a的ASCII码
                jb letterc
                cmp byte ptr ds:,7ah ;7ah为z的ASCII码
                ja letterc
                       
change:
                mov ax,ds:
                and ax,11011111b ;变为大写字母
                mov ds:,ax ;覆盖原来的
               
                jmp letterc
ok:
                ret
               
code ends

end start不过用Debug单步执行后再查看内存发现,前两个字符可以顺利的变为大写字母,当程序运行到第三次时,也就是处理字符'g'时,竟然在执行 cmp byte ptr ds:,0后执行了je ok,然后就退出了'g'为什么会等于0?。我猜测是我用cmp指令时影响了标志寄存器导致的,望高手不吝赐教!

yuyuhongss 发表于 2011-2-6 22:12:26

终于解决~\(≧▽≦)/~啦啦啦

代码如下:assume cs:code

data segment
        db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends

code segment

start:
                mov ax,data
                mov ds,ax
                mov si,0
                call letterc
               
                mov ax,4c00h
                int 21h
               
               
letterc:
                mov al,ds:
                cmp al,0
                je ok
                inc si
is_a_to_z:
                cmp al,61h ;61h为a的ASCII码
                jb letterc
                cmp al,7ah ;7ah为z的ASCII码
                ja letterc
                       
change:
                dec si
                mov al,ds:
                and al,11011111b ;变为大写字母
                mov ds:,al ;覆盖原来的

                jmp letterc
ok:
                ret
               
code ends

end start变清爽了,而且就是那个si害的,后面加了一句dec si,嘿嘿,只可意会不可言传哦。。

运行效果:

wqs3568 发表于 2011-2-6 22:43:05

楼主很有研究呀

小甲鱼 发表于 2011-2-13 22:16:39

;P自己给解决了

china0008 发表于 2011-2-14 15:02:26

本帖最后由 china0008 于 2011-2-14 15:12 编辑

也晒下我的源码。
顺便说下解题思路,首先要判断某一字节是不是需要我们修改的小写字母。这里通过比较 小写字母的ascii码来解决。这个问题解决,剩下的额就是遵循尽量不要使用对flag有影响的命令即可。assume cs:code
data segment
        db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends

code segment
        begin:
        mov ax,data
        mov ds,ax
        mov si,0
        mov bx,0   ;初始化,用低8位暂存被比较值
        call letterc
       
        mov ax,4c00h
        int 21h
       
        letterc:
        mov bl,
        cmp bl,00h
        je ok;等于0就调到结束处,用于判断字符串的尾部。
        inc si
        cmp bl,61h
        jb letterc
        cmp bl,7ah
        ja letterc
        and bl,11011111b
        mov ,bl
        jmp letterc       
ok:
        ret
       
code ends
end begin
跟楼主的对比了一下,思路完全一样啊。呵呵。

同时号召广大同学向楼主学习,贴贴自己的源码,谢谢自己的学习心得。大家多交流,进步会更快。

三田学校 发表于 2012-7-28 15:10:18

本帖最后由 三田学校 于 2012-7-28 15:24 编辑

我的代码如下:

assume cs:code,ds:data
data segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends
code segment
start:
mov ax,data
mov ds,ax

mov ax,0b878h
mov es,ax

mov si,0
mov di,0

call letterc
mov ax,4c00h
int 21h
letterc:
mov al,
cmp al,0
je exit
cmp al,'a'
jb s0
cmp al,'z'
ja s0
and al,11011111b
mov byte ptr ,al
s0:
;显示白底黑字
mov byte ptr es:,al
mov byte ptr es:1,01110000b
inc si
add di,2
jmp short letterc
exit:
ret
code ends
end start

s0512 发表于 2012-11-12 20:19:26

嗯。。。。AX等于2BYTE,mov ds:,ax的时候,是把0045放进去了,覆盖了原数,第三次LOOP时,检测到0,JMP到OK了。。嘿嘿{:5_109:}

s0512 发表于 2012-11-12 20:22:34

你的逻辑思维GOOD,程序看起来结构性很好,羡慕!!

復襍 发表于 2013-9-19 10:42:18

随便看看,收藏丶东西,这是很好的习惯。

ilboyvm 发表于 2014-10-20 01:30:21

mov运算操作前后操作数必须匹配
页: [1]
查看完整版本: 实验11