所以今天早上我发布了一个关于 assembly 的困惑问题,我得到了一些非常真诚的帮助,我真的很感激。
现在我开始着手组装并开始了解它是如何工作的。
我觉得我理解的东西包括堆栈、中断、二进制/十六进制,以及大多数基本操作的一般情况(jmp、push、mov 等)。
我正在努力理解并希望得到帮助的概念如下 - 如果您能解决以下任何问题,那将是一个巨大的帮助:
一些信息:我将 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 可能是该函数内的局部变量。
最佳答案
让我们尝试按顺序回答!
int a = 5;
int b = 6;
int *d = (int *)0x12345678; // assume 0x12345678 is a valid memory pointer
*d = a + b;
可能会被翻译成一些(简化的)程序集,如下所示:
load r1, 5
load r2, 6
load r4, 0x1234568
add r3, r1, r2
store r4, r3
在这种情况下,您可以将寄存器视为变量,但一般情况下,任何一个变量都没有必要始终保留在同一个寄存器中。根据您的例程有多复杂,它甚至可能是不可能的。您需要将一些数据压入堆栈,将其他数据弹出,等等。 “变量”是逻辑数据,而不是它存在于内存或寄存器等中的位置。
malloc()
即可从堆中获取内存。 关于汇编 - .data、.code 和寄存器...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2353309/