⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 random.asm

📁 将cpp换成htm
💻 ASM
字号:
;**************************************************
;	以下代码由“老罗代码着色器”0.2版进行着色
;	测试文件名:Random.asm
;	测试日期:  2002-12-29
;**************************************************

;*********************************************************
;程序名称:随机数的产生原理与实现
;作者:罗聪
;日期:2002-11-21
;出处:http://www.LuoCong.com(老罗的缤纷天地)
;注意事项:如欲转载,请保持本程序的完整,并注明:
;转载自“老罗的缤纷天地”(http://www.LuoCong.com)
;*********************************************************

.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

WndProc         proto :DWORD, :DWORD, :DWORD, :DWORD
iRand           proto :DWORD, :DWORD

.const
IDC_BUTTON_GENERATE equ 3000
IDC_EDIT_FIRST      equ 3001
IDC_EDIT_SECOND     equ 3002

.data
szDlgName           db  "lc_dialog", 0
szCaption           db  "Rand Number Generator by LC", 0
szText              db  255 dup(0)
szTemplate          db  "(%d ~ %d)随机数:", 13, 10, 13, 10,\
                        "         %d", 13, 10, 13, 10,\
                        "老罗的缤纷天地", 13, 10,\
                        "http://www.LuoCong.com", 0
nFirst              dd  0
nSecond             dd  0

.code
main:
    invoke GetModuleHandle, NULL
    invoke DialogBoxParam, eax, offset szDlgName, 0, WndProc, 0
    invoke ExitProcess, eax

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    LOCAL hEdit: HWND

    .if uMsg == WM_CLOSE
        invoke EndDialog, hWnd, 0
        
    .elseif uMsg == WM_COMMAND
        mov eax, wParam
        mov edx, eax
        shr edx, 16
        movzx eax, ax
        .if edx == BN_CLICKED
            .if eax == IDCANCEL
                invoke EndDialog, hWnd, NULL
            .elseif eax == IDC_BUTTON_GENERATE || eax == IDOK
                ;获得上限:
                invoke GetDlgItemInt, hWnd, IDC_EDIT_FIRST, NULL, TRUE
                mov nFirst, eax
                ;获得下限:
                invoke GetDlgItemInt, hWnd, IDC_EDIT_SECOND, NULL, TRUE
                mov nSecond, eax
                ;产生随机数:
                invoke iRand, nFirst, nSecond
                ;输出:
                invoke wsprintf, addr szText, addr szTemplate, nFirst, nSecond, eax
                invoke MessageBox, hWnd, addr szText, addr szCaption, MB_OK or MB_ICONINFORMATION
            .endif
        .endif
    .else
        mov eax, FALSE
        ret
    .endif
    mov eax, TRUE
    ret
WndProc endp

;**********************************************************************
; 函数功能:产生范围从 first 到 second 的随机数
; 传入参数:
;           first  = 下限
;           second = 上限
; 返回参数:
;           eax = Rand_Number
; 所用公式:
;           Rand_Number = (Rand_Seed * X + Y) mod Z
; 补充说明:
;           (1)本例中用 GetTickCount 来取得随机数种子,
;              在实际应用中,可用别的方法代替。
;           (2)要产生随机数,X和Y其中之一必须是素数,
;              所以 X = 23, Y = 7(可用别的素数代替)
;**********************************************************************
iRand   proc uses ecx edx first:DWORD, second:DWORD
    invoke GetTickCount ; 取得随机数种子,当然,可用别的方法代替
    mov ecx, 23         ; X = ecx = 23
    mul ecx             ; eax = eax * X
    add eax, 7          ; eax = eax + Y (Y = 7)
    mov ecx, second     ; ecx = 上限
    sub ecx, first      ; ecx = 上限 - 下限
    inc ecx             ; Z = ecx + 1 (得到了范围)
    xor edx, edx        ; edx = 0
    div ecx             ; eax = eax mod Z (余数在edx里面)
    add edx, first      ; 修正产生的随机数的范围
    mov eax, edx        ; eax = Rand_Number
    ret
iRand   endp

end main
;********************   over    ********************
;by LC

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -