首页
社区
课程
招聘
[旧帖] [原创]简单随即数抽取(16位实模式) 0.00雪花
发表于: 2010-7-10 16:36 1354

[旧帖] [原创]简单随即数抽取(16位实模式) 0.00雪花

2010-7-10 16:36
1354
上次那贴虽然有一定的点击率(再议汇编判断闰年(16位实模式)),但是不久就沉下去了。没有"骗到"邀请码更没有积到足够的金币,所以在此操刀杀个"回马枪"。
  今天就讲讲实模式下随即数的抽取吧。可能会有人有质疑,为什么对我总是对16位的东西纠缠不休?说来可悲,我就会两种语言:C/C++ 、 汇编 16 32;由于本论坛主要是涉及汇编为主所以C/C++ 的内容也就不是很好的鱼饵了(钓鱼用的鱼饵),所以只有用汇编来发发贴喽。而汇编中16位的我看了有段时间而32位的才刚接触所以也不拿出来卖弄了。版主看到了请别暗暗骂我,没办法想钓鱼就得拿点东西撒;既然没多少破解知识就只有拿些其他的内容了。。。
  此贴还是针对<25个经典汇编程序>中的内容进行重新的改进,代码不一定精炼但是一定思路会很清晰的。而且注解也会相当的清楚。
  在<25个经典汇编程序>中的随即代码实在是让人看了不舒服,而且最终结果也是让人不甚满意。所以我就依照原著的思路重新进行修改,随即抽取数的范围也仅限于0-9这10个数字间的任何一个数。如果大伙需要更大的数字随便改改就能成功的,我给的代码很清楚添加会很方便的(自认为)。废话不说了,我把代码贴出来。。。

  思路简述:抽取随即数的思路其实很简单,就是抽取计算机的时钟变化。计算机中的秒针运动最频繁所以就专门抽取其中的秒最为随即数的种子。

assume       cs:code, ds:data

data       segment
       second_mem       db      2 dup (0),'$'
       array            db      1, 2, 4, 8, 16, 32, 64, 128,'$'   ;默认为十进制数据
           ;由于本代码使用的是21号中断的功能9,而功能9需要以 $ 符号来判断结尾。所以在数据段中的数据均以 $ 结尾
data       ends

stack_     segment      stack
       db       200 dup (0)
stack_     ends

code       segment
start:
       mov       ax,       data
       mov       ds,       ax
       ;
       call      GET_NUM
      
       lea       dx,       second_mem        ;此处就是21号中断功能9被使用的代码段 作用是将内容输出至屏幕
       mov       ah,       9
       int       21h
       ;
       mov       ah,       4ch
       int       21h

;***********************************************************************************************
;子程序名:GET_NUM
;功    能:抽取系统时钟的秒表的0-9的变化
;入口参数:
;出口参数:second_mem      
GET_NUM       PROC
       mov       ah,       2
       int       1ah
       ;int 1ah 读取实时时钟的中断号
       ;CH=BCD码小时值,CL=BCD码分值,DH=BCD码秒值  注意:是BCD码的值
          
       mov       al,       dh
       ;只要秒表的值
          
       push      bx
       call      BCD_TO_HEX
       xchg      bh,       bl
       add       bx,       30h                                    ;想将数据输出到屏幕必须是ASCII而不是我们所使用的16进制数据或者其他
       mov       word ptr second_mem,       bx
       pop       bx
      
       ret      
GET_NUM       ENDP
;***********************************************************************************************

;***********************************************************************************************
;子程序名:BCD_TO_HEX
;功    能:将接收到的BCD码转换成为可处理的数据
;入口参数:AL =  
;出口参数:BH = / BX =  
BCD_TO_HEX    PROC

       xor       bx,       bx
       ;清理寄存器
      
       mov       cx,       8                ;循环次数为8
       lea       si,       array            ;取自定义数组的首地址
       and       al,       0fh              ;只提取0-9的变化值  其他数据屏蔽
repeat_:
       shr       al,       1
       jc        pro
       inc       si
       jmp       tail      
pro:
       mov       bl,       byte ptr [si]
       add       bh,       bl
       inc       si      
tail:
       loop      repeat_
       xor       bl,       bl               ;清除bl中的数据,该数据是每次提取数组中的值
       ret
BCD_TO_HEX    ENDP
;***********************************************************************************************

;
code          ends
              end       start

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 72
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
子程序算法分析:

;子程序名:BCD_TO_HEX
;功    能:将接收到的BCD码转换成为可处理的数据
;入口参数:AL =
;出口参数:BH = / BX =
BCD_TO_HEX    PROC

       xor       bx,       bx               ;清零
      
       mov       cx,       8
       lea       si,       array
       and       al,       0fh              ;只提取0-9的变化值,将其他数据屏蔽

repeat_:
       shr       al,       1
       jc        pro
       inc       si
       jmp       tail

;      shr 向右移位指令,其中的最低位在每次移位是进入标志寄存器CF中
;      jc  判断当 CF 中的数据为1的时候则跳      
pro:
       mov       bl,       byte ptr [si]
       add       bh,       bl
       inc       si

;      array            db      1, 2, 4, 8, 16, 32, 64, 128,'$'
                                ^  ^  ^  ^   ^   ^   ^    ^
;                               0  1  2  3   4   5   6    7
;      将数组中 si 对应的数据提取出来, si 的值是多少则对应的以 si 为下标取数
;      比如 si = 2 则对应的数据为 4
;      取出数据后将其与 bh 中的值相加,bh 初始值为 0

;举例:比方说现在 al 实参的数据为 0000 1001  (al 中的数据范围永远是 0-9)
;      则可以根据以上的语句得到如下的式子:1+8=9
;      经过以上分析可以证明,该子程序有将 BCD 码转换成为十进制数据的能力
      
tail:
       loop      repeat_
       xor       bl,       bl
       ret
BCD_TO_HEX    ENDP
2010-7-10 16:37
0
雪    币: 72
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
沙发。。。
  如果大伙发现有错误和需要详细说明的地方,就请留下笔迹。我一定会加以改进的,并且一定给出最详细的说明。
  补充一个疏漏,介绍一款16位的编译器
  MasmEditor 作者是贺远毅,该编译器如果需要调试功能就必须注册。不注册只是少了一个调试的功能而已,咱们可以用里面的Debug去调试效果也是一样的。
2010-7-10 16:42
0
雪    币: 31
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
不懂, 学习中
2010-7-11 18:13
0
雪    币: 2477
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不懂, 学习中
2010-7-23 14:46
0
游客
登录 | 注册 方可回帖
返回
//