怎么用汇编把一串大写字母变为小写字母?

2025-05-17 03:20:47
推荐回答(2个)
回答1:

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>

回答2:

; 本程序通过编译,运行正确
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 ;编译到此结束