data segment
;定义字符串缓冲区
;MAXLEN 表示允许输入的最大字符数量
;ACTLEN 表示实际输入的数量
;STR 用于存储输入的字符串
;以下面为例,允许最大输入5个字符,如果STR后面的长度也定义为6,则实际输入的字符数量仅为5,
;因为最后一个字符会用于存储0Dh(回车符号)
;例如:输入"1234",然后回车,此时内存的情况为: 05 00 31 32 33 34 0D
;因此,为了满足实际的最大数量,通常将MAXLEN定义得比实际的多1个。
title1 db "please enter a command$"
title2 db 0AH,0DH,20H,20H,20H,,20H,20H,"1: G to S$"
title3 db 0AH,0DH,20H,20H,20H,,20H,20H,"2: S to G$"
title4 db 0AH,0DH,20H,20H,20H,,20H,20H,"else: quit$"
endl db 0AH,0DH,20H,20H,20H,,20H,20H,"$"
MAXLEN db 19
ACTLEN db 0
STR db 20 dup('')
;提示语句
PROMPT1 db 13,10,"Please input a string:$"
PROMPT2 db 13,10,"Your string is :$"
ends
code segment
main proc far
;设置数据段寄存器
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
lea dx, title1
mov ah, 9
int 21h
lea dx, title2
mov ah, 9
int 21h
lea dx, title3
mov ah, 9
int 21h
lea dx, title4
mov ah, 9
int 21h
lea dx, endl
mov ah, 9
int 21h
mov ah,1
; wait for a command....
int 21h
and al,0fh
mov dh,al
cmp dh,1
jz GTOS
cmp dh,2
jz STOG
jnz exit
GTOS:
call reminder
mov si,0
repeat1:
add STR[si],20h
inc si
mov ax,si
cmp ax,bx
jz output
jmp repeat1
STOG:
call reminder
mov si,0
repeat2:
sub STR[si],20h
inc si
mov ax,si
cmp ax,bx
jz output
jmp repeat2
;--------------------------------------
;此处作转换,即将字符串改为大写或小写
;
;--------------------------------------
reminder proc
;提示输入,提示语句位于ds:dx处
lea dx,PROMPT1
mov ah, 9
int 21h
;调用AH=0ah的21H中断程序,获取输入的字符串
lea dx,MAXLEN
mov ah,0ah
int 21h
;取得实际输入的字符串数目
mov bl,ACTLEN
mov bh,0
;将结尾处改为'$'以便调用AH=09H功能,即输出刚输入的字符串
mov STR[bx],'$'
;输出结果的提示语句
lea dx,PROMPT2
mov ah, 9
int 21h
ret
reminder endp
output:
;输出大小写转换后的字符串
lea dx,STR
mov ah, 9
int 21h
lea dx,endl
mov ah,9
int 21h
;返回继续输入
JMP start
exit:
;返回操作系统
mov ax, 4c00h
int 21h
code ends
end start ; set entry point and stop the assembler.