【问题标题】:Understanding assembly code of setting up stack for C code了解为 C 代码设置堆栈的汇编代码
【发布时间】:2015-12-23 20:46:38
【问题描述】:

我想知道当代码设置%esp的值时,汇编器是如何计算“bootstacktop”和“bootstack”的值的:

# Set the stack pointer
movl    $(bootstacktop),%esp

在同一个汇编文件的最后,给出的是“bootstacktop”的“定义”:

###################################################################
# boot stack
###################################################################
    .p2align    PGSHIFT     # force page alignment
    .globl      bootstack
bootstack:
    .space      KSTKSIZE
    .globl      bootstacktop   
bootstacktop:

我找到了值,查看了'bootstacktop'的反汇编,这是上述'mov'指令的反汇编部分:

# Set the stack pointer
movl    $(bootstacktop),%esp
f0100034:   bc 00 40 11 f0          mov    $0xf0114000,%esp

KSTKSIZE的值是8*4096,PGSHIFT是12。'bootsacktop'的值是怎么变成'0xf0114000'的? 'bootstack' 的值是多少?

这是链接描述文件:http://pastebin.com/9DPakfgx

【问题讨论】:

  • 我已经对项目文件进行了完整的搜索,没有 bootstacktop 的定义。它是由我认为的 .space 指令生成的,但我无法弄清楚它是否是。
  • 我已经添加了链接描述文件
  • 哦,您正在使用 JOS(在您的链接器文件中注意到这一点)。将包含定义的这些内容。应该是inc/memlayout.h
  • 您的链接器脚本告诉我您正在使用 GNU Assembler 并且针对 elf-i386。所以我现在不需要这些信息

标签: assembly x86 32-bit


【解决方案1】:

自从您发布了您的链接器文件,我知道您正在使用 JOS 操作系统。在您显示的带有代码 sn-p 的汇编程序文件顶部的某处将有一行包含文件 memlayout.h 。该文件定义了 PGSHIFT 和 KSTKSIZE 的值。这段代码:

###################################################################
# boot stack
###################################################################
    .p2align    PGSHIFT     # force page alignment
    .globl      bootstack
bootstack:
    .space      KSTKSIZE
    .globl      bootstacktop   
bootstacktop:

将页面与 bootstack 对齐到 PGSHIFT 中定义的任何值。 bootstack 是一个标签(内存地址),恰好在它之后分配了空间,.space KSTKSIZE(分配的空间量 = KSTKSIZE)。 KSTKSIZE 将在memlayout.h 中定义。 .globl bootstacktop 指令只是说这个标签将成为全局标签(就像在 C 中声明的变量 extern)。 bootstackstop 是另一个标签(内存地址),它将是bootstack 中最后一个字节之后的地址。它也被全局声明以供其他对象使用。 bootstacktop - bootstack = KSTKSIZE

图像或可执行文件中项目的布局将由链接器在最终图像中放置这些对象的位置决定。通常,链接描述文件会驱动更复杂的图像布局。如果您有链接描述文件,您可能希望查阅它以了解最终图像/可执行文件的布局。

你没有说你是否在磁盘上反汇编了一个图像文件,或者这个反汇编是否是在程序加载到内存后完成的,但基于值0xf0100034我猜这是一些虚拟或物理地址内核在将文件加载到内存时确定的排序(可能是 ELF 对象或等效对象)。然后它将是内核将图像加载到内存中的内存位置和链接器生成的图像文件中对象的偏移量的组合。

您的问题没有提供足够的信息来明确说明这个特定值是如何得出的,因为我们没有使用的图像(可执行文件),图像的布局类型(是 ELF/PE等)以及操作系统使用什么内存位置来加载图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 2013-06-04
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    相关资源
    最近更新 更多