汇编实验:从键盘上输入一串字符到输入缓冲区,找出其中的大写字母和小写字母,并分别统计它们的个数,结果放到变量 num1 和 num2 中,要求在屏幕输出显示所有字母及变量 num1 和 num2 的值

1.给出三个有符号数,编写一个比较相等关系的程序:
(1) 如果这三个数都不相等,则显示 0;
(2) 如果这三个数中有两个数相等,则显示 1;
(3) 如果这三个数都相等,则显示 2;

  • 利用Dos1号功能实现输入三个字符进行比较(初级版)
datas segment
D DB 3 DUP(0)
D1 DB ?
D2 DB ?
D3 DB ?
MESSAGE Db 'please input three number:',13,10,'$'
datas ends
stacks segment
stacks ends
codes segment
ASSUME CS:CODES,DS:DATAS,SS: STACKS
start:
MOV AX,DATAS
MOV DS,AX ;段寄存器不能通过立即数赋值;
lea dx,MESSAGE
mov ah,9h
int 21h
MOV CX,3H
MOV SI,OFFSET D
input:MOV BX,0
MOV AH,01H;调用dos,输入字符
int 21h
MOV BL,AL
mov dl,al
mov ah,02h
int 21h
mov [si],BL
INC SI
MOV AH,02H ; dos 2号功能输出1个字符
MOV DL,13 ;输出字符
INT 21H  ; 输出\r使得表示将光标移至行首,dos系统下需要这样做
MOV DL,10
INT 21H ; 输入\n 换行
loop input
mov si,offset d
MOV BL,BYTE PTR [SI]
MOV D1,BL;将数组第一个元素赋值D1
MOV BL,BYTE PTR [SI+1]
MOV D2,bl;将数组第二个元素赋值D1
MOV BL,BYTE PTR [SI+2]
MOV D3,BL;将数组第三个元素赋值D1
;MOV D1,BYTE PTR [SI];注意两个变量之间不能相互赋值
mov bl,d1
cmp bl,d2;判断d1与d2是否相等
jz j2 ;d1与d2相等跳转j2
jmp j3;d1与d2不等跳转j3
j2:mov bl,d2
cmp bl,d3;d1与d2相等,判断d2与d3
jz jO2
mov dl,31h
jmp output
j3:mov dl,d2
cmp dl,d3;d1与d2不等,判断d2与d3
jNz jo0 ;d2与d3不等,跳转输出0
mov dl,31h;d2与d3相等,输出1;
jmp output
jo0:mov dl,30h;打印输出0
jmp output
jo2:mov dl,32h;打印输出2
jmp output
output:mov ah,02h
int 21h
mov dl,d2
int 21h
mov ah,4ch
int 21h
codes ends
end start
  • 直接定义三个数进行比较
datas segment
D1 DB 1
D2 DB 1
D3 DB -2
datas ends
stacks segment
stacks ends
codes segment
ASSUME CS:CODES,DS:DATAS,SS: STACKS
start:
MOV AX,DATAS
MOV DS,AX ;段寄存器不能通过立即数赋值;
mov bl,d1
cmp bl,d2;判断d1与d2是否相等
jz j2 ;d1与d2相等跳转j2
jmp j3;d1与d2不等跳转j3
j2:mov bl,d2
cmp bl,d3;d1与d2相等,判断d2与d3
jz jO2
mov dl,31h
jmp output
j3:mov dl,d2
cmp dl,d3;d1与d2不等,判断d2与d3
jNz jo0 ;d2与d3不等,跳转输出0
mov dl,31h;d2与d3相等,输出1;
jmp output
jo0:mov dl,30h;打印输出0
jmp output
jo2:mov dl,32h;打印输出2
jmp output
output:mov ah,02h
int 21h
;mov dl,d2
;xor dl,30h 将ASCII码转成其值所对应的数字
;int 21h
mov ah,4ch
int 21h
codes ends
end start
  • 输入字符转换成16进制表示然后比较
汇编语言简明教程:子程序第五章有讲到,在此不多赘述。

2.从键盘上输入一串字符到输入缓冲区,找出其中的大写字母和小写字母,并分别统计它们的个数,结果放到变量 num1 和 num2 中,要求在屏幕输出显示所有字母及变量 num1 和 num2 的值。

  • 直接存的字符串
datas segment
string db 10 ;输入字符串所占字节数
			 db ?   ;输入字符串字符个数,自动填充
			 db 10 dup(0);数组存储输入字符串
	crlf db 0ah, 0dh,'$'
msg1 db 'capital:'
num1 db 30h,'$' ;存储大写字母个数
msg2 db 'Lowercase:'
num2 db 30h,'$' 
message db 'please input a section character string',13,10,'$'; !
datas ends
stacks segment
stacks ends
codes segment
assume cs:codes,ss:stacks,ds:datas
start:
mov ax,datas
mov ds,ax ; 这里存放的应该数据段地址
lea dx,message
mov ah,09h;显示提示输入
int 21h
xor dx,dx
lea dx,string;偏移地址默认是16位不需要类型转换;
mov ah,0ah;输入字符串
int 21h
lea dx,crlf
mov ah,09h
int 21h
;mov al,[string+1]
;xor ah,ah
;mov cx,ax
;mov cx,WORD ptr [string+1] error
mov cl,[string+1];string中字符以字节存储,注意类型转换 right
xor si,si
add si,02h
xor si,si
mov si,offset string+2
;MOV di, OFFSET string
;MOV bl,[string+1]
;MOV cx,[string+1]
;MOV si,[string+1]
;mov si,string+2;error
;mov si,WORD ptr string	
again: 
	mov bl,[si]
 	cmp bl,'A'
 	jb next
 	cmp bl,'Z'
 	ja cmp2
 	inc num1
 	mov dl,bl
 	mov ah,02h
 	int 21h
 	jmp next
cmp2:
cmp bl,'a'
jb next
cmp bl,'z'
jnbe next
inc num2
mov dl,bl
mov ah,02h
int 21h
next:inc si
loop again
lea dx,crlf
mov ah,09
int 21h
lea dx,msg1
mov ah,09h
int 21h
lea dx,crlf
mov ah,09
int 21h
lea dx,msg2
mov ah,09h
int 21h
mov ah,4ch
int 21h
codes ends
end start

猜你喜欢

转载自blog.csdn.net/weixin_44627672/article/details/109277207