首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在装配中添加方格

在装配中添加方格
EN

Stack Overflow用户
提问于 2022-11-12 01:54:28
回答 1查看 39关注 0票数 1

我必须编写一个汇编程序来执行以下操作,sum = 1^2 + 2^2 + 3^2 +…+ N^2,其中N是一个非否定词变量。我是一个初学者,但我正在努力学习这个。如何在n^2处停止代码?我现在拥有的东西是否在正确的轨道上?

代码语言:javascript
复制
.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
EN

回答 1

Stack Overflow用户

发布于 2022-11-12 20:01:09

如何在n^2处停止代码?我现在拥有的东西是否在正确的轨道上?

不完全是:

  • mul eax, ebx (通常写为mul ebx)只会乘以2,但是如果ECX中的总数为负数,requested
  • jl again将不会继续循环,但time
  • jz ready声称在1^2处停止,但为什么要停止早期的

N是一个非否定词变量。

N是一个“非否定词”意味着什么?这意味着N是在0,32767范围内的一个值。您的代码需要在此范围内的任何值()中正确工作。

对于大数字(甚至不是那么大),sum = 1^2 + 2^2 + 3^2 + … + N^2的结果将迅速溢出32位整数的容量。如果发生这种情况,您的代码必须中止计算。我建议从N^2开始,然后一直工作到1^2,以便更快地检测到可能的溢出。

代码语言:javascript
复制
  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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74409832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档