所以今天早上我发布了一个关于装配的困惑问题,我得到了一些非常真诚的帮助,我真的很感激。
现在我开始着手组装并开始了解它是如何工作的。
我觉得我理解的东西包括堆栈、中断、二进制/十六进制,以及大多数基本操作的一般情况(jmp、push、mov 等)。
我正在努力理解并希望得到帮助的概念如下 - 如果您能解决以下任何问题,这将是一个巨大的帮助:
- .data 部分到底发生了什么?是我们声明的那些变量吗?
- 如果是这样,我们可以稍后在代码部分声明变量吗?如果不是,为什么不呢?如果是这样,那么我们如何以及为什么使用数据部分?
- 什么是寄存器?它与变量相比如何?我的意思是我知道这是一个存储一小部分信息的位置……但这对我来说听起来就像一个变量。
- 如何制作数组?我知道这似乎有点随机,但我很好奇我将如何去做这样的事情。
- 是否有一个关于每个寄存器应该用于什么的常见做法列表?我仍然没有完全理解它们,但注意到有些人说,例如,应该使用某个寄存器来存储来自过程的“返回值”——是否有一个全面的或至少是信息丰富的此类做法列表?
- 我学习汇编的原因之一是为了更好地理解我的高级代码背后发生了什么。考虑到这一点——当我用 C++ 编程时,我经常考虑堆栈和堆。在汇编中,我知道堆栈是什么——“堆”在哪里?
一些信息:我将 masm32 与 WinAsm 一起用作 IDE,并且我正在使用 Windows 7。我以前有很多使用高级语言(如 c++/java)进行编程的经验。
编辑:感谢大家的帮助,像往常一样提供丰富的信息!好东西!最后一件事——我想知道堆栈指针和基指针或 ESP 和 EBP 之间有什么区别。有人可以帮我吗?
编辑:我想我现在明白了...... ESP 总是指向堆栈的顶部。但是,您可以将 EBP 指向任何您想要的位置。ESP 是自动处理的,但您可以使用 EBP 做任何您想做的事情。例如:
push 6
push 5
push 4
mov EBP, ESP
push 3
push 2
在这种情况下,EBP 现在指向持有 4 的地址,但 ESP 现在指向持有 2 的地址。
在实际应用中,6、5 和 4 可能是函数参数,而 3 和 2 可能是该函数中的局部变量。