随机产生一系列的ascii码字符,将其分类输出


;本程序功能是实现:随机产生一系列的ascii码字符,将其分类输出
DATAS SEGMENT
;此处输入数据段代码
Str1		db	'Please input a number:','$'
Str2		db	'output the number:','$'
Str3		db	'output the capital word:','$'
Str4		db	'output the small word:','$'
Str5		db	'output the other:','$'
StrEnter	db 0dh,0ah,'$'
Buf		db	5 dup(?)
;DecBuf	db	5 dup(?)

NU	db 100 dup(?)
CD	db 1000 dup(?)
SD	db 1000 dup(?)
OTHER	db 1000 dup(?)

Num	dw	0
A	dw	0    

countNu dw 0
countCD dw 0
countSD dw 0
countOt dw 0
  
DATAS ENDS

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

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    lea dx,Str1;显示提示:输入要产生随机数的个数
	mov	ah,9
	int	21h

	mov	cx,5;输入数值部分,最大输入5位的数
	call EnterN
	
	lea dx,strEnter
    mov ah,9
    int 21h 
    
    
    ;将键盘输入的数转化为数值
    lea si,Buf
    mov ax,0
    ;mov Num,0
    mov A,0
    mov cx,Num
lpout:
    mov ax,A
    mov bx,10
	mul bx
	;sub ax,0030h
	mov A,ax
	mov al,[si]
	mov ah,0
	sub al,30h
	add A,ax
	inc si
	loop lpout
	
	
	lea si,CD
	lea di,SD
	lea bp,OTHER
	lea bx,NU
	
	mov cx,A
;随机数产生函数	
rand:  
	xor  al,al;异或运算
    out 43h,al;I/O端口输出语法: OUT {端口号│DX},累加器 
    in al,40h;I/O端口输入语法: IN 累加器, {端口号│DX} 
    cmp al,126;比较.(两操数作减法,仅修改标志位,不回送结果).
    ja rand
    xor  ah,ah;异或运算
    
    call Sort
    ;mov  dl,20h;加了这句代码,经测试,发现数据更离散,否则不离散,比较郁闷
	mov dl,al
    mov ah,2
    int 21h	
    
    loop rand
    
    lea dx,strEnter
    mov ah,9
    int 21h
    
    lea dx,Str2;显示提示:输 的个数
	mov	ah,9
	int	21h
	
	
	mov cx,countNu
	cmp cx,0;判断是否为零为零则不输出
	jz lpCD
	lea si,NU	
outNu:
	mov dx,[si]
	mov ah,2
	int 21h
	;
	inc si
	loop outNu

lpCD:	
	lea dx,strEnter
    mov ah,9
    int 21h 
    
    lea dx,Str3;显示提示:输 的个数
	mov	ah,9
	int	21h
	
	;显示大写字母个数的,用来调试时用
	;mov dx,countCD
	;add dx,0030h
	;mov ah,2
	;int 21h
	;
	mov cx,countCD
	lea si,CD	
outCD:
	mov dx,[si]
	mov ah,2
	int 21h
	
	inc si
	loop outCD
	
	lea dx,strEnter
    mov ah,9
    int 21h
    
    lea dx,Str4;显示提示:输 的个数
	mov	ah,9
	int	21h
	
	;显示小写字母个数的,用来调试时用
	;mov dx,countSD
	;add dx,0030h
	;mov ah,2
	;int 21h
	
	mov cx,countSD
	lea si,SD	
outlp:
	mov dx,[si]
	mov ah,2
	int 21h
	
	inc si
	loop outlp
	
	lea dx,strEnter
    mov ah,9
    int 21h
	
	lea dx,Str5;显示提示:输 的个数
	mov	ah,9
	int	21h
	
	;显示其他字符个数的,用来调试时用
	;mov dx,countOt
	;add dx,0030h
	;mov ah,2
	;int 21h
	;
	mov cx,countOt
	lea si,OTHER	
outOt:
	mov dx,[si]
	mov ah,2
	int 21h
	
	inc si
	loop outOt
	
	lea dx,strEnter
    mov ah,9
    int 21h
    
	jmp code_exit

;函数
Sort PROC
	;PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
	
	CMP AL,'0'
	jb lpother
	
lpnum:
	cmp al,'9'
	ja lpBword
	
	mov [bx],al
	inc bx
	inc countNu
	jmp sort_exit

lpBword:
	cmp al,41h
	jb lpother
	cmp al,5ah
	ja lpSword
	
	mov [si],al
	inc si
	inc countCD
	jmp sort_exit

lpSword:
	cmp ax,61h
	jb lpother
	cmp ax,7ah
	ja lpother
	
	mov [di],al
	inc di
	inc countSD
	jmp sort_exit
		
lpother:

	mov [BP],al
	inc BP
	inc countOt
	;jmp sort_exit
sort_exit:
	POP DX
	POP CX
	POP BX
	;POP AX
	RET
Sort ENDP

    
;函数的传值:CX:输入数的位数,
EnterN  PROC
    PUSH DX
    PUSH BX
    PUSH AX

	
	lea si,Buf
;输入数值部分,最大输入5位的数
lp1:mov	ah,7
	int	21h
	
	cmp	al,0dh
	jz	lp_ex
	;只能输入0-9之间的数
	cmp	al,'0'
	jb lp1
	cmp	al,'9'
	ja lp1
	
	;每次输入的数都存入buf中
	mov [si],al
	inc si
	inc Num
	
	mov	ah,2
	mov	dl,al
	int 21h
	
	loop lp1


lp_ex:
      POP AX
      POP BX
      POP DX
      RET
EnterN ENDP
    
code_exit:
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START



 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值