继续更新:
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