将随机数存储在字节数组中
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 cx
push ax
push dx
必须最终导致pop dx
pop ax
pop cx
ret
为了把这个答案变成我们可以投票的东西(我很乐意这样做),您需要用自己的话解释原始问题中的问题是如何解决的。仅包含代码而没有其他内容的答案通常不被认为是好的答案!以上是关于将随机数存储在字节数组中的主要内容,如果未能解决你的问题,请参考以下文章