汇编 - .data、.code 和寄存器...?

标签 assembly low-level masm32

所以今天早上我发布了一个关于 assembly 的困惑问题,我得到了一些非常真诚的帮助,我真的很感激。

现在我开始着手组装并开始了解它是如何工作的。

我觉得我理解的东西包括堆栈、中断、二进制/十六进制,以及大多数基本操作的一般情况(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 可能是该函数内的局部变量。

    最佳答案

    让我们尝试按顺序回答!

  • 数据部分包含您希望系统在调用程序入口点之前自动为您初始化的任何内容。你是对的,通常全局变量在这里结束。零初始化数据通常不包含在可执行文件中,因为没有理由 - 程序加载器的几个指令就是生成该空间所需的全部。一旦您的程序开始运行,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
    

    在这种情况下,您可以将寄存器视为变量,但一般情况下,任何一个变量都没有必要始终保留在同一个寄存器中。根据您的例程有多复杂,它甚至可能是不可能的。您需要将一些数据压入堆栈,将其他数据弹出,等等。 “变量”是逻辑数据,而不是它存在于内存或寄存器等中的位置。
  • 数组只是一个连续的内存块 - 对于本地数组,您可以适本地减少堆栈指针。对于全局数组,您可以在数据部分中声明该 block 。
  • 有很多关于寄存器的约定——查看你平台的 ABI 或调用约定文档,了解如何正确使用它们的详细信息。您的汇编程序文档也可能包含信息。检查 ABI article on wikipedia
  • 您的汇编程序可以进行与任何 C 程序相同的系统调用,因此您只需调用 malloc() 即可从堆中获取内存。
  • 关于汇编 - .data、.code 和寄存器...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2353309/

    相关文章:

    c++ - 为什么 __int16 和 int(32) 用 C++ 生成不同的 asm?

    target - 使用 FASM 的 Mach-O 二进制文件

    linux - 从仅采用 char* 参数的 x86_64 函数中使用 sys_write?

    c++ - 低级 Hook /SetWindowsHookEx lParam 自动重复?

    assembly - 寄存器如何有地址?

    assembly - EAX 寄存器的反转字节顺序

    x86 - 在x86汇编中,如何在不执行比较操作的情况下设置零标志(ZF)?

    c - GameBoy Advance Homebrew 开发的语言选择

    java - 在低级别对 Hadoop 作业进行基准测试

    c - 有哪些了解 C 语言可以让你成为更好的高级程序员的具体例子?