奥普瓯江 发表于 2019-2-23 15:30:04

实验11

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

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

codesg segment
begin:
                mov ax, datasg
                mov ds, ax
                mov si, 0
                call letterc
               
                mov ax, 4c00h
                int 21h
               
letterc:
                mov cx, 0
                mov cl, byte ptr ds:;把ds:中的数据传给cl数据库中定位的是db所以按照字节传送
                cmp cl, 64      ;ACII码表上的10进位64是@
                ja one_1                ;大于并且不等于,限定跳转的范围,只有ASCII码64以后的才会产生跳转
               
                jcxz end_1            ;如果ds:中传给cx的是0那么此程序结束跳转到最后ret
ok:               
                inc si
                jmp short letterc
one_1:
                and cl, 11011111b ;转换cl中的数据用and 1和1转换等于1 0和1转换等于0 0和0等于0
                mov byte ptr ds:, cl   ;把cl中的数据再次传给数据段datasg中替换掉小写字母
                jmp short ok
end_1:
                ret
               
               
codesg ends
end begin

nihility_z 发表于 2019-8-20 11:51:00

lz的代码第19行和29行masm编译器不认吧,前面已经有一个cl限定了是八位的数据了,就不用再加一个byte ptr了?
然后letterc段定位的时候要有个上限比较好吧,ASCII码里在小写字母之后可还有东西吧。
and。。。。si默认段地址在ds中。。。。。也不用?
不知道说的对不对哦,可能可以更精简一些呢~~~
页: [1]
查看完整版本: 实验11