2015-09-25 89 views
1

我想知道如何“bootstacktop”和“bootstack”的值由汇编程序,计算出当代码设置值%ESP:理解汇编代码

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

在同一组件文件的末尾,是的“bootstacktop”“定义”中给出:

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

我找到的值,看着deassebly,为“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

+0

我已经完成了项目文件的全部搜索,但没有bootstacktop的定义。它是由...生成的。空间指令,我想,但我不能弄明白,如果是的话。 – Sush

+0

我已添加链接器脚本 – Sush

+0

哦,您正在使用JOS(注意到您的链接器文件中)。将包含那些定义的东西。可能是'inc/memlayout.h' –

回答

4

既然你发布你的连接文件,我知道你与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 KSTKSIZE(分配的空间量= KSTKSIZE)。 KSTKSIZE将在memlayout.h中定义。 .globl bootstacktop指令只是说这个标签将变为全局的(就像C中声明为extern的变量)。 bootstackstop是另一个标签(内存地址),它将是bootstack中最后一个字节后面的地址。它也在全球范围内用于其他对象的使用。 bootstacktop - bootstack = KSTKSIZE

图像或可执行中的项目的布局将由其中所述接头在最终图像中放置这些对象来确定。链接器脚本经常会驱动更复杂的图像布局。如果你有一个链接脚本,你可能希望查看它,看看最终的图像/可执行文件是如何布局的。

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

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