2012-04-11 105 views
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 

我很好奇,我怎麼會在每個循環週期結束時打印出隨機數。如果上述代碼有意義。

在此先感謝!

+0

歡迎來到計算器! – menjaraz 2012-04-11 07:16:00

+0

如果這是在Windows上,那麼一些建議在這裏:http://stackoverflow.com/questions/1922134/printing-out-a-number-in-assembly-language – 2012-04-11 07:35:52

+2

打印是高度平臺特定的。你在哪裏試圖組裝和執行這個? MS-DOS?視窗? Linux呢?此外,該指令不會飛行:「mov ax,2914017」 - ax是一個16位寄存器,其最大值爲65535.然而,eax爲32位。 – 2012-04-11 16:57:24

回答

1

您的問題的答案取決於平臺,所以您需要指定這一點,我們可以以更具體的方式幫助您。

但是實地址模式(例如MS-DOS)中常見的方法是調用中斷並將數據發送到SO(標準輸出)。

例子(%宏關鍵字是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-庫功能和輸出。

您應該參考the ASCII Table獲取字符代碼。

另外請記住,正如drhirsch在下面提到的那樣,如果你打算輸出整數,你需要將這些值轉換成你的ISR可以處理的形式,如十六進制等值。然後你需要編寫一個額外的函數來「翻譯」這些值。 This question是我所指的一個很好的例子。

+2

'int 01fh'?你確定你不是指'int 21h'嗎? – 2012-05-01 17:57:28

+2

打印前需要將數字轉換爲ASCII – hirschhornsalz 2012-05-02 16:52:09