上次那贴虽然有一定的点击率(再议汇编判断闰年(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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!