汇编程序,使用循环计算10个32位整数的数组的总和

时间:2018-10-28 17:02:21

标签: arrays loops assembly

我正在尝试组合此汇编语言程序,说实话,我不确定自己在做什么。我试图查找一些在线示例。请帮助我,并向我解释每行是什么?

使用循环计算10个32位整数数组的总和。您可以对输入的整数进行硬编码。将总和保存在寄存器EAX中。

INCLUDE Irvine32.inc    
.data
  arrayVal DWORD 1,2,3,4,5,6,7,8,9,10
  counter = 0
.code
main:    
  xor eax, eax                     
  xor edx, edx                     
  mov ecx, LENGTHOF arrayVal       
L1:
  mov ebx, DWORD arrayVal [edx]    
  add eax, ebx                     
  inc edx                          
loop L1                            

  Call WriteDec                    
  exit
end main

1 个答案:

答案 0 :(得分:1)

自大学毕业以来我还没有做过汇编,但我会尽力解释可能会有点麻烦的事情。

INCLUDE Irvine32.inc 

此行用于导入32位编程所需的Irvine32.inc。

.data

汇编程序由多个节(memory segments)组成,数据节用于分配要在后续节中使用的内存空间和变量

  arrayVal DWORD 1,2,3,4,5,6,7,8,9,10

在这里,我们创建一个由DWORD表示的32位数组,并使用值1到10进行初始化。arrayVal指向1。

counter = 0 

稍后我们会谈到:P

.code
main:

代码部分和main,上面两行粗略地表示我们已经完成了声明变量的操作,以下所有声明的内容都是您应作为main函数执行的指令。

在我解释下面的其他代码之前,您应该了解,即使您创建了存储数据的内存段,也无法将其用于汇编操作。您必须为它们more info here使用称为寄存器的特殊位置。 edx,eax和ecx都是用于特殊功能的寄存器。

  xor eax, eax                     
  xor edx, edx   

寄存器基本上存储二进制数据,它们可以从以前的操作中获取数据,因此我们可以通过在自身上使用xor将它们重置为零(它们比将它们设置为零explanation here更快)。

 mov ecx, LENGTHOF arrayVal 

此命令基本上将arrayval的长度移至通常用作计数器的ecx寄存器。

因此,一般逻辑将如此。将一个值存储读取到ebx,将其添加到eax(我们的累加器),然后将下一个数组值添加到ebx中,然后将其添加到ebx中,依此类推,以此类推,直到我们添加了所有值。

L1: and loop L1

循环是非常特殊的指令。基本上,有两件事跳到我们在本例L1中提到的位置,并自动减小ecx直到ecx为零。并且之间的所有内容都会重复执行,直到ecx,因此这些行

  mov ebx, DWORD arrayVal [edx]    
  add eax, ebx                     
  inc edx 

对数组的所有值执行。但这引出了一个问题,为什么在数据部分中首先需要计数器(也许我不确定ecx是保留字)。

  Call WriteDec                    
  exit

现在将所有值相加后,如果您调用WriteDec,它将把它的值从eax寄存器打印到标准输出,我们就完成了。所以我们退出并结束main。

有些事情似乎是不必要的,但如果您对Google稍加了解,应该了解更多。 This似乎是一个不错的起点。也许您读了几本书,因为您似乎是个非常新手。