data segment ;数据段定义
BUFF db 10, ?, 10 dup(?) ;最多接收10个字符,最后的回车算一个字符
DOLLAR db ? ;多预留一个字节,最后加'$'符号(虽然不一定会加在这)
data ends
code segment
assume cs:code,ds:data ;约定段地址
start:
mov ax,data
mov ds,ax ;把数据段地址告诉ds
mov dx,offset BUFF
mov ah,0ah
int 21h ;上述3句调用10号DOS中断,输入字符串
mov si,offset BUFF+1 ;BUFF+1保存的就是真是输入的字符数
xor cx,cx ;cx清零
mov cl,[si] ;设置循环次数
lp:
inc si ;si自增
mov al,[si] ;把si地址指向的字节传给al
cmp al,'A'
jb next ;如果小于'A'则跳转
cmp al,'Z'
ja next ;如果大于'Z'则跳转
add al,20h ;在'A'~'Z'范围内,加20h变成小写
mov [si],al ;赋回给内存空间
next:
loop lp
mov byte ptr [si+1],'$' ;字符串最后加个'$'便于用9号功能输出
mov ah,2 ;换行开始
mov dl,0ah
int 21h
mov dl,0dh
int 21h ;换行
mov dx,offset BUFF+2
mov ah,9
int 21h ;调用9号DOS中断,显示首地址为DS:DX的字符串
mov ah,4ch
int 21h ;程序正常退出
code ends
end start
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
附上文字版结果,截图在参考资料上
C:\Users\ADMINI~1\Desktop>masm 1.asm;
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.
50186 + 397942 Bytes symbol space free
0 Warning Errors
0 Severe Errors
C:\Users\ADMINI~1\Desktop>link 1.obj;
Microsoft (R) Overlay Linker Version 3.60
Copyright (C) Microsoft Corp 1983-1987. All rights reserved.
LINK : warning L4021: no stack segment
C:\Users\ADMINI~1\Desktop>1
cDXJ132bz
cdxj132bz
C:\Users\ADMINI~1\Desktop>
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
String db 'WELCOME'
N equ $-String
Start: push cs
pop ds ;使数据段与代码段同段
lea si,String ;取字符串地址
mov di,si
mov cx,N ;字符串长度(字符数)
cld
Upper_Down: lodsb ;读入一个字符至al寄存器
or al,20h ;大写变小写
stosb ;保存这个小写字母
mov dl,al
mov ah,2 ;屏幕显示这个字母
int 21h
loop Upper_Down
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束