Intel汇编语言程序设计第六章答案

本文提供了多个使用汇编语言编写的程序示例,包括数组处理、条件判断、字符输入输出等基本操作,通过这些示例可以帮助读者理解汇编语言的基本语法和流程控制。

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

继续更新:

6.1

	INCLUDE Irvine32.inc

	.data
	intArray SWORD 0, 0, 0, 0, 3, 20, 35, -12, 66, 4, 0
	noneMsg BYTE "A non-zero value was not found", 0
	.code
	main PROC
		mov ebx, OFFSET intArray
		mov ecx, LENGTHOF intArray
	L1:
		cmp WORD PTR [ebx], 0
		loopz L2
		cmp ecx, 0
		jnz found
		jmp notFound
	L2:
		add ebx, 2
		jmp L1
	found:
		movsx eax, WORD PTR [ebx]
		call WriteInt
		jmp quit
	notFound:
		mov edx, OFFSET noneMsg
		call WriteString
	quit:
		call Crlf
		exit
	main ENDP
	END main

6.2

	INCLUDE Irvine32.inc

	.data
	array DWORD 10, 60, 20, 33, 72, 89, 45, 65, 72, 18
	ArraySize = $ - array
	sample DWORD 50
	index DWORD 0
	sum DWORD 0
	.code 
	main PROC
		mov ecx, ArraySize
		mov esi, index
	L1:
		cmp ecx, esi
		jbe L2
		mov eax, array[esi]
		cmp eax, sample
		jbe L3
	back:
		add esi, 4
		jmp L1
	L2:
		mov eax, sum
		call WriteDec
		exit
	L3:
		add sum, eax
		jmp back
	main ENDP	
	END main

6.3

	INCLUDE Irvine32.inc

	.data
		Prompt BYTE "Input an integer: ", 0
	.code 
	main PROC
		mov edx, OFFSET Prompt
		call WriteString
		call ReadInt
		cmp eax, 90
		jae L1
		cmp eax, 80
		jae L2
		cmp eax, 70
		jae L3
		cmp eax, 60
		jae L4
		jmp L5
	L1:
		mov al, 'A'
		call WriteChar
		jmp end1
	L2:
		mov al, 'B'
		call WriteChar
		jmp end1
	L3:
		mov al, 'C'
		call WriteChar
		jmp end1
	L4:
		mov al, 'D'
		call WriteChar
		jmp end1
	L5:
		mov al, 'F'
		call WriteChar
	end1:
		exit
	main ENDP	
	END main

6.4

	INCLUDE Irvine32.inc

	.data
		Prompt BYTE "Input an integer: ", 0
		ErrPrompt BYTE "Error!", 0
	.code 
	main PROC
	L0:
		mov edx, OFFSET Prompt
		call WriteString
		call ReadInt
		cmp eax, 100
		ja Err
		cmp eax, 90
		jae L1
		cmp eax, 80
		jae L2
		cmp eax, 70
		jae L3
		cmp eax, 60
		jae L4
		cmp eax, 0
		jb Err
		jmp L5
	L1:
		mov al, 'A'
		call WriteChar
		jmp end1
	L2:
		mov al, 'B'
		call WriteChar
		jmp end1
	L3:
		mov al, 'C'
		call WriteChar
		jmp end1
	L4:
		mov al, 'D'
		call WriteChar
		jmp end1
	L5:
		mov al, 'F'
		call WriteChar
	end1:
		call Crlf
		loop L0
	Err:
		mov edx, OFFSET ErrPrompt
		call WriteString
		call Crlf
		jmp L0
	main ENDP	
	END main

6.5

	INCLUDE Irvine32.inc

	.data
		TRUE = 1
		FALSE = 0
		gradeAverage	WORD 275
		credits			WORD 12
		OkToRegister	BYTE ?
		PromptErr		BYTE "Error!", 0
	.code
	main PROC
		mov OkToRegister, FALSE
		.IF (credits < 1) || (credits > 30)
			mov edx, OFFSET PromptErr
			call WriteString
			call Crlf
			exit
		.ENDIF
		.IF gradeAverage > 350
			mov OkToRegister, TRUE
		.ELSEIF (gradeAverage > 250) && (credits <= 16)
			mov OkToRegister, TRUE
		.ELSEIF (credits <= 12)
			mov OkToRegister, TRUE
		.ENDIF
		exit
	main ENDP
	END main

6.6

	INCLUDE Irvine32.inc

	.data
		TRUE = 1
		FALSE = 0
		gradeAverage	DWORD ?
		credits			DWORD ?
		OkToRegister	BYTE ?
		PromptErr		BYTE "Error!", 0
		PromptSuccess	BYTE "Succeed to register!", 0
		Prompt1			BYTE "Input your credits: ", 0
		Prompt2			BYTE "Input your average grade: ", 0
	.code
	main PROC
		call PromptForPerform
		exit
	main ENDP

	PromptForPerform PROC USES edx eax 
	L1:
		mov OkToRegister, FALSE
		mov edx, OFFSET Prompt1
		call WriteString
		call ReadDec
		mov credits, eax
		.IF eax == 0
			exit
		.ENDIF
		mov edx, OFFSET Prompt2
		call WriteString
		call ReadDec
		mov gradeAverage, eax
		.IF eax == 0
			exit
		.ENDIF
		.IF (credits < 0) || (credits > 30)
			mov edx, OFFSET PromptErr
			call WriteString
			call Crlf
			jmp L1
		.ELSEIF (gradeAverage < 0) || (gradeAverage > 400)
			mov edx, OFFSET PromptErr
			call WriteString
			call Crlf
			jmp L1
		.ENDIF
		.IF gradeAverage > 350
			mov OkToRegister, TRUE
		.ELSEIF (gradeAverage > 250) && (credits <= 16)
			mov OkToRegister, TRUE
		.ELSEIF (credits <= 12)
			mov OkToRegister, TRUE
		.ENDIF
		.IF OkToRegister == 1
			mov edx, OFFSET PromptSuccess
			call WriteString
			call Crlf
		.ENDIF
		jmp L1

		ret
	PromptForPerform ENDP

	END main

6.7

	INCLUDE Irvine32.inc

	.data
	Prompt1 BYTE "Input the first integer: ", 0
	Prompt2 BYTE "Input the second integer: ", 0

	Prompta BYTE "1.x AND y", 0
	Promptb BYTE "2.x OR y", 0
	Promptc BYTE "3.NOT x", 0
	Promptd BYTE "4.x XOR y", 0
	Prompte BYTE "5.ExitProgram", 0
	PromptErr BYTE "Error, no such choice", 0
	Promptf BYTE "Input your choice: ", 0
	x DWORD ?
	y DWORD ?
	choice DWORD ?
	.code
	main PROC
		call PromptForCmd
		call ComplementPro
		exit
	main ENDP

	ComplementPro PROC USES eax edx
		.IF choice == 1
			call PromptForInteger
			mov eax, x
			and eax, y
		.ELSEIF choice == 2
			call PromptForInteger
			mov eax, x
			or eax, y
		.ELSEIF choice == 3
			call PromptForInteger
			mov eax, x
			not eax
		.ELSEIF choice == 4
			call PromptForInteger
			mov eax, x
			xor eax, y
		.ELSEIF choice == 5
			exit
		.ELSE
			mov edx, OFFSET PromptErr
			call WriteString
			exit
		.ENDIF
		call WriteDec
		call Crlf
		ret
	ComplementPro ENDP

	PromptForCmd PROC USES edx
		mov edx, OFFSET Prompta
		call WriteString
		call Crlf
		mov edx, OFFSET Promptb
		call WriteString
		call Crlf
		mov edx, OFFSET Promptc
		call WriteString
		call Crlf
		mov edx, OFFSET Promptd
		call WriteString
		call Crlf
		mov edx, OFFSET Prompte
		call WriteString
		call Crlf
		mov edx, OFFSET Promptf
		call WriteString
		call ReadDec
		mov choice, eax
		call Crlf

		ret
	PromptForCmd ENDP


	PromptForInteger PROC USES eax edx
		mov edx, OFFSET Prompt1
		call WriteString
		call ReadDec
		mov x, eax
		mov edx, OFFSET Prompt2
		call WriteString
		call ReadDec
		mov y, eax
		call Crlf
		ret
	PromptForInteger ENDP
	END main

6.8

	INCLUDE Irvine32.inc

	.data
	Prompt1 BYTE "Input the first hexadecimal number: ", 0
	Prompt2 BYTE "Input the second hexadecimal number: ", 0

	Prompta BYTE "1.x AND y", 0
	Promptb BYTE "2.x OR y", 0
	Promptc BYTE "3.NOT x", 0
	Promptd BYTE "4.x XOR y", 0
	Prompte BYTE "5.ExitProgram", 0
	PromptErr BYTE "Error, no such choice", 0
	Promptf BYTE "Input your choice: ", 0
	x DWORD ?
	y DWORD ?
	choice DWORD ?
	.code
	main PROC
		call PromptForCmd
		call ComplementPro
		exit
	main ENDP

	ComplementPro PROC USES eax edx
		.IF choice == 1
			call PromptForInteger
			mov eax, x
			and eax, y
		.ELSEIF choice == 2
			call PromptForInteger
			mov eax, x
			or eax, y
		.ELSEIF choice == 3
			call PromptForInteger
			mov eax, x
			not eax
		.ELSEIF choice == 4
			call PromptForInteger
			mov eax, x
			xor eax, y
		.ELSEIF choice == 5
			exit
		.ELSE
			mov edx, OFFSET PromptErr
			call WriteString
			exit
		.ENDIF
		call WriteHex
		call Crlf
		ret
	ComplementPro ENDP

	PromptForCmd PROC USES edx
		mov edx, OFFSET Prompta
		call WriteString
		call Crlf
		mov edx, OFFSET Promptb
		call WriteString
		call Crlf
		mov edx, OFFSET Promptc
		call WriteString
		call Crlf
		mov edx, OFFSET Promptd
		call WriteString
		call Crlf
		mov edx, OFFSET Prompte
		call WriteString
		call Crlf
		mov edx, OFFSET Promptf
		call WriteString
		call ReadHex
		mov choice, eax
		call Crlf

		ret
	PromptForCmd ENDP


	PromptForInteger PROC USES eax edx
		mov edx, OFFSET Prompt1
		call WriteString
		call ReadHex
		mov x, eax
		mov edx, OFFSET Prompt2
		call WriteString
		call ReadHex
		mov y, eax
		call Crlf
		ret
	PromptForInteger ENDP
	END main

6.9

	INCLUDE Irvine32.inc

	.data
	str1 BYTE "I love to hack! ", 0
	.code
	main PROC
		call Randomize
		mov eax, 10
		mov edx, OFFSET str1
	L1:
		push eax
		call RandomRange
		.IF (eax >= 0) && (eax <= 2)
			mov eax, 16 * black
			add eax, white
			call SetTextColor
			call WriteString
			call Crlf
		.ELSEIF eax == 3
			mov eax, 16 * black
			add eax, blue
			call SetTextColor
			call WriteString
			call Crlf
		.ELSE
			mov eax, 16 * black
			add eax, green
			call SetTextColor
			call WriteString
			call Crlf
		.ENDIF
		mov eax, 500
		call Delay
		pop eax
		jmp L1
		exit
	main ENDP
	END main

6.10

	INCLUDE Irvine32.inc

	.data
	val1 SDWORD 0
	val2 SDWORD 1
	prompt1 BYTE "Overflow!", 0
	.code
	main PROC
	mov eax, 1
	L1:
		call WriteInt
		call Crlf
		mov ebx, eax
		mov eax, val2
		add eax, val1
		mov edx, val2
		mov val2, ebx
		mov val1, edx
		jo quit
		jmp L1
	quit:	
		mov edx, OFFSET prompt1
		call WriteString
		exit
	main ENDP
	END main

6.11

	INCLUDE Irvine32.inc
	Count = 256
	.data
	EncryptKey	BYTE "ABXmv#7", 0
	buffer		BYTE Count DUP(?)
	bufferEnd	BYTE Count DUP(?)
	prompt1		BYTE "Input string: ", 0
	.code
	main PROC
		mov edx, OFFSET prompt1
		call WriteString
		mov ecx, SIZEOF buffer
		mov edx, OFFSET buffer 
		call ReadString
		call Crlf
		call WriteString
		call Crlf
		mov esi, OFFSET buffer
		mov edi, OFFSET EncryptKey
	L1:
		cmp BYTE PTR [esi], 0
		jz Fin
		cmp BYTE PTR [edi], 0
		jz RSet
	back:
		mov al, [edi]
		xor [esi], al
		inc esi
		inc edi
		jmp L1
	RSet:
		sub edi, 7
		jmp back
	Fin:
		mov esi, OFFSET buffer
		call WriteString
		call Crlf
		exit
	main ENDP
	END main

6.12

	INCLUDE Irvine32.inc
	.data
	N DWORD ?
	Result BYTE "The Zero Flag is 1!", 0dh, 0ah, 0
	Prompt BYTE "Input an integer(0-100): ", 0
	.code
	main PROC
		mov ecx, 30
		call Randomize
		mov edx, OFFSET Prompt
		call WriteString
		call ReadDec
		mov N, eax
		mov eax, 101
	L1:
		push eax
		call RandomRange
		cmp eax, N
		jbe L2
	back:
		pop eax
		loop L1
		jmp Fin
	
	L2:
		mov edx, OFFSET Result
		call WriteString
		jmp back
	Fin:
		exit
	main ENDP
	END main

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值