随机产生一系列的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