注册 登录
编程论坛 汇编论坛

汇编新手提问——小写字母转大写

zz199200 发布于 2013-10-06 16:03, 847 次点击
DATAS SEGMENT
    string db 13,10,'please enter a character:',13,10,'$'
    buf     db 2
            db '?'
            db 2 dup(?)
DATAS ENDS

STACKS SEGMENT
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX   
    lea dx,string            ;提示输入小写字母
    mov ah,9
    int 21h   
    lea dx,buf                ;输入字母
    mov ah,10
    int 21h   
    and dl,0dfh                ;转换                           
    mov ah,2                ;输出字母
    int 21h
    mov ah,4ch
    int 21h
CODES ENDS
    END START

结果总是黑三角。。。本人菜鸟,大家给点帮助吧
8 回复
#2
zz1992002013-10-06 16:14
感觉buf定义错了,在cv下dx总是1E,buf该怎么改呢
#3
Explorerlxz2013-10-06 18:06
程序代码:
DATAS SEGMENT
    string db 13,10,'please enter a character:',13,10,'$'
    buf     db 2
            db '?'
            db 2 dup(?)
DATAS ENDS

STACKS SEGMENT
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX   
    lea dx,string            ;提示输入小写字母
    mov ah,9
    int 21h   
    lea dx,buf                ;输入字母
    mov ah,10
    int 21h
    lea si,buf+2
    mov dl,[si]
    sub dl,20h                ;转换  
    mov ah,2                ;输出字母
    int 21h
    mov ah,1
    int 21h
    mov ah,4ch
    int 21h
CODES ENDS
    END START

我看了看网上别的程序改了改!具体原因现在还不清楚,不过可以肯定,你缓冲区没定义错误
#4
Explorerlxz2013-10-06 18:40
buf     db 2            ;用户定义存放2字节的缓冲区
            db '?'       ;系统填入实际输入字符字节数
            db 2 dup(?)  ;存放输入字节的ASCII码值

我们输出的是缓冲区的第三个字节的大写字母,
 lea si,buf+2                  ;指向第三个字符
    mov dl,[si]                ;读入dl中
    sub dl,20h                ;转换(不知楼主的and dl,0dfh有何深意,如果你想这样转换好像也应该用and dl,5fh吧
后面的  
mov ah,1
int 21h
是我自己加的,在Masmplus中程序一闪而过,我让它停一下,不加也罢
#5
zz1992002013-10-07 16:02
回复 4楼 Explorerlxz
的确是转换程序错了,输入的ASCII码只有八位,应该用dl进行转换操作,多谢大神
(ps:应该是and 5fh,我打错了~)
#6
zz1992002013-10-07 16:23
回复 4楼 Explorerlxz
但我想不通为什么加buf+2尼?
#7
Explorerlxz2013-10-07 17:28
buf     db 2            ;用户定义存放2字节的缓冲区
            db '?'       ;系统填入实际输入字符字节数
            db 2 dup(?)  ;存放输入字节的ASCII码值
你定义的缓冲区是什么意思总该知道吧!如果你直接取buf所在位置的字节时取到的是缓冲区的第一个字节2,
buf+2代表缓冲区第三个字节,即db 2 dup(?)中第一个字符,代表输入字符的ASCII码,所以……
#8
zz1992002013-10-08 10:52
回复 7楼 Explorerlxz
哦,非常感谢
#9
mfwwxd2013-10-17 21:45
非常感谢
1