我正在尝试运行要求用户输入1到400之间的输入的代码,并给出该组合的数量。例如。输入31将得到4 6 8 9 10 12 14 15 16 18 20 21 22 24 25 26 27 28 30 32 34 35 36 38 39 40 42 44 45 46
当我尝试运行以下代码时,它会崩溃:
userInt1 DWORD ? ;integer to be entered by user
userInt2 DWORD ? ;integer to be entered by user
intro_1 BYTE "Composite Numbers by. Eric Walters" , 0
prompt_1 BYTE "Enter the number of composite numbers you would like to see. ", 0
prompt_2 BYTE "I'll accept orders for up to 400 composites. ", 0
prompt_3 BYTE "Enter the number of composites to display [1 .. 400]: ", 0
prompt_4 BYTE "Test", 0
prompt_6 BYTE "Results certified by Eric Walters.",0
prompt_7 BYTE "Goodbye, ", 0
outOfRange BYTE "Out of range. Try again.",0
goodBye BYTE "Impressed? Bye! ", 0
upperLevel DWORD 400 ;the largest integer allowed
lowerLevel DWORD 1 ;the smallest integer allowed
newArray DWORD 500 DUP(?)
.code
main PROC
push OFFSET newArray
push ebp
mov ebp,esp
mov esi,[ebp + 8]
; Introduction
mov edx, OFFSET intro_1
call WriteString
call CrLf
call CrLf
mov edx, OFFSET prompt_1
call WriteString
call CrLf
mov edx, OFFSET prompt_2
call WriteString
call CrLf
call CrLf
; getUserData
userPrompt:
mov edx, OFFSET prompt_3
call WriteString
call ReadInt
mov userInt1, eax
mov eax, userInt1
;validate
cmp eax, upperLevel
ja option1
cmp eax, lowerLevel
jb option1
jmp option2
option1 :
mov edx, OFFSET outOfRange
call WriteString
call crlf
jmp userPrompt
mov ecx, 4
option2 :
cmp ecx, userInt1
jnle done
mov ebx, 2
showComposites :
mov edx, ecx
sub edx, 1
cmp ebx, edx
jge L1
mov eax, ecx
div ebx
cmp edx, 0
je composite
resume :
inc ebx
jmp showComposites
L1:
inc ecx
jmp option2
done :
pop ebp
ret 4
composite:
mov [esi], ecx
add esi, TYPE DWORD
jmp L1
; farewell
mov edx, OFFSET prompt_6
call WriteString
call crlf
mov edx, OFFSET prompt_7
call WriteString
call crlf
exit ; exit to operating system
main ENDP
END main任何帮助都将不胜感激!
发布于 2015-07-15 16:24:11
假设你没有失败的汇编一个exe,所以你的EXTRN/PUBLIC声明是正确的。
jmp userPrompt
mov ecx, 4 ;Useless code?
option2 :
cmp ecx, userInt1 ;Not understanding when ECX is initialized and
jnle done ;why, was it suppose to be the above code
mov ebx, 2 ;that is misplaced?这部分把我弄糊涂了,现在我不明白你的顺序合成数的算法。
这里有一个想法:为什么不设置一个由1-400个组合数字组成的数组,并让用户输入1-400之间的数组作为循环计数器,以显示每个数组元素?(不过,在时间和内存方面不如优秀的算法高效。)
发布于 2015-07-15 21:02:10
我没有运行你的代码,我想说实话:我讨厌NASM和它所有的高级指令和宏。
我最好的猜测是
push OFFSET newArray
push ebp
mov ebp,esp
mov esi,[ebp + 8]
;Whole lotta stuff
done:
pop ebp
ret 4也许你是在复制粘贴代码,我不知道,但这会将主进程的返回地址设置为newArray的地址,并将在返回时崩溃。
我看到您试图将数组作为参数传递,但没有您调用的函数。
代码的其余部分,除了Nhat M Le在答案中突出显示的点之外,应该可以工作,或者需要进行微小的调整(请注意,我还没有运行它)。
我可以给你一些建议吗?
1.描述算法和问题
当你发布代码,特别是汇编代码时,给出你正在实现的算法的一般描述。
特别是当有空间容纳整个范围的算法时:从尝试除法的初学者使用,到更通用的polynomial time primality test版本,通过切割器和对sieve的直观使用
此外,还应包括您面临的具体问题。
这可以帮助我们找出问题,而不是试图进入你的大脑,阅读大量的,可能是非常糟糕的代码。
2.相应地将变量命名为
比方说,与使用upperLimit或dwUpperLimit、ui32UpperLimit相比,您是否真的能更好地使用userInt1
3.知道您的数据大小
努力识别哪些数据应该在运行时占用内存空间,哪些不应该。
upperLevel和lowerLevel最好用EQU (或任何MASM等效物)来声明。
如果您最多支持400个数字,为什么还要为阵列分配500个DWORD?
我可能遗漏了一些东西,但如果我不是,这可能是懒惰或对编程不感兴趣的态度的症状,如果你对编程感兴趣,就摆脱它。
我并不期望您知道如何正确使用pi(x) function和评估技术,但您最多需要400个EQU (专业提示:与Point2 DWORD使用合并)。
4.使用functions将问题划分为子问题
这确实有助于调试和防止汇编中的错误。
5.缩进代码并使其保持清晰
汇编代码没有缩进规则,但作为人类,我们会自动找到一种阅读起来很愉快的样式。
记住在物理上分离逻辑上不同的代码片段,你用标题注释做了一些事情,但是整个循环逻辑是混乱的,如果你继续用汇编语言编程,你会发现你可以写出非常清晰的代码,即使有多次跳转。
这一切只是为了给开个玩笑,,并回答你的数据问题
goodBye BYTE "Impressed? Bye! ", 0使用数据答案
strGoodBye db "Not very much :)", 0https://stackoverflow.com/questions/31417664
复制相似问题