1. 填充数组
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
ARYCNT = 64
dwNumAry DWORD ARYCNT DUP(0)
.code
BetterRandom PROC Start:DWORD, EndStart:DWORD
mov eax, EndStart
sub eax, Start
call RandomRange
add eax, Start
ret
BetterRandom ENDP
PrintAry PROC pAry:PTR DWORD, dwCnt:DWORD
mov ecx, dwCnt
mov edi, pAry
L0:
mov eax, [edi]
call WriteDec
call Crlf
add edi, TYPE DWORD
loop L0
ret
PrintAry ENDP
FillAry PROC pNumAry:PTR DWORD, dwFillCnt:DWORD, dwStart:DWORD, dwEnd:DWORD
mov ecx, dwFillCnt
xor eax, eax
mov edi, pNumAry
L0:
; 获得对应范围的随机数
push dwEnd
push dwStart
call BetterRandom
mov DWORD PTR [edi], eax
add edi, TYPE DWORD
loop L0
mov eax, dwFillCnt
ret
FillAry ENDP
start:
call Randomize
invoke FillAry, OFFSET dwNumAry, ARYCNT, 10, 20
invoke PrintAry, OFFSET dwNumAry, eax
call WaitMsg
invoke ExitProcess, 0
end start
2. 指定范围内的数组元素求和
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
ARYCNT = 64
sdwAry SDWORD ARYCNT DUP(0)
.code
PrintSpace PROC
mov al, 20h
call WriteChar
ret
PrintSpace ENDP
BetterRandom PROC Start:SDWORD, EndStart:SDWORD
mov eax, EndStart
sub eax, Start
call RandomRange
add eax, Start
ret
BetterRandom ENDP
PrintAry PROC pAry:PTR SDWORD, dwCnt:DWORD
mov ecx, dwCnt
mov edi, pAry
L0:
mov eax, [edi]
call WriteInt
call PrintSpace
add edi, TYPE SDWORD
loop L0
ret
PrintAry ENDP
FillAry PROC pNumAry:PTR SDWORD, dwFillCnt:DWORD, dwStart:DWORD, dwEnd:DWORD
mov ecx, dwFillCnt
xor eax, eax
mov edi, pNumAry
L0:
; 获得对应范围的随机数
push dwEnd
push dwStart
call BetterRandom
mov DWORD PTR [edi], eax
add edi, TYPE DWORD
loop L0
mov eax, dwFillCnt
ret
FillAry ENDP
ArySum PROC psdwAry:PTR SDWORD, dwCnt:DWORD, dwStart:DWORD, dwEnd:DWORD
mov edi, psdwAry
; 数组合法性检测
mov eax, dwEnd
cmp eax, dwStart
jb Ending
cmp eax, dwCnt
jae Ending
; 确定数量
sub eax, dwStart
mov ecx, eax
inc ecx
; 数组启始位置
mov ebx, dwStart
xor eax, eax
L0:
add eax, DWORD PTR [edi + ebx * TYPE SDWORD]
inc ebx
loop L0
Ending:
ret
ArySum ENDP
start:
invoke FillAry, OFFSET sdwAry, ARYCNT, -100, 50
invoke PrintAry, OFFSET sdwAry, ARYCNT
call Crlf
invoke ArySum, OFFSET sdwAry, ARYCNT, 3, 7
call WriteInt
call Crlf
call WaitMsg
invoke ExitProcess, 0
end start
3. 计算考试得分
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib
.code
PrintSpace PROC USES eax
mov al, 20h
call WriteChar
ret
PrintSpace ENDP
; 获取50-100的随机数
BetterRandom PROC Start:SDWORD, EndStart:SDWORD
mov eax, EndStart
sub eax, Start
call RandomRange
add eax, Start
ret
BetterRandom ENDP
CalcGrade PROC Grade:BYTE
; 检测分数是否合理, BYTE的范围是0-255, 所以只要检测上限
cmp Grade, 100
ja Ending
mov al, Grade
; 进入switch分支
cmp al, 90
jb BLevel
mov al, 'A'
jmp Ending
BLevel:
cmp al, 80
jb CLevel
mov al, 'B'
jmp Ending
CLevel:
cmp al, 70
jb DLevel
mov al, 'C'
jmp Ending
DLevel:
cmp al, 60
jb Ooops
mov al, 'D'
jmp Ending
Ooops:
mov al, 'F'
Ending:
ret
CalcGrade ENDP
start:
call Randomize
mov ecx, 10
xor eax, eax
L0:
; 生成50-100的随机数
invoke BetterRandom, 50, 100
call WriteDec
; 打印分数
call PrintSpace
; 计算成绩
push eax
call CalcGrade
; 打印等级
call WriteChar
call Crlf
loop L0
call WaitMsg
invoke ExitProcess, 0
end start
4. 大学注册
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
EnterOkay BYTE "学生注册成功", 0
EnterNo BYTE "学生注册失败", 0
PromptCred BYTE "请输入学分: ", 0
PromptAvg BYTE "请输入平均成绩: ", 0
PromptCredErr BYTE "学分只能在1-30范围内!", 0dh, 0ah, 0
dwAvgGrade DWORD 0
dwCredit DWORD 0
.code
PrintSpace PROC USES eax
mov al, 20h
call WriteChar
ret
PrintSpace ENDP
; 获取50-100的随机数
BetterRandom PROC Start:SDWORD, EndStart:SDWORD
mov eax, EndStart
sub eax, Start
call RandomRange
add eax, Start
ret
BetterRandom ENDP
InputGradeAndCredits PROC USES edx edi eax pAvgGrade:PTR DWORD, pCredit:PTR DWORD
L0:
; 清屏幕
call Clrscr
; 输入学分
mov edx, OFFSET PromptCred
call WriteString
call ReadInt
cmp eax, 1
jl CreditInputErr
cmp eax, 30
jg CreditInputErr
; 保存学分
mov edi, pCredit
mov DWORD PTR [edi], eax
; 输入平均成绩
mov edx, OFFSET PromptAvg
call WriteString
call ReadInt
; 保存平均成绩
mov edi, pAvgGrade
mov DWORD PTR [edi], eax
jmp Ending
CreditInputErr:
; 提示学分输入错误信息
push edx
mov edx, OFFSET PromptCredErr
call WriteString
call Crlf
call WaitMsg
pop edx
jmp L0
Ending:
ret
InputGradeAndCredits ENDP
CheckGradeAndCredit PROC AvgGrade:DWORD, Credit:DWORD
mov eax, AvgGrade
cmp eax, 350
ja OkayReg
cmp eax, 250
jna OnlyCredit
mov eax, Credit
cmp eax, 16
jbe OkayReg
OnlyCredit:
mov eax, Credit
cmp eax, 12
jbe OkayReg
xor eax, eax
jmp NoReg
OkayReg:
mov eax, 1
NoReg:
ret
CheckGradeAndCredit ENDP
start:
push OFFSET dwCredit
push OFFSET dwAvgGrade
call InputGradeAndCredits
push dwCredit
push dwAvgGrade
call CheckGradeAndCredit
test eax, eax
jz FailReg
mov edx, OFFSET EnterOkay
jmp Output
FailReg:
mov edx, OFFSET EnterNo
Output:
call WriteString
call Crlf
call WaitMsg
invoke ExitProcess, 0
end start
5. 布尔计算机
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
; 菜单项
MenuTbl BYTE "1. x AND Y", 0dh, 0ah, \
"2. x OR y", 0dh, 0ah, \
"3. NOT x", 0dh, 0ah, \
"4. x XOR y", 0dh, 0ah, \
"5. 退出程序", 0dh, 0ah, \
"输入: ", 0
ErrChoicePrompt BYTE "请输入1-5命令", 0
FinalChoice DWORD 0
FirstNum DWORD 0
SecondNum DWORD 0
.code
PrintSpace PROC USES eax
mov al, 20h
call WriteChar
ret
PrintSpace ENDP
InputTwoNum PROC pdwNum0:PTR DWORD, pdwNum1:PTR DWORD
; 输入第1个数字
mov ebx, pdwNum0
call ReadInt
mov [ebx], eax
; 输入第2个数字
mov ebx, pdwNum1
call ReadInt
mov [ebx], eax
ret
InputTwoNum ENDP
Menu PROC
L0:
call Clrscr
; 显示菜单
mov edx, OFFSET MenuTbl
call WriteString
; 输入内容
call ReadInt
cmp eax, 1
jb ErrPrompt
cmp eax, 5
ja ErrPrompt
; 保存最终值
mov FinalChoice, eax
jmp Ending
ErrPrompt:
mov edx, OFFSET ErrChoicePrompt
call WriteString
call Crlf
call WaitMsg
jmp L0
Ending:
ret
Menu ENDP
BooleanCalc PROC
L0:
; 显示菜单并保存选择
call Menu
; 如果是5则直接退出
cmp eax, 5
je Ending
; 是否是not操作
cmp eax, 3
jz NotOpa
; 清屏
call Clrscr
; 输入数字
invoke InputTwoNum, OFFSET FirstNum, OFFSET SecondNum
; 清屏
call Clrscr
; 查看计算选项
mov eax, FinalChoice
cmp eax, 1
jnz @F
; and
mov eax, FirstNum
and eax, SecondNum
jmp ShowResult
@@:
cmp eax, 2
jnz @F
; or
mov eax, FirstNum
or eax, SecondNum
jmp ShowResult
NotOpa:
call Clrscr
call ReadInt
not eax
jmp ShowResult
@@:
; xor
mov eax, FirstNum
xor eax, SecondNum
ShowResult:
call WriteInt
call Crlf
call WaitMsg
jmp L0
Ending:
ret
BooleanCalc ENDP
start:
call BooleanCalc
call WaitMsg
invoke ExitProcess, 0
end start
6. 布尔计算机(2)
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
; 菜单项
MenuTbl BYTE "1. x AND Y", 0dh, 0ah, \
"2. x OR y", 0dh, 0ah, \
"3. NOT x", 0dh, 0ah, \
"4. x XOR y", 0dh, 0ah, \
"5. 退出程序", 0dh, 0ah, \
"输入: ", 0
ErrChoicePrompt BYTE "请输入1-5命令", 0
FinalChoice DWORD 0
FirstNum DWORD 0
SecondNum DWORD 0
Prompt2HexNum BYTE "请输入2个十六进制数: ", 0
PromptHexNum BYTE "请输入1个十六进制数: ", 0
.code
PrintSpace PROC USES eax
mov al, 20h
call WriteChar
ret
PrintSpace ENDP
InputTwoNum PROC pdwNum0:PTR DWORD, pdwNum1:PTR DWORD
mov edx, OFFSET Prompt2HexNum
call WriteString
call Crlf
; 输入第1个数字
mov ebx, pdwNum0
call ReadHex
mov [ebx], eax
; 输入第2个数字
mov ebx, pdwNum1
call ReadHex
mov [ebx], eax
ret
InputTwoNum ENDP
Menu PROC
L0:
call Clrscr
; 显示菜单
mov edx, OFFSET MenuTbl
call WriteString
; 输入内容
call ReadInt
cmp eax, 1
jb ErrPrompt
cmp eax, 5
ja ErrPrompt
; 保存最终值
mov FinalChoice, eax
jmp Ending
ErrPrompt:
mov edx, OFFSET ErrChoicePrompt
call WriteString
call Crlf
call WaitMsg
jmp L0
Ending:
ret
Menu ENDP
BooleanCalc PROC
L0:
; 显示菜单并保存选择
call Menu
; 如果是5则直接退出
cmp eax, 5
je Ending
; 是否是not操作
cmp eax, 3
jz NotOpa
; 清屏
call Clrscr
; 输入数字
invoke InputTwoNum, OFFSET FirstNum, OFFSET SecondNum
; 清屏
call Clrscr
; 查看计算选项
mov eax, FinalChoice
cmp eax, 1
jnz @F
; and
mov eax, FirstNum
and eax, SecondNum
jmp ShowResult
@@:
cmp eax, 2
jnz @F
; or
mov eax, FirstNum
or eax, SecondNum
jmp ShowResult
NotOpa:
call Clrscr
mov edx, OFFSET PromptHexNum
call WriteString
call ReadHex
not eax
jmp ShowResult
@@:
; xor
mov eax, FirstNum
xor eax, SecondNum
ShowResult:
call WriteHex
call Crlf
call WaitMsg
jmp L0
Ending:
ret
BooleanCalc ENDP
start:
call BooleanCalc
call WaitMsg
invoke ExitProcess, 0
end start
7. 概率和颜色
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
TestStr BYTE "测试", 0
.code
PrintSpace PROC USES eax
mov al, 20h
call WriteChar
ret
PrintSpace ENDP
GetFgColor PROC
mov eax, 10
call RandomRange
cmp eax, 2
ja @F
; white
mov eax, white
jmp Ending
@@:
cmp eax, 3
jnz @F
; blue
mov eax, blue
jmp Ending
@@:
; green
mov eax, green
Ending:
call SetTextColor
mov edx, OFFSET TestStr
call WriteString
ret
GetFgColor ENDP
start:
call Randomize
mov ecx, 10
L0:
call GetFgColor
call Crlf
loop L0
call WaitMsg
invoke ExitProcess, 0
end start
8. 消息加密
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
OriginBuf BYTE 64 DUP(0)
BufLen DWORD 0
Key BYTE "ABXmv#7", 0
KeyLen = 7
PromptInput BYTE "请输入原文: ", 0
.code
PrintSpace PROC USES eax
mov al, 20h
call WriteChar
ret
PrintSpace ENDP
Crypto PROC pbBuf:PTR DWORD, dwLen:DWORD
mov ecx, dwLen
xor esi, esi
mov ebx, KeyLen
mov edi, pbBuf
; 进行加密
L0:
; 获取密钥的当前指针
mov eax, esi
xor edx, edx
div ebx
; 获取当前密钥
mov al, BYTE PTR [Key + edx]
; 进行加密
xor BYTE PTR [edi + esi], al
inc esi
loop L0
ret
Crypto ENDP
SymCrypto PROC
; 提示用户输入
mov edx, OFFSET PromptInput
call WriteString
mov edx, OFFSET OriginBuf
mov ecx, SIZEOF OriginBuf
call ReadString
; 保存输入的长度
mov BufLen, eax
; 进行加密
invoke Crypto, OFFSET OriginBuf, BufLen
mov edx, OFFSET OriginBuf
call WriteString
call Crlf
; 进行解密
invoke Crypto, OFFSET OriginBuf, BufLen
mov edx, OFFSET OriginBuf
call WriteString
call Crlf
ret
SymCrypto ENDP
start:
call SymCrypto
call WaitMsg
invoke ExitProcess, 0
end start
9. PIN验证
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
bMaxPIN BYTE 9, 5, 8, 4, 6
bMinPIN BYTE 5, 2, 4, 1, 3
RightPIN BYTE "PIN是正确的", 0dh, 0ah, 0
WrongPIN BYTE "PIN是错误的", 0dh, 0ah, 0
MyWrongPIN BYTE 4, 3, 5, 3, 4
MyRightPIN BYTE 5, 2, 4, 1, 3
.code
PrintSpace PROC USES eax
mov al, 20h
call WriteChar
ret
PrintSpace ENDP
InRange PROC USES ebx bNum:BYTE, bLow:BYTE, bHigh:BYTE
mov bl, bNum
cmp bl, bLow
jb Ooops
cmp bl, bHigh
ja Ooops
mov eax, 1
jmp Ending
Ooops:
xor eax, eax
Ending:
ret
InRange ENDP
CheckPIN PROC pbPIN:PTR BYTE
mov esi, pbPIN
mov ecx, 5
L0:
invoke InRange, BYTE PTR [esi], BYTE PTR bMinPIN, BYTE PTR bMaxPIN
test eax, eax
jz @F
loop L0
mov edx, OFFSET RightPIN
call WriteString
jmp Ending
@@:
mov edx, OFFSET WrongPIN
call WriteString
Ending:
ret
CheckPIN ENDP
start:
invoke CheckPIN, OFFSET MyWrongPIN
call Crlf
invoke CheckPIN, OFFSET MyRightPIN
call Crlf
call WaitMsg
invoke ExitProcess, 0
end start
10. 奇偶性检查
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
ChkAry BYTE 5, 9, 11, 15, 21, 26, 92, 55, 63, 25
.code
PrintSpace PROC USES eax
mov al, 20h
call WriteChar
ret
PrintSpace ENDP
CheckByte PROC USES ebx ecx ByteChk:BYTE
mov ecx, 8
movzx eax, BYTE PTR ByteChk
xor ebx, ebx
L0:
push eax
and eax, 1
test eax, eax
pop eax
jz @F
inc ebx
@@:
shr eax, 1
loop L0
mov eax, ebx
ret
CheckByte ENDP
start:
mov ecx, LENGTHOF ChkAry
mov esi, OFFSET ChkAry
xor ebx, ebx
L0:
movzx eax, BYTE PTR [esi]
push eax
call CheckByte
add ebx, eax
inc esi
loop L0
mov eax, ebx
call WriteDec
call WaitMsg
invoke ExitProcess, 0
end start
(完)