汇编语言四 产生随机数,统计奇数的个数,并计算所有奇数的和
程序员文章站
2024-02-02 18:31:40
...
1.题目要求:
用同余法产生200个小于256的伪随机数,统计其中奇数的个数,并计算所有奇数的和,将奇数个数存入名为CNT的字节单元,和存入名为SUMODD的字存储单元中。
2.编写代码:
STACK SEGMENT STACK'STACK'
DW 100H DUP(?)
TOP LABEL WORD
STACK ENDS
DATA SEGMENT
CNT DB 0 ;CNT储存奇数的个数
SUMODD DW 0 ;SUMODD储存奇数的和
VAR1 DB 1 ;
VAR2 DB 255 ;同余法产生小于256的随机数:AX=(AX*7+1) mod 255
VAR3 DB 200 ;要产生200个随机数,就循环200次
VAR4 DW 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
XOR AX,AX
XOR BX,BX
XOR CX,CX
XOR DX,DX
MOV AL,VAR1
MOV BL,VAR2
MOV CL,VAR3
L1:
PUSH CX ;因为循环中还嵌套了循环,先将外层循环次数压入堆栈
MOV CX,6
MOV VAR4,AX
L2:
ADD AX,VAR4
LOOP L2 ;求得AX*7
ADD AX,1
DIV BL ;求得(AX*7+1) mod 255,余数在AH中
ROR AH,1
JNC OU ;将AH最低位移入CF中,如果是奇数,CF=1,如果是偶数CF=0
ROL AH,1
MOV CL,8
SHR AX,CL ;如果是奇数:将AX更新为(AX*7+1) mod 255
ADD DX,AX ;奇数和 DX+AX
INC BH ;奇数个数 BH+1
JMP NEXT
OU:
ROL AH,1 ;如果是偶数
MOV CL,8
SHR AX,CL ;更新AX,DX和BH不变
JMP NEXT
NEXT:
POP CX ;将循环次数弹出堆栈到CX
LOOP L1
MOV CNT,BH ;将个数保存到CNT
MOV SUMODD,DX ;将和保存到SUMODD
MOV AH,4CH
INT 21H
CODE ENDS
END START
上一篇: 寻找三个数的和为0
下一篇: 使用C语言分解质因数