x86程序集,如何添加存储在内存中的变量?

问题描述:

平台:奔腾4处理器(我真的需要升级:)运行Windows XP。我目前正在装配MASM32。x86程序集,如何添加存储在内存中的变量?

我是一个绝对的初学者与组装,我试图找出如何添加变数。我理解如何定义变量,将数据放入寄存器以及如何将寄存器放入堆栈,但我不知道如何组合两个变量的值(通过添加)。

而且,任何人都可以给我一个链接或东西,以一种易于理解的x86汇编教程,尽管我迄今为止发现的那些是真正的高层次的东西,他们不解释了。这将非常感激。

由于提前, Progrmr

简单相加:

add eax, ebx ; Adds eax and ebx and stores the result in eax 

从存储器加载,然后添加,然后在存储器中存储:

mov eax, DWORD PTR [esi] ; Load a double word from memory into eax 
mov ebx, DWORD PTR [edi] ; Load a double word from memory into ebx 
add eax, ebx    ; Adds eax and ebx and stores the result in eax 
mov DWROD PTR[esi], eax  ; Store a double word in eax into memory 

在上面的例子中,DWORD PTR并不严格需要但是练习是一个好习惯,因为它消除了任何含糊不清的情况,并使代码更易于阅读。

重要的是要记住,你只能添加同样大小的寄存器(DWORD在上面的例子)是很重要的。如果你想添加两个寄存器不同大小的:

mov al, BYTE PTR [esi] ; Loads a single byte from memory into al 
mov bx, WORD PTR [edi] ; Loads a word from memory into bx 
movzx eax, al    ; Zero extends al into the entire eax register 
movzx ebx, bx    ; Zero extends bx into the entire ebx register 
add eax, ebx    ; Adds eax and ebx and stores the result in eax 

这不是一个非常好的例子,因为有更容易的方式做同样的事情,但我希望它会显示出一些可以使用的招数。

您还可以将内存值添加到寄存器:

mov eax, DWORD PTR [esi]  ; Load a double word from memory into eax 
add eax, DWORD PTR [edi]  ; Add a double word in memory to eax 

这里有一个很好的网站作为参考使用:http://ref.x86asm.net/

+0

谢谢堆!这很有帮助。你的意思是“有更简单的方法来做同样的事情”。不过谢谢你。 – Progrmr 2012-04-16 03:53:08

+0

而且,当我添加两个数字时,我该如何将该值放入变量并将该变量显示给控制台?谢谢。 – Progrmr 2012-04-16 04:11:47

+0

而是一个单独的MOV/MOVZX指令,你可以简单地这样做:MOVZX EAX,BYTE PTR [ESI]。至于从控制台获取和打印,请尝试以下链接:http://www.masm32.com/board/index.php?topic=1094.0 – Sparafusile 2012-04-16 15:25:38

我怀疑你的观念问题。 x86值存在于寄存器或内存中,变量的概念是更高级别的。增加值的一种方法是将它们放入寄存器,然后调用添加操作。

http://computertech.createmybb3.com/showthread.php?tid=116

+0

好吧,这是有道理的。 – Progrmr 2012-04-29 10:38:57