欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编语言四 产生随机数,统计奇数的个数,并计算所有奇数的和

程序员文章站 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