Assembly 从组装开始

Assembly 从组装开始,assembly,x86,Assembly,X86,我正在学习IA32汇编,不知道如何开始。我试图制作一个简单的程序,它接受两个输入(a1和a2),将它们相加,然后返回总和。另一个程序也将修改给定的输入虚拟内存位置,并将其值缩放(乘以)5,然后用这个新的倍数替换数字。第三个程序将字符串“helloworld”作为虚拟内存中序列中的单个字符写入。问题是,我甚至不知道从哪里开始。我正在读的这本书非常混乱,几乎没有关于任何特定主题的例子 好吧,这是我徒劳的尝试。我甚至不知道如何开始第三个 第一个方案: movl (memloc), %eax /

我正在学习IA32汇编,不知道如何开始。我试图制作一个简单的程序,它接受两个输入(a1和a2),将它们相加,然后返回总和。另一个程序也将修改给定的输入虚拟内存位置,并将其值缩放(乘以)5,然后用这个新的倍数替换数字。第三个程序将字符串“helloworld”作为虚拟内存中序列中的单个字符写入。问题是,我甚至不知道从哪里开始。我正在读的这本书非常混乱,几乎没有关于任何特定主题的例子

好吧,这是我徒劳的尝试。我甚至不知道如何开始第三个


第一个方案:

movl (memloc), %eax    // load the first argument
movl (memloc), %ecx    // load the second argument
addl %ecx, %eax        // add them
ret                    // return
注:“memloc”是指内存位置。书上说这些练习程序应该有参数,但我不知道如何在汇编中进行


第二个方案:

movl (memloc), %eax    // load the number
movl (memloc), %ecx    // load it again
addl %ecx, %eax        // do this four times to get 5 times the original number
addl %ecx, %eax
addl %ecx, %eax
addl %ecx, %eax
ret                    // return
注:与第一个程序中关于“memloc”语句的注释相同。我不知道这件事


第三个方案:

movl (memloc), %eax    // load the number
movl (memloc), %ecx    // load it again
addl %ecx, %eax        // do this four times to get 5 times the original number
addl %ecx, %eax
addl %ecx, %eax
addl %ecx, %eax
ret                    // return

我完全不知道怎么做第三个节目。我知道它需要一些从寄存器到内存的“movl”语句。但仅此而已。

尝试通过谷歌搜索了解基本知识,然后发布您尝试的代码(即使它不起作用),然后我们可以帮助您调试它并为您指明正确的方向。这里有一个很好的资源:很多年前,当我第一次开始IA32汇编时,我最喜欢的参考是汇编艺术:我试图编写程序。对于第三个,我给出了完成任务所需的主要机制的基本描述。如果使用“调用”访问函数,则传递给该函数的参数将被推送到堆栈:
push 10;推20;调用MySumFunc
,可以通过堆栈指针访问:ESPI不确定是否使用了“call”。文本中说第一个函数应该有一个原型:int astr(int i1,int i2);