3

最近アセンブリ言語を勉強し始めました。私が取り組んでいるプロジェクトでは、線形合同を使用して乱数ジェネレーターを作成する必要があります。3 つの数字を入力するとします。上限、下限、および必要な乱数の数。私が思いついた乱数を取得するための式については....

randomNumber = (シード % (上下) + 下限)

次に、これをコードに入れてみました。私はこれを思いついた

.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

各ループサイクルの最後に乱数を出力する方法に興味があります。そして、上記のコードが意味をなす場合。

前もって感謝します!

4

1 に答える 1

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, '$'

もう 1 つの方法は、C-Lib 関数を直接フックして、そのように出力することです。

文字コードについては、ASCII テーブルを参照してください。

また、drhirsch が後述するように、整数を出力する場合は、それらの値を ISR が処理できる形式 (16 進数など) に変換する必要があることを覚えておいてください。次に、値を「変換」する追加の関数を作成する必要があります。この質問は、私が言及していることの良い例です。

于 2012-04-30T16:03:59.807 に答える