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

文章展示了使用C语言实现的各种功能,包括在指定范围内填充数组、数组元素求和、成绩计算、大学注册模拟、布尔逻辑运算、颜色与概率、消息加密、PIN验证以及奇偶性检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值