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文章来源:https://www.toymoban.com/news/detail-778061.html
(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
运行结果
文章来源地址https://www.toymoban.com/news/detail-778061.html
到了这里,关于汇编语言(Assembly Language)习题:键盘输入一个字符串,试将其中的小写字母转换为大写字母,其它字符保持不变。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!