【问题标题】:Assembly Language Random Number Generator汇编语言随机数生成器
【发布时间】:2012-04-11 02:56:18
【问题描述】:

我最近开始学习汇编语言。对于我正在从事的项目,我必须使用线性同余制作一个随机数生成器。我想取三个数字。一个上限、一个下限和我想要多少个随机数。至于我想出的获取随机数的公式……

randomNumber = (seed % (upper-lower) + lower)

然后我尝试将其放入代码中。 我想出了这个

.data
  upper BYTE 100      ;setting upper limit 100
  lower BYTE 0        ;setting lower limit 0
  number BYTE 5       ;number of random numbers

.code
call main
exit

main proc

   cls    
   mov bx,upper            ;moving upper bound into bx
   mov dx,lower            ;moving lower bound into dx
   mov ax,2914017          ;taking a random number for this trial
   mov ecx,number          ;setting the loop counter
L1:
   sub bx,dx               ;(upper-lower)
   div bx               
   add ah,dx               ;(randomNumber mod (bx) + lower

main endp

我很好奇如何在每个循环周期结束时打印出随机数。如果上面的代码有意义的话。

提前致谢!

【问题讨论】:

  • 如果这是在 Windows 上,那么这里有一些建议:stackoverflow.com/questions/1922134/…
  • 打印是高度特定于平台的。你想在哪里组装和执行这个?微软DOS?视窗? Linux?此外,这条指令不会飞:“mov ax,2914017”——ax 是一个 16 位寄存器,最大值为 65535。然而,eax 是 32 位。
  • 这是各种错误。最重要的是,该表达式不会产生新的种子。通常,您需要在取模之前乘以并添加一些精心挑选的常数。其次,div bxdx:ax 除以bx,但您没有将dx 归零。将lower 加载到esiedi。 (并且使用movzx 执行此操作,因为它们的内存位置是字节。您正在使用字加载加载它们,因此mov dx, [lower] 会将0x500 放入dx。)
  • 实现这里讨论的应该相对简单:imgs.xkcd.com/comics/random_number.png

标签: assembly random x86 numbers prng


【解决方案1】:

您的问题的答案取决于平台,因此您需要指定这一点,我们可以以更具体的方式为您提供帮助。

但实地址模式(例如 MS-DOS)中的常用方法是调用中断并将数据发送到 SO(标准输出)。

示例(%macro 关键字是 NASM 理解的预处理器指令 - 但并非所有编译器都使用它,但为了清楚起见,我将其包括在内):

%macro printLn 1
        mov ah, 09h ; 9h means "write a string" on screen
        mov edx, %1
        int 21h ; call the ISR for MS-DOS Services
%endmacro        

[SECTION .text]

mystart:
        printLn string
        ret

[SECTION .data]
string  db      "This is a string of text", 13, 10, '$'

另一种方法可能是直接挂钩 C-Lib 函数并以这种方式输出。

字符代码请参考the ASCII Table

还请记住,正如下面提到的 drhirsch,如果您打算输出整数,则需要将这些值转换为您的 ISR 可以处理的形式,例如十六进制等价物。然后,您将需要编写一个附加函数来“翻译”这些值。 This question 就是我所指的一个很好的例子。

【讨论】:

  • int 01fh?你确定你说的不是int 21h
  • 打印前需要将数字转换成ASCII码
猜你喜欢
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多