天天看點

産生随機數

Code  Segment;定義段

   Assume CS:Code,DS:Code,ES:Code; 建立段寄存器尋址

; -----------------------------------------

; 功能:輸出一個字元 

; 入口:dl=要顯示的字元 

Output_Chr  proc  Near ;定義過程.

   push  ax ;壓入堆棧

   mov  ah,02h  ;調用中斷輸出一個數

   int  21h 

   pop  ax ;彈出堆棧

   ret ;過程傳回

Output_Chr  endp ;過程結束

; ----------------------------------------- 

; 功能:把AX中的二進制無符号數轉換成顯式的十進制ASCII碼,并送顯示屏顯示

; 入口:AX=二進制數 

; 出口:在目前光标位置顯示轉換後的ASCII碼數字 

Dec_ASCII  Proc  Near 

   push  dx ;壓入堆棧

   push  bx ;壓入堆棧

   push  di;壓入堆棧

   mov  bx,10 

   lea  di,@@Temp_Save[6] ;LEA DX,string ;把偏移位址存到DX

   mov  byte ptr [di],'$' 

   dec  di ;減 1

   cld ;清方向标志位.

@@Divide:  xor  dx,dx ;異或運算

           div  bx ;無符号除法.

           or   dl,30h ;或運算

           mov  [di],dl 

           dec  di ;減 1

           test  ax,0ffffh ;測試指令

           jnz  @@Divide ;條件轉移指令 

           inc  di ;加 1.

           push  di ;壓入堆棧

           pop  dx ;彈出堆棧

           mov  ah,9 

           int  21h 

           pop  di ;彈出堆棧

           pop  bx ;彈出堆棧

           pop  dx;彈出堆棧

           ret ;過程傳回

@@Temp_Save db   7 dup(?)

Dec_ASCII  EndP

Press_Key db   13,10,13,10,'Press any key to exit...$' 

Start:   push cs;壓入堆棧

         pop  ds;彈出堆棧

         push es;壓入堆棧

         pop  es;彈出堆

         mov  cx,6;随機産生25個1~6的随機數                           

@@L1:  xor  al,al;異或運算

       out  43h,al;I/O端口輸出文法: OUT {端口号│DX},累加器 

       in  al,40h;I/O端口輸入文法: IN 累加器, {端口号│DX} 

       cmp  al,6;比較.(兩操作數作減法,僅修改标志位,不回送結果).

       ja  @@L1   ;大于6則繼續産生随機數

       cmp al,0   ;等于0則繼續産生随機數

       jz @@L1

       xor  ah,ah;異或運算,清0

       call Dec_ASCII ;顯示輸出這個數

       mov  dl,20h

       call Output_Chr

       loop @@L1

       lea  dx,Press_Key; LEA DX,string ;把偏移位址存到DX.

       mov  ah,9

       int  21h

       mov  ah,1

Exit_Proc: mov  ah,4ch ;結束程式

           int  21h

Code  ENDS

END   Start

本文轉自蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366798,如需轉載請自行聯系原作者