我必须写一个汇编程序来完成下面的任务,sum = 1^2 + 2^2 + 3^2 + ... + N^2,其中N是非负的字变量。我是个初学者,但我正在努力学习这个。我如何在n^2处停止代码?我目前的思路正确吗?
.code
.main proc
xor ecx, ecx ;mov ecx to zero
xor eax, eax ;mov eax to zero
mov ebx, 2 ;initialize ebx val to 2
Again:
inc eax ;increase eax by 1
jz ready ;if its 1^2, we are ready
mul eax, ebx ; multiply eax by ebx
add ecx, eax ;my total is stored in ecx and we add the next eax val
jl again ;do it again
ret
main endp
end main
1条答案
按热度按时间7fhtutme1#
我如何在n^2处停止代码?我目前的状态是否正确?
不尽然:
mul eax, ebx
(通常写为mul ebx
)只是乘以2,而不是按要求求平方jl again
仅在ECX中的总数为负时才继续循环,第一次不会发生这种情况jz ready
声称在1^2处停止,但为什么要 * 那么早 * 停止呢?N是非负字变量。
N是“非负单词”意味着什么?它意味着N是范围[0,32767]中的值。您的代码需要对该范围中的任何值都能正确工作。
对于大的数字(甚至不是那么大),
sum = 1^2 + 2^2 + 3^2 + … + N^2
的结果会很快溢出一个32位整数的容量。如果发生这种情况,你的代码必须中止计算。我建议从N^2开始,一直向下到1^2,这样就可以更快地检测到可能的溢出。