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

       int  21h

Exit_Proc: mov  ah,4ch ;结束程序

           int  21h

Code  ENDS

END   Start