实验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指令时影响了标志寄存器导致的,望高手不吝赐教! 终于解决~\(≧▽≦)/~啦啦啦
代码如下: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,嘿嘿,只可意会不可言传哦。。
运行效果:
楼主很有研究呀 ;P自己给解决了 本帖最后由 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: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
嗯。。。。AX等于2BYTE,mov ds:,ax的时候,是把0045放进去了,覆盖了原数,第三次LOOP时,检测到0,JMP到OK了。。嘿嘿{:5_109:} 你的逻辑思维GOOD,程序看起来结构性很好,羡慕!! 随便看看,收藏丶东西,这是很好的习惯。 mov运算操作前后操作数必须匹配
页:
[1]