汇编 – .data,.code和register?

所以今天早上我发布了一个有关大会的困惑问题,我收到了一些非常真诚的帮助,我非常感谢。

现在我开始进入大会,开始明白它是如何工作的。

我觉得我理解的东西包括堆栈,中断,二进制/十六进制,一般来说大多数基本操作(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的地址。

在一个实际的应用程序中,5和4可能是函数参数,而3和2可以是该函数内的局部变量。

让我们试着按顺序回答!

>数据部分包含系统在调用程序的入口点之前要为您自动初始化的任何内容。你是对的,通常全球变量在这里结束。零初始化数据通常不包括在可执行文件中,因为没有理由 – 程序加载器的一些指令是生成该空间所需要的。一旦您的程序开始运行,ZI和数据区域通常是可互换的。 Wikipedia有更多的信息。
>变量在程序集编程时并不存在,至少不是在编写C代码的时候他们做的。你所有的都是你所做的关于如何布置你的记忆的决定。变量可以在堆栈中,内存中的某个地方,或者只存在于寄存器中。
>寄存器是处理器的内部数据存储。一般来说,您只能对处理器寄存器中的值进行操作。您可以将内容加载和存储到内存中,这是您计算机工作原理的基本操作。这是一个简单的例子。这个C代码:

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

在这种情况下,您可以将寄存器视为变量,但通常不需要任何一个变量始终保留在同一个寄存器中;取决于你的日常工作有多复杂,甚至可能不可能。您需要将一些数据推送到堆栈中,关闭其他数据,依此类推。 “变量”是逻辑数据,而不是存储在内存或寄存器中的数据。
>数组只是一个连续的内存块 – 对于本地数组,可以恰当地减少堆栈指针。对于全局数组,您可以在数据部分声明该块。
>有一些有关寄存器的约定 – 检查您的平台的ABI或调用约定文档以获取有关正确使用它们的详细信息。您的汇编文档也可能有信息。检查ABI article on wikipedia
>你的程序集程序可以使同一个系统调用任何C程序,所以你可以调用malloc()从堆中获取内存。

http://stackoverflow.com/questions/2353309/assembly-data-code-and-registers

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:汇编 – .data,.code和register?