汇编语言(Assembly Language)习题:键盘输入一个字符串,试将其中的小写字母转换为大写字母,其它字符保持不变。

1.题目:键盘输入一个字符串,试将其中的小写字母转换为大写字母,其它字符保持不变。

前置知识:汇编语言常用系统功能调用(如果懂直接跳过看题目详解)

1.单字符输入(1号调用)

格式:

         MOV	AH,1
        INT  	21H

功能:从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。

2.单字符显示(2号调用)

格式:

         MOV  DL,待显示字符的ASCII码
        MOV  AH,2
        INT     21H

功能:将DL寄存器中的字符送显示器显示,如果DL中为〈CTRL〉+〈BREAK〉的ASCII码,则退出。

3.打印输出(5号调用)

格式:

         MOV	DL,待打印字符的ASCII码
        MOV	AH,5
        INT	21H

功能:将DL寄存器中的字符送打印机打印。

4.结束调用(4CH号调用)

格式:

         MOV	AH,4CH
        INT	21H

功能:终止当前程序并返回调用程序。

5.显示字符串(9号调用)

格式:

          LEA	DX,待显示字符串首偏移地址
         MOV	AH,9
         INT 	21H

功能:将当前数据区中以‘$’结尾的字符串送显示器显示。

6.字符串输入(10号调用)

格式:

           LEA	DX,缓冲区首偏移地址
           MOV	AH,10
           INT	21H

功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。

3.各步骤详细讲解:

(1)基本框架:

DATAS SEGMENT
    ;此处输入数据段代码 
    string db 10,?,10 dup(?)
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    MOV AH,4CH
     INT 21H  
 
       
    
CODES ENDS
    END START

(2)步骤1:

    mov dx,offset String ;
    mov ah,0ah
    int 21h
    
    mov si,offset String+1  
    mov cx ,0              
    mov cl,[si]

经过常用的系统功能调用知识的回顾不难看出前3行是输入字符串;
第4行把string+1的偏移地址送给si寄存器。
有人问:为什么是string+1?
下面给出一个数据的实例:

buffer	db 81
;定义缓冲区,第1个字节填入可能输入的最大字符数
	db 0
;第2个字节将用于存放实际输入的字符数
	db 81 dup(0)
;第3个字节开始用于存放输入的字符串

10号调用从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。入口参数为DS:DX。
例:从键盘上输入字符串’WELCOME’

DATA SEGMENT 'DATA'
    BUFF DB 10,0,10 DUP(?)
DATA ENDS
CODE SEGMENT 'CODE'
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV DX,OFFSET BUFF
    MOV AH,0AH
    INT 21H
     MOV AH,4CH
     INT 21H     
    
CODES ENDS
    END START

存储如下:
在这里插入图片描述
同理,string+2就是实际存储的字符串的首地址。

    mov cx ,0              
    mov cl,[si]

这两行,先将CX清零,再把si指向的字节内容给cl,这两句也可以写成mov cx,[si]。CX是循环的条件之一,代表循环进行多少次,见下文。这里就是把字符串的实际大小给CX。

(3)步骤2:

lp: inc si 
    mov al,[si]             
    cmp al,'a'     ;每个字符判断是否<'a'或者>'z',是则直接转到下一个字符,否就转换成小写字符         
    jb next                 
    cmp al,'z'
    ja next                 
    sub al,20h                      
    mov [si],al
    
next:
     loop lp                 

注意:* CX 中存放循环次数

  • 只能使用段内直接寻址的8 位位移量
    LOOP
    LOOPZ / LOOPE
    LOOPNZ / LOOPNE
    执行步骤:
    (1) (CX) ← (CX) - 1
    (2) 检查是否满足测试条件,如满足则
    (IP) ← (IP) + 8位位移量,实行循环;
    不满足则 IP 不变,退出循环。

循环指令:LOOP OPR
测试条件:(CX) !=0

为零或相等时循环指令:LOOPZ(LOOPE) OPR
测试条件:ZF=1 且 (CX) !=0

不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR
测试条件:ZF=0 且 (CX) !=0

(4)步骤3:

     mov byte ptr [si+1],'$' ;因为9号调用字符串以'$'结尾,所以我们在结尾加上
     mov ah,2 
     mov dl,0ah       ;换行
     int 21h        
     mov dl,0dh        ;回车
     int 21h          
     
     mov dx,offset String+2  
     mov ah,9
     int 21h           ;调用9号DOS中断,显示首地址为DS:DX的字符串

完整代码:

DATAS SEGMENT
    ;此处输入数据段代码 
    string db 10,?,10 dup(?)
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    mov dx,offset String
    mov ah,0ah
    int 21h
    
    mov si,offset String+1  
    mov cx ,0              
    mov cl,[si] 
    
lp: inc si 
    mov al,[si]             
    cmp al,'a'              
    jb next                 
    cmp al,'z'
    ja next                 
    sub al,20h                      
    mov [si],al
    
next:
     loop lp                 
     mov byte ptr [si+1],'$' 
     mov ah,2 
     mov dl,0ah
     int 21h        
     mov dl,0dh
     int 21h           ;换行
     
     mov dx,offset String+2  
     mov ah,9
     int 21h           ;调用9号DOS中断,显示首地址为DS:DX的字符串
 
     MOV AH,4CH
     INT 21H     
    
CODES ENDS
    END START

运行结果

在这里插入图片描述

  • 23
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值