已知字符串STRING以‘$’为结束标志;统计其中小写字母的个数,结果送到COUNT单元,并把该字符串中的小写字母变成大写字母,其它字符保持不变。要求分别在屏幕上输出原字符串以及修改后的字符串。

只为记录汇编作业

题目:已知字符串STRING以‘$’为结束标志;统计其中小写字母的个数,结果送到COUNT单元,并把该字符串中的小写字母变成大写字母,其它字符保持不变。要求分别在屏幕上输出原字符串以及修改后的字符串。

代码如下:

;2.已知字符串STRING以‘$’为结束标志;统计其中小写字母的个数,结果送到COUNT单元,
;并把该字符串中的小写字母变成大写字母,其它字符保持不变。
;要求分别在屏幕上输出原字符串以及修改后的字符串。
DATA SEGMENT
    STRING DB '1a2a3aABCabc!@#$' ;定义字符串
    LEN  DB $-STRING             ;len用来记录string长度
    COUNT DB 0                   ;count用来记录小写字母个数  
    CRLF DB 0AH,0DH,"$"          ;回车换行
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA

START:
    MOV AX,DATA
    MOV DS,AX
    
    XOR CX,CX        ;CX初始化
    MOV CL,LEN       ;设置循环次数
    
    LEA DX,STRING    ;使dx指向string初始地址
    MOV AH,09H       ;输出原字符串
    INT 21H
    
    LEA BX,STRING    ;使bx指向string初始地址
X:  MOV AL,[BX]      ;取bx指向地址所在的字符并放入al中
    CMP AL,'a'       ;字符与小写a作比较
    JB NEXT          ;小于则跳转next函数
    CMP AL,'z'       ;字符与小写z作比较
    JA NEXT          ;大于则跳转next函数
    INC COUNT        ;使count自增1
    SUB AL,20H       ;使当前的小写字母变成小写
    MOV [BX],AL      ;把小写字母变成大写
NEXT:
    INC BX           ;使bx指向下一个地址
    LOOP X           ;做循环,cx-1 当cx=0时则退出循环,执行下一条语句
    
    LEA DX, CRLF;回车换行           
    MOV AH, 09H							 
    INT 21H
    
    LEA DX,STRING  ;输出更新后的字符串
    MOV AH,09H
    INT 21H
    
    LEA DX, CRLF;回车换行           
    MOV AH, 09H							 
    INT 21H    
                
    ADD COUNT,30H  ;让count变成ascll码并且输出
    MOV DL,COUNT
    MOV AH,02H
    INT 21H

     
    MOV AH,4CH     ;结束
    INT 21H
CODE ENDS
END START  

以下代码可以输出10个以上的小写字母个数

;2.已知字符串STRING以‘$’为结束标志;统计其中小写字母的个数,结果送到COUNT单元,
;并把该字符串中的小写字母变成大写字母,其它字符保持不变。
;要求分别在屏幕上输出原字符串以及修改后的字符串。
DATA SEGMENT
    STRING DB 'aaaaaaaaaaaaaaaaaaaaaaaaaa!@#$' ;定义字符串 26个a
    LEN  DB $-STRING             ;len用来记录string长度
    COUNT DW 0                   ;count用来记录小写字母个数  
    CRLF DB 0AH,0DH,"$"          ;回车换行
    ANS DB 6 DUP(0)
    TIMES DB 0
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
 
START:
    MOV AX,DATA
    MOV DS,AX
    
    XOR CX,CX        ;CX初始化
    MOV CL,LEN       ;设置循环次数
    
    LEA DX,STRING    ;使dx指向string初始地址
    MOV AH,09H       ;输出原字符串
    INT 21H
    
    LEA BX,STRING    ;使bx指向string初始地址
X:  MOV AL,[BX]      ;取bx指向地址所在的字符并放入al中
    CMP AL,'a'       ;字符与小写a作比较
    JB NEXT          ;小于则跳转next函数
    CMP AL,'z'       ;字符与小写z作比较
    JA NEXT          ;大于则跳转next函数
    INC COUNT        ;使count自增1
    SUB AL,20H       ;使当前的小写字母变成小写
    MOV [BX],AL      ;把小写字母变成大写
NEXT:
    INC BX           ;使bx指向下一个地址
    LOOP X           ;做循环,cx-1 当cx=0时则退出循环,执行下一条语句
    
    LEA DX, CRLF;回车换行           
    MOV AH, 09H							 
    INT 21H
    
    LEA DX,STRING  ;输出更新后的字符串
    MOV AH,09H
    INT 21H
    
    LEA DX, CRLF;回车换行           
    MOV AH, 09H							 
    INT 21H    
                
    XOR AX,AX            ;将count输出
    MOV AX,COUNT         ;将count放入ax中
    XOR BX,BX            ;bx初始化
    MOV BX,10            ;将10放入bx中
    MOV DI,OFFSET ANS    ;使di指向ans头地址
    
F:
    XOR DX,DX     ;dx初始化
    DIV BX        ;ax/bx 因为count是dw类型因此商在AX,余数在DX,这里的余数<=9,因此也在DL
    ADD DL,30H    ;将dl中的0-9变成ascll码里的0-9方便输出
    MOV [DI],DL   ;将dl放入di指向地址的内容里
    INC DI        ;di指针+1
    INC TIMES     ;tiems+1,方便后面的倒叙输出
    CMP AX,0      ;ax和0作比较,如果ax=0则说明已经被除完了
    JNE F         ;如果ax≠0,则跳到f函数
    DEC DI        ;di指针-1,此时指向的是最高位
    XOR CX,CX     ;cx初始化
    MOV CL,TIMES  ;把times给cl方便循环输出
FUNCTION:
    MOV DL,[DI]   ;把dl指向地址的内容给dl,并做dos单字符输出操作
    MOV AH,2
    INT 21H
    DEC DI        ;di指针-1
    LOOP FUNCTION ;cl>0则cl-1并且循环fuction,否则执行下一条语句       
         
    MOV AH,4CH     ;结束
    INT 21H
CODE ENDS
END START  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值