将随机数存储在字节数组中

Posted

技术标签:

【中文标题】将随机数存储在字节数组中【英文标题】:Storing random numbers in an array of bytes 【发布时间】:2021-06-11 07:33:15 【问题描述】:

我想将 1 到 5 的随机数存储在一个 100 字节的数组中。我的 random 程序运行良好,但是当我尝试打印我的数组时它没有显示任何输出。该程序没有显示任何输出。我检查了我的随机数程序,它工作正常,但我认为存储和打印存在一些问题。 这是我的代码:

    .model small
    .stack 100h
    .data
    arrayelement db 100 dup('$'); To store array
    randomnumber db 0; to store random number
    r1 db ?
    .code
    main proc
        mov ax,@data
        mov ds,ax
  
        mov cx,100
        mov si,offset arrayelement
        forr:
    
            call random
            mov al,randomnumber
            mov [si],al
            inc si
            
        loop forr
    
        mov dl,10
        mov ah,02h
        int 21H
        mov dl,13
        mov ah,02h
        int 21H
    
        mov si,offset arrayelement
        mov cx,100
        for1:
        mov dl,[si]
        ;add dl,48
        mov ah,02
        int 21h
        inc si
        loop for1
        
        mov ah,4ch
        int 21h
    main endp
;Random procedure to print randomnumber between 1 to 5
    random proc
        mov ax,0
        mov bx,0
        mov cx,0
        mov dx,0
;Loop to slow down time so it print different random number on each call
      mov cx,500
      l11:
        push cx
        mov cx,500
      l222:
        Loop l222
        pop cx
        Loop l11
      MOV AH, 00h  ; interrupts to get system time        
       INT 1AH      ; CX:DX now hold number of clock ticks since midnight      
    
       mov  ax, dx
       xor  dx, dx
       mov  cx, 5 ;Ending  
     
       div  cx       ; here dx contains the remainder of the division - from 1-5
    
       add  dl, 1  ; start--to ascii from '1' to '5'
       mov randomnumber,dl
      
      ret
      random endp
    end main

【问题讨论】:

使用调试器单步执行代码:当random 返回时,CX 始终为 5,因此始终采用 loop。为您的函数不会破坏的循环计数器使用寄存器。此外,您可以使用任何一次播种的 PRNG 算法,而不是使用延迟循环(!)来让时钟计时。您可以像普通函数一样在 AL 中返回随机数,甚至可以在已经存在的 DL 中返回随机数。您通常不需要使用全局变量。 TASM infinite loop 的重复 - 函数调用破坏循环计数器的相同问题,但没有人支持我的答案。我确定肯定还有其他重复项,但很难找到它们。 【参考方案1】:
.model small
.stack 100h
.data
arrayelement db 100 dup('$'); To store name
randomnumber db 0; to store random number
r1 db ?
.code
main proc
    mov ax,@data
    mov ds,ax
    
    mov cx,100
    mov si,offset arrayelement
    forr:

        call random
        mov al,randomnumber
        mov [si],al
        inc si
        
    loop forr

    mov dl,10
    mov ah,02h
    int 21H
    mov dl,13
    mov ah,02h
    int 21H

    mov si,offset arrayelement
    mov cx,100
    for1:
    mov dl,[si]
    add dl,48
    mov ah,02
    int 21h
    inc si
    loop for1
    
    mov ah,4ch
    int 21h
main endp
random proc
    push cx
    push ax
    push dx
  mov cx,500
  l11:
    push cx
    mov cx,500
  l222:
    Loop l222
    pop cx
    Loop l11
  MOV AH, 00h  ; interrupts to get system time        
   INT 1AH      ; CX:DX now hold number of clock ticks since midnight      

   mov  ax, dx
   xor  dx, dx
   mov  cx, 5 ;Ending  
 
   div  cx       ; here dx contains the remainder of the division - from 1-5

   add  dl, 1  ; start--to ascii from '1' to '5'
   mov randomnumber,dl
  pop cx
    pop ax
    pop dx
  ret

  random endp
end main

【讨论】:

我看到您已尝试按照@PeterCordes 提供的评论更正您的程序。保留堆栈中涉及的寄存器是可以的,但您必须以相反的顺序恢复这些寄存器,因为堆栈就是这样工作的。它是后进先出。所以push cxpush axpush dx必须最终导致pop dxpop axpop cxret 为了把这个答案变成我们可以投票的东西(我很乐意这样做),您需要用自己的话解释原始问题中的问题是如何解决的。仅包含代码而没有其他内容的答案通常不被认为是好的答案!

以上是关于将随机数存储在字节数组中的主要内容,如果未能解决你的问题,请参考以下文章

Java - 将字节数组作为字符串存储在数据库中,并使用字符串值创建字节数组

将固定字节从输入流存储到字节数组中

编辑存储在字节数组中的数据

将字节数组转换为位集

将字节变量添加到字节数组中的正确方法

在java中如何把字节数组存储到数据库?