assembly 在装配中添加正方形

xa9qqrwz  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(159)

我必须写一个汇编程序来完成下面的任务,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
7fhtutme

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,这样就可以更快地检测到可能的溢出。

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
  ret

相关问题