目录
一、实验目的
二、实验内容
三.实验步骤以及结果
1. 从键盘缓冲区中接受一个英文字符串(长度<50), 如“AB123cdE*87fGabFZ”,要求将其大写转小写,小写转大写后存入以result地址开始的缓冲区中,并输出。
2. 编写汇编程序,从键盘输入一个字符串,并将其倒序输出到屏幕中。例如:输入 abcd345; 输出 543cba
3.编写一个程序,判别键盘上输入的字符;若是1~9 数字字符,则显示之;若为A~Z字符,显示“c”,若为a-z 字符,显示“C”,若是回车字符(0DH),则结束程序,若为其他按字符则显示“R”
四.实验总结
五、后记
-
一、实验目的
- 掌握字符串处理指令。
- 巩固之前学习的知识。
-
二、实验内容
1. 从键盘缓冲区中接受一个英文字符串(长度<50), 如“AB123cdE*87fGabFZ”,要求将其大写转小写,小写转大写后存入以result地址开始的缓冲区中,并输出。
2. 编写汇编程序,从键盘输入一个字符串,并将其倒序输出到屏幕中。例如:输入 abcd345; 输出 543cba
3.编写一个程序,判别键盘上输入的字符;若是1~9 数字字符,则显示之;若为A~Z字符,显示“c”,若为a-z 字符,显示“C”,若是回车字符(0DH),则结束程序,若为其他按字符则显示“R”。
三.实验步骤以及结果
1. 从键盘缓冲区中接受一个英文字符串(长度<50), 如“AB123cdE*87fGabFZ”,要求将其大写转小写,小写转大写后存入以result地址开始的缓冲区中,并输出。
完整代码:
assume cs:code,ds:data,ss:stack
stack segment
db 50 dup(?) ;申请栈空间
stack ends
data segment
data ends
code segment
start:
mov ax,data
mov ds,ax ; 将data的地址赋给ds
call atoA ;调用子程序
mov ax,4c00h
int 21h
atoA proc
jmp donext
result db 50,?,50 dup(?)
donext:
mov dx,offset result ;这里的offset有点像C++中的指针,意思是把偏移量赋值给dx
mov ah,0ah
int 21h
mov si,offset result+1 ;这里si获得的其实是 实际输入字符个数值的偏移量
xor cx,cx
mov cl,[si] ;将偏移量为si的值 赋给cl 看这里的用法是不是有点像C++的指针呢
do:
inc si ; 偏移量递增 类似指针的移动
mov ah,[si] ; 将偏移量为si的值赋给ah
cmp ah,'a'
jb not_lower
cmp ah,'z'
ja not_lower
sub ah,20h ;利用ascii进行大小写转换
mov [si],ah
jmp next
not_lower:
cmp ah,'A'
jb next
cmp ah,'Z'
ja next
add ah,20h
mov [si],ah
next:
loop do
mov byte ptr [si+1],'$' ;字符串末尾加上结束符
;最后在变换完成的字符串末尾加上结束符号 '$'
mov dl,0ah ;DOS 2号功能
mov ah,02h
int 21h
mov dx,offset result+2 ;调用DOS 9号功能
mov ah,09h
int 21h
ret
atoA endp
code ends
end start
2. 编写汇编程序,从键盘输入一个字符串,并将其倒序输出到屏幕中。例如:输入 abcd345; 输出 543cba
完整代码:
DATAS SEGMENT
;无数据段定义
DATAS ENDS
STACKS SEGMENT
DW 60HDUP(?);分配堆栈空间
TOP LABEL WORD;栈顶指针
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
XOR CX,CX ;CX清零
;初始化
L1: MOV AH,1
INT 21H ;输入
CMP AL,0DH ;判断是否为回车输入结束
JE L2
PUSH AX
INC CX
JMP L1
L2: POP DX
MOV AH,2
INT 21H
LOOP L2 ;输出
MOV AH,4CH
INT 21H
CODES ENDS
END START
3.编写一个程序,判别键盘上输入的字符;若是1~9 数字字符,则显示之;若为A~Z字符,显示“c”,若为a-z 字符,显示“C”,若是回车字符(0DH),则结束程序,若为其他按字符则显示“R”
完整代码:
data segment
string DB 'please input:',13,10,'$'
crlf DB 13,10,'$'
strxx DB 13,10,'c$'
strdx DB 13,10,'C$'
strqt DB 13,10,'R$'
data ends
code segment
assume CS:code,DS:data
start:
mov AX,data
mov DS,AX
lea DX,string ;输入一个字符
mov AH,09
int 21h
mov AH,01
int 21h
push ax ;将al变量备份到栈中
;al与回车键比较
cmp al,13
je exit
cmp AL,'0' ;X<'0'即其他字符,转L0
jb L0
cmp AL,'9' ;X>='0',X<='9'即数字字符,转L1
jbe L1
cmp AL,'A' ;X>'9',X<'A'即其他字符,转L0
jb L0
cmp AL,'Z' ;X>='A',X<='Z'即大写字母,转L2
jbe L2
cmp AL,'a' ;X>'Z',X<'a'即其他字符,转L0
jb L0
cmp AL,'z' ;X>='a',X<='z'即小写字符,转L3
jbe L3
jmp L0 ;X>'z'即其他字符,转L0
L0: mov AL,0 ;0->AL;当输入为其他字符
jmp LL
L1: mov AL,2 ;2->AL;当输入为数字字符
jmp LL
L2: mov AL,4 ;4->AL;当输入为大写字母
jmp LL
L3: mov AL,6 ;6->AL;当输入为小写字母
LL: lea BX,TAB
mov AH,0
Add BX,AX
jmp BX ;转到地址表中对应的指令去执行
exit:
mov AH,4ch
int 21h
TAB: ;地址表
jmp SHORT P0
jmp SHORT P1
jmp SHORT P2
jmp SHORT P3
P0: lea DX,strqt ;其他字符
mov AH,09
int 21h
jmp exit
P1: lea DX,crlf ;换行
mov AH,09
int 21h
pop ax
mov dl,al ;数字字符
mov AH,02
int 21h
jmp exit
P2: lea DX,strdx ;大写字母
mov AH,09
int 21h
jmp exit
P3: lea DX,strxx ;小写字母
mov AH,09
int 21h
jmp exit
code ends
end start
倒数第二个是回车,倒数第一个是空格。程序圆满完成任务。
四.实验总结
1、任务圆满完成。
2、本次实验提高了我检索信息的能力。
3、但这里还是很生疏,前面的知识应该复习一下了。
五、后记
这三个代码都是我复制粘贴的,但结果得到了验证。可惜,忘了交作业。
代码出处如下:
https://zhuanlan.zhihu.com/p/266996340
汇编实现字符串输入并倒序输出_汇编字符串输入倒序输出-CSDN博客
【汇编语言】从键盘输入一字符,判断该字符是小写字母、大写字母、数字或其它字符_汇编语言判断输入的是数字还是字母-CSDN博客