汇编题目关于产生随机数并计算的程序

qq_24681887 2016-05-26 10:00:27
编程实现产生两个随机数,并能对产生的随机数进行加法和减法运算。利用BIOS功能调用的时钟中断调用(1AH中断调用),读取时钟计数器的值,利用随时变化的时间计数值产生随机数并进行加法或减法运算。然后将产生的随机数和运算结果转换为相应的十六进制数表示的ASCII码字符,并将其显示在屏幕上。
...全文
1536 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_23107797 2016-05-30
  • 打赏
  • 举报
回复 1
这种课题,很难有人回复吧. 幸好以前写了不少这样的东西,随便改一下就是 利用int1Ah取随机数不是很精确,ah=0是取系统累加数,每1/18秒累加一次, Ah=2是取时分秒,更粗糙得很,但题目限制,只能尽量使随机数乱一些... 1.取得数值利用上一次数值做回圈运算,减少规律 2. 取得第1数值不能和上次第1数值相同 3. 取得第2数值不能和第1数值相同 4. 三次相同的运算后,必须相反,如3次加后,必须减,或3次减后,必须加 程式会随机取2数(1-99),随机做加或减并显示答案,能显示负值,任意按键显示下一题,ESC离开,代码有注码,应该不难理解

DATA SEGMENT
 LastRand db 01011101b  ;seed
 DisplayStr db 10,13
 FirstNumStr db 2 dup (20h)
 OpStr db '+'
 SecondNumStr db 3 dup (20h),'='
 Ans db 4 dup (20h),'$'
 FirstNum db 0
 SecondNum db 0
 Op db 0  ;0 = [+] , 1= [-]
 OpCount db 0
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
Restart:
 ;初始化
 mov byte ptr  OpStr,'+'   ;正数符
 mov ax,2020h
 mov word ptr Ans,ax
 mov word ptr Ans+2,ax
next0:  ;以下乱取得二数和加减运算子
 ;取第1数
 mov al,LastRand
 call Random  ;get al = 0-255 
 mov LastRand,al
 cmp al,99
 ja next0
 cmp al,0
 jz next0
 cmp FirstNum,al
 jz next0  ;不能和上次第1数相同
 mov FirstNum,al  ;取得第一数1-99
;-----  ;取第运算子+ / -
 mov al,LastRand
 call Random
 and al,00000001b
 mov ah,al
 xor ah,op   ;上次运算子和今次运算子比较
 jnz next0a ;不同
 inc OpCount ;若二值相同到此,累加
 cmp OpCount,2  ;运算子不能超过3次相同
 jbe next0b ;未到3次
 xor al,1  ;运算子取反
next0a:
 mov OpCount,0 ;重设运算子计数
next0b:
 mov op,al
 test al,1  ;bit0设定0为正,1为负 
 jz next
 mov Op,1
 mov OpStr,'-' ;运算子[-]设定
next: ;  --------取第2数
 mov al,LastRand
 call Random
 mov LastRand,al
 cmp al,99
 ja next
 cmp al,0
 jz next
 cmp FirstNum,al ;不能和第1值相同
 jz Next
 mov SecondNum,al  ;取得第2数1-99
;-----
next2:  ;以下二数转ascii,存入显示字符串
 mov al,FirstNum
 aam
 or ax,3030h
 xchg al,ah
 mov word ptr FirstNumStr,AX  
 mov al,SecondNum
 aam
 or ax,3030h
 xchg al,ah
 mov word ptr SecondNumStr,AX  
;---- 以下计算二数加或减
 mov ah,SecondNum
 mov al,FirstNum
 test Op,1    ;0=+  , 1= -
 jz next2a
 sub al,ah  ;二数相减
 jmp short next2b
next2a:
 add al,ah  ;二数相加
next2b:
 jnc next3  ;cf=1结果是负
 neg al  ;转正
 mov byte ptr Ans,'-'   ;负数符
next3: 
 mov di,offset Ans + 1
 xor cx,cx ;以下结果转ascii
 aam  ;bcd加法调整
 push ax ;保存个位
 inc cx  ;累加
 cmp ah,10 ;是否有百位
 jb next4 ;没有
 mov al,ah ;送十位百位入al
 aam  ;bcd加法调整
 push ax ;保存十位
 inc cx ;累加
next4:
 mov al,ah ;取第1位,可能是十位或百位
 cmp al,0 ;第1位是否0
 jnz next4a ;不是
 mov al,20h-30h ;是0, 则以空白取代,随后代码加30h,将变回空白20h
 dec di  ;因第1位是0,补空白后随后数字移前
next4a:
 push ax ;保存第1位
 inc cx ;累加
next5: 
 pop ax ;栈取回
 add al,30h ;转ascii
 stosb  ;存至结果字符串
 loop next5 ;下一个

 mov ah,9 ;印出整条数式
 mov dx,offset DisplayStr
 int 21h
 mov ax,0c07h ;暂停
 int 21h
 cmp al,1bh  ;esc ?
 jz quit  
 jmp Restart ;重来一条

quit:
 mov ah,4ch ;离开
 int 21h
;-------------------------
;随机值子程序(利用int1Ah, ah=0获取bios系统累加时数),
;传入:al乱数种子,可以是上次随机值
;传回:al = 0-255
回0-255
Random:
push dx
push cx
push bx
mov bh,al  ; 取上次随机值
mov ah,0
int 1Ah  ;传回cx:dx为bios系统累加时数(由凌晨起,每1/18秒累加一次)
mov al,dl ;以下弄乱结果,让随机性大些
xor al,dh
xor al,bh
xor cx,dx
R10:
add al,dl
 loop R10
pop bx
pop cx
pop dx
ret
;---------------------------------------
CODE ENDS
END START
"微机原理与系统设计"课程大作业 各位同学: 虽然课程还没有进行到足以完成下面的作业,但教材给你们提供了很好的帮助,只要 自己自学一下,相信你们能够很好地完成作业,也可以锻练你们的能力,祝你们在非常 时期,得到长足的进步。 一、《微机原理与接口技术》编程入门 一般来说,用户设计的程序包含三个段:堆栈段(STACK)、数据段(DATA)和代码 段(CODE)。如果使用的堆栈单元较少,则也可以不定义堆栈段,这时会使用操作系统 所定义的堆栈段。如图1所示(分号";"之后的内容表示注释)。 图1 汇编语言程序结构 有了这种结构,用户编写程序时,只需要将要定义的变量填入DATA段,将编写的汇编 语言程序填入CODE段,使程序设计有了清楚的结构。参见教材p103 例4.2 。 二、随机数产生 计算机不会产生绝对随机的随机数,计算机只能产生"伪随机数"。 伪随机数生成算法实际上是采用了"线性同余法"。具体的计算如下: 其中A,C,M都是常数(一般会取质数)。当C=0时,叫做乘同余法。 问题1:编写子程序RANDOM,产生0~255之间的伪随机数;编写程序产生1000个随机数, 并统计其概率分布图;运行3次,验证随机性。 提示:为了产生0~255之间的伪随机数,取M=256,A=19,C=37。第一个数也需要 具备随机性,我们可以利用INT 21H的2CH号功能(参见教材P384)获取本机系统时间,取DL寄存器内容,作适当处理, 使其在0~255之间。 随机数可以用于扑克牌的洗牌中。每张扑克牌用一个字节表示,用低4位表示A~K用 1~13表示,D5~D4表示花色:00~11分别表示方块、草花、红桃、黑桃;用D7~D6表示 大小王,约定1000 0000B表示大王,0100 0000B表示小王。 洗牌之前将所有的牌按从小到大放在洗牌区(实际上是一块54字节的存储区域),然 后经过p次交换洗牌、q次倒排洗牌、r次块分割对插洗牌。(1)交换洗牌:产生2个随机 数(0~53,下同)n、m,将位置n与m的内容交换;(2)倒排洗牌:产生2个随机数n、 m,设n程序Shuffle完成洗牌,设计程序完成发牌(底 牌留6张),显示ABCD各人手中牌和底牌,重复多次,验证洗牌的有效性。进一步可以完 成多副牌的洗牌和发牌。 题目有什么不妥之处,可以给我发Email: ----------------------- "微机原理与系统设计"课程大作业全文共3页,当前为第1页。 "微机原理与系统设计"课程大作业全文共3页,当前为第2页。 "微机原理与系统设计"课程大作业全文共3页,当前为第3页。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧