用松翰sn8p2501b的汇编语言编写在0-100范围内取一个随机数
时间: 2023-06-17 16:05:43 浏览: 137
javascript随机抽取0-100之间不重复的10个数
5星 · 资源好评率100%
以下是使用松翰sn8p2501b汇编语言编写的在0-100范围内取一个随机数的代码:
```
ORG 0x0000 ;程序入口地址
START:
;设置随机数种子为当前时间
MOV A, #0x00 ;初始化随机数种子为0
LCALL GET_TIME ;调用获取当前时间的子程序
ADD A, DPH ;将当前时间的高8位加到随机数种子上
ADD A, DPL ;将当前时间的低8位加到随机数种子上
MOV R0, A ;将随机数种子保存到R0寄存器中
;生成随机数并取模
MOV A, R0 ;将随机数种子复制到累加器A中
MOV R1, #0x6F ;将一个较大的数0x6F保存到R1寄存器中
DIV AB ;将随机数种子除以0x6F,商保存到累加器B中,余数保存到累加器A中
MOV R0, A ;将余数保存回随机数种子中
MOV A, B ;将商保存到累加器A中
MOV R1, #0x64 ;将一个较小的数0x64保存到R1寄存器中
DIV AB ;将商除以0x64,余数保存到累加器A中
MOV A, A ;将余数保存回累加器A中,这一步其实可以省略
ADD A, #1 ;将余数加1,因为余数范围是0到63,加1后变成1到64
MOV R0, A ;将随机数保存到R0寄存器中
;将随机数取模到0-100范围内
MOV A, R0 ;将随机数复制到累加器A中
MOV R1, #0x65 ;将除数0x65保存到R1寄存器中
DIV AB ;将随机数除以0x65,商保存到累加器B中,余数保存到累加器A中
MOV A, B ;将商保存回累加器A中
MOV R0, A ;将随机数模100的结果保存到R0寄存器中
;程序结束,等待复位
SJMP $
;获取当前时间的子程序
;子程序返回值:DPH保存当前时间的高8位,DPL保存当前时间的低8位
GET_TIME:
;启动定时器0,设置为定时1ms
MOV TMOD, #0x01
MOV TH0, #0xFC
MOV TL0, #0x66
SETB TR0
;等待定时器0溢出,即等待1ms
WAIT:
JNB TF0, WAIT
;读取当前时间,保存到DPH和DPL中
MOV DPH, TH0
MOV DPL, TL0
RET
```
该程序首先调用子程序`GET_TIME`获取当前时间,并将当前时间的高8位加到随机数种子上,将当前时间的低8位加到随机数种子上。然后,将随机数种子除以一个较大的数0x6F,将商保存到累加器B中,余数保存到累加器A中。再将商除以一个较小的数0x64,将余数保存到累加器A中,然后将余数加1,得到的结果就是一个1到64之间的随机数。最后,将这个随机数除以一个数0x65,取模到0-100范围内,得到的结果就是一个0到100之间的随机数。
需要注意的是,该程序使用定时器0来获取当前时间,因此在使用该程序之前需要先设置定时器0的工作模式和定时周期,以便定时器0每隔一定时间(本程序设置为1ms)溢出一次,从而获取当前时间。
阅读全文