产生随机数_汇编.doc_第1页
产生随机数_汇编.doc_第2页
产生随机数_汇编.doc_第3页
产生随机数_汇编.doc_第4页
产生随机数_汇编.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、keil中的rand函数反编译结果:/*TEST.c*/#include void main(void)CHAR i, j, k;i = 0x5f;j = rand();k = 0xf5;反编译结果,随机数放在R7中;=Q0003:MOVR4,08H;0003AC 08MOVR5,09H;0005AD 09MOVR6,0AH;0007AE 0AMOVR7,0BH;0009AF 0BMOVR0,#0FH;000B78 0FQ000D:MOVA,R7;000DEFMOVC,ACC.2;000EA2 E2MOVA,R4;0010ECJBACC.6,Q0015;001120 E6 01CPLC;0014B3Q0015:ANLA,R5;00155DANLA,R6;00165EANLA,R7;00175FCPLA;0018F4JNZQ001F;001970 04MOVR4,A;001BFCMOVR5,A;001CFDMOVR6,A;001DFEMOVR7,A;001EFFQ001F:MOVA,R7;001FEFRRCA;002013MOVR7,A;0021FFMOVA,R6;0022EERRCA&nb2、一个简单的随机数发生函数:rand8reg是得到的随机数,为了更随机,可以把它与定时器相加如果可以把rand8reg保存在非易失性存储器中更好,但是什么时候保存需要认真考虑;=;NAME: rand8;DESCRIPTION: get a 8bit random NUMBER;Function: This routine sends calc a 8bit random NUMBER;Attention: get a random rand8reg before initialize the program;Calls: None;Input: rand8reg;Outputs: rand8reg;Register Usage: A, psw;-rand8:mova, rand8regjnzrand8bcplamovrand8reg, arand8b: anla, #10111000bmovc, pmova, rand8regrlcamovrand8reg, aret3、这个可能复杂一些:其实和周航慈单片机程序设计基础上的例子是一样的,使用线性移位寄存器构成随机数发生器;*;*Random*;*Random_Buf 6个字节看成48个位,可以表示280亿个数值,原理:用反*;*馈函数F()把这280亿个无顺序的放在一个可以旋转数码盘上,程序*;*有定时器在跑,当随机发生时,让转盘转计数器的值圈数即可得到一个*;*随机数.*;*奇校验反馈函数d0=d48+d7+d5+d4+d2+d1+1,6Byte有280亿种状态 *;*;Random:PUSHACCMOVRandomREG,CountData_Rotate:MOVA,Random_Buf+5;取D41-D48的当前状态RLCA;将D48提取到标志中去MOVA,Random_Buf;取D1-D8的当前状态ANLA,#5BH;提取D7,D5,D4,D2,D1的当前值MOVACC.7,C;再加上D48的当前值MOVC,PSW.0;取得偶校验的结果CPLC;转换成奇校验,且得到反馈函数的值MOVA,Random_Buf;开始移位操作,先处理低字节RLCA;将反馈函数的值移入,最高位移出MOVRandom_Buf,A;保存移位后的结果MOVA,Random_Buf+1;再依次进行其他字节的移位操作RLCAMOVRandom_Buf+1,AMOVA,Random_Buf+2RLCAMOVRandom_Buf+2,AMOVA,Random_Buf+3RLCAMOVRandom_Buf+3,AMOVA,Random_Buf+4RLCAMOVRandom_Buf+4,AMOVA,Random_Buf+5RLCAMOVRandom_Buf+5,A;完成巨型数字转盘转动一格DJNZRandomREG,Data_Rotate;取当前时间随机时间转动n格Random_Exit:POPACCRET4、最终使用的程序使用一个简单的随机数发生器产生种子运行中用TL0作为干扰;TEST.asm;TEST;-;=; Define;-STACK_TOPEQU0D0H; STACK : 48BytesRandom_BufEQU70H; VARIABLEBUFFER (70H75H)RND0EQU70H; VARIABLE第1字节RND1EQU71H; VARIABLE第2字节RND2EQU72H; VARIABLE第3字节RND3EQU73H; VARIABLE第4字节RND4EQU74H; VARIABLE第5字节RND5EQU75H; VARIABLE第6字节RandCountEQU76H; VAIRABLE跳动格数rand8regEQU77H; VAIRABLE简单随机数,用来产生种子和跳动格数;=; MAIN PROGRAM : 程序入口;=ORG 0000H; main programLJMPmain;ORG 0003H; Int0 InterruptRETI;ORG 000BH; T0 InterruptRETI;ORG 0013H; Int1 InterruptRETI;ORG 001BH; T1 InterruptRETI;ORG 0023H; Si1 InterruptRETI;ORG 002BH; T2 InterruptRETI;ORG 0033H; RETI;ORG 003BH; Si2 InterruptRETI;ORG 0043H; Int2 InterruptRETI;ORG 004BH; Int3 InterruptRETI; ORG 0053H; Int4 InterruptRETI;ORG 005BH; Int5 InterruptRETI;ORG 0063H; WatchDog InterruptRETI;ORG 0100H; 程序入口main:CLREA; Reset RAMMOVR0, #0FFHResetRam:MOVR0, #00HDJNZR0, ResetRamMOVSP, #STACK_TOPLCALLInit_Random; 初始化随机数发生器MOVR0, #20HMOVR1, #40HRANDLOOP:LCALLRandom; 产生随机数MOVA, RND0MOVR0, A; 把随机数暂存到RAM中INCR0DJNZR1, RANDLOOP; 循环取40H个随机数NOPNOPLJMPmain;=;NAME: Init_Random ;DESCRIPTION: initialize the random;Function: give the VALUE of Random_Buf and RandCount;Calls: None;Input: Random_Buf, RandCount;Outputs: Random_Buf;Register Usage: A, psw;-Init_Random:ADDA, BADDA, R0ADDA, R1&nbs5-DATA SEGMENT CC DB + ww db - GG DB = II DB 0DH,0AH,$ AA DB 5 DUP(?) www dw 0 ghh db 0,0dh,0ah,$ bnm dw 0DATA ENDSSTACK SEGMENT DB 200 DUP(0)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV CX,20 CALL RAND ;产生一随机数 CALL MCAT ;将随机数转换为16进制表示的ASCII码字符 MOV AX,BX PUSH AX CMP www,0 ;WWW=0? JE A1 ;执行+ CMP www,1 ;www=1? JE A2 ;执行- A1: MOV DL,CC ;显示+ MOV AH,2 INT 21H CALL RAND ;产生另一随机数 add bx,0fh CALL MCAT ;将随机数转换为16进制表示的ASCII码字符 MOV DL,GG ;显示= MOV AH,2 INT 21H POP AX ADD AX,BX cmp ax,0 jne yjw1 lea dx,ghh mov ah,9 int 21h jmp qq1yjw1: JMP B1 A2: MOV DL,WW ;显示- MOV AH,2 INT 21H mov cx,65535mai1: loop mai1 CALL RAND1 CALL MCAT MOV DL,GG MOV AH,2 INT 21H POP AX Sbb AX,BX cmp ax,0 jne yjw2 lea dx,ghh mov ah,9 int 21h jmp qq1 yjw2: JMP B1 B1: MOV BX,AX CALL MCAT lea DX,II MOV AH,9 INT 21HQQ1: MOV AH,4CH INT 21HMCAT PROC ;将随机数转换为16进制表示的ASCII码字符子程序 PUSH AX push bx PUSH CX PUSH DX CMP BX,9 JA S1 PUSH AX PUSH BX PUSH CX PUSH DX mov ax,bx mov bl,5 div bl cmp ah,3 jae vb1 mov www,1 jmp vn1vb1:mov www,0vn1:pop dx pop cx pop bx pop ax ADD BL,30H MOV AA,BL MOV AA+1,$ LEA DX,AA MOV AH,9 INT 21H JMP s3s1:MOV CL,4 MOV AL,0 PUSH BX SHL BX,CL CMP BH,9 JBE V1 SUB BH,9 ADD BH,40H JMP MM1V1:ADD BH,30HMM1:MOV AA,BH POP BX AND BL,0FH PUSH AX PUSH BX PUSH CX PUSH DX mov ax,bx mov bl,5 div bl cmp ah,3 jae vb2 mov www,1 jmp vn2vb2:mov www,0vn2:pop dx pop cx pop bx pop ax CMP BL,9 JBE TT1 SUB BL,9 ADD BL,40H JMP RR1TT1: ADD BL,30HRR1: MOV AA+1,BL MOV AA+2,$ LEA DX,AA MOV AH,9 INT 21Hs3:POP DX POP CX POP BX POP AX RETMCAT ENDPRAND PROC PUSH CX PUSH DX PUSH AX STI MOV AH,0 ;读时钟计数器值 INT 1AH MOV AX,DX ;清高6位 AND AH,3 MOV DL,101 ;除101,产生0100余数 DIV DL MOV BL,AH ;余数存BX,作随机数 POP AX POP DX POP CX RETRAND ENDPRAND1 PROC PUSH CX PUSH DX PUSH AX STI MOV AH,0 INT 1AH MOV ax,cx AND AH,3 MOV DL,101 DIV DL MOV BL,AH POP AX POP DX POP CX RETRAND1 ENDPCODE ENDS END START 6-DATASEGMENTRNDDW 256 DUP(?)DATAENDSSTAKSEGMENT STACKDW 256 DUP(?)STAKENDSCODESEGMENTASSUME DS: DATA, SS: STAK, CS: CODESTART:MOV AX, DATAMOV DS, AXLEA DI, RNDMOV BX, 256LOP:CMP BX, 0JZ EXITMOV AH, 2CHINT 21HMOV AL, DLADD AX, 159MUL DLXOR AH, 12MOV DI, AXINC DIINC DIDEC BXMOV CX, 0LOP1:INC AXPUSH CXMOV CX, 250LOP2:INC AXLOOP LOP2POP CXLOOP LOP1JMP LOPEXIT:INT 3MOV AH, 4CHINT 21HCODEENDSEND START在EXIT那里我设置了调试中断,在Debug下可以查看结果。前面那个算法没效率。这个应该比较好了,虽然这个算法也没有经过什么严格的数学证明(应该不符合正态分布),这里只是提供一种思想吧。对了,CX里放的是需要产生随机数的个数。DATA SEGMENTPMPT1 DB Please input the decimal number for converting (format: xxxxx): $ PMPT2 DB 0AH, 0DH, The binay result is : $RESLT DB 16 DUP (0)BUF DW ?COUNT DB 4DATA ENDSSTA SEGMENT STACK S DW 30 DUP (0)STA ENDSCODE SEGMENT ASSUME DS: DATA, SS: STA, CS: CODESTART: MOV AX, DATA MOV DS, AX MOV SI, -1 MOV CX, 0 LEA DX, PMPT1 MOV AH, 9 INT 21H MOV BUF, 1000 MOV AH, 1 INT 21H SUB AL, 30H MOV AH, 0 MOV BX, 10000 MUL BX MOV CX, AX MOV DI, 10INPLP:MOV AH, 1 INT 21H SUB AL, 30H MOV AH, 0 MOV BX, BUF MUL BX ADD CX, AX MOV AX, BX DIV DI MOV BUF, AX DEC COUNT JNZ INPLP MOV BX, CX LEA DX, PMPT2 MOV AH, 9 INT 21HNEXT: INC SI AND BX, BX JZPR_RM_0 SHL BX, 1 JNC PR_0 MOV RESLTSI, 1 MOV DL, RESLTSI MOV AH, 2 INT 21H JMP NEXT PR_0: MOV DL, RESLTSI MOV AH, 2 INT 21H JMP NEXT PR_RM_0:MOV DL, RESLTSI MOV AH, 2 INT 21H I

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论