我正在尝试组合此汇编语言程序,说实话,我不确定自己在做什么。我试图查找一些在线示例。请帮助我,并向我解释每行是什么?
使用循环计算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
答案 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似乎是一个不错的起点。也许您读了几本书,因为您似乎是个非常新手。