• Intel汇编语言程序设计(第7版)第六章编程练习题答案


    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    (完)

  • 相关阅读:
    java的泛型
    如何修改docker容器中的MySQL数据库的密码?
    都说Redux不支持非序列化数据 简单讲解非序列化数据概念 并举例说明
    ROS小车1_ssh远程登陆小车
    linux查找命令使用的正则表达式
    强化学习论文分析3---蜂窝网络联合频谱和功率分配的深度强化学习--《Deep Reinforcement Learning for ......》
    YOLOv8最新改进系列:YOLOv8改进之添加注意力-ContextAggregation,有效涨点!!!
    Avue树结构懒加载子节点不刷新
    linux————zabbix搭建
    大数据安全建设面临哪些挑战
  • 原文地址:https://blog.csdn.net/qq_37232329/article/details/133196146