我必须编写一个汇编程序来执行以下操作,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发布于 2022-11-12 20:01:09
如何在n^2处停止代码?我现在拥有的东西是否在正确的轨道上?
不完全是:
mul eax, ebx (通常写为mul ebx)只会乘以2,但是如果ECX中的总数为负数,requestedjl again将不会继续循环,但timejz ready声称在1^2处停止,但为什么要停止早期的?
N是一个非否定词变量。
N是一个“非否定词”意味着什么?这意味着N是在0,32767范围内的一个值。您的代码需要在此范围内的任何值()中正确工作。
对于大数字(甚至不是那么大),sum = 1^2 + 2^2 + 3^2 + … + N^2的结果将迅速溢出32位整数的容量。如果发生这种情况,您的代码必须中止计算。我建议从N^2开始,然后一直工作到1^2,以便更快地检测到可能的溢出。
xor eax, eax ; Result
mov ecx, N ; [0,32767]
jecxz Done
Again:
mov ebx, ecx
imul ebx, ebx ; Max 32767 * 32767 can't overflow
add eax, ebx ; This can overflow
jo Abort
dec ecx
jnz Again
Done:
ret ; EAX=[0,2147483647]
Abort:
mov eax, -1
rethttps://stackoverflow.com/questions/74409832
复制相似问题