了解为C代码设置堆栈的汇编代码

Understanding assembly code of setting up stack for C code

我想知道当代码为 %esp:

设置值时,汇编程序如何计算 "bootstacktop" 和 "bootstack" 的值
# Set the stack pointer
movl    $(bootstacktop),%esp

在同一个汇编文件的末尾,给出的是"bootstacktop"的"definition":

###################################################################
# 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    [=12=]xf0114000,%esp

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

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

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

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

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

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

你没有说你是不是反汇编了一个磁盘上的镜像文件,也没有说这个反汇编是在程序加载到内存后进行的,但是根据值0xf0100034我猜这是一个虚拟或内核在将文件加载到内存时确定的某种物理地址(可能是 ELF 对象或类似的东西)。然后它将是内核将图像加载到内存中的内存位置和链接器生成的图像文件中对象偏移量的组合。

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