Sus*_*ush 1 x86 assembly 32-bit
我想知道当代码为%esp设置值时,汇编程序如何计算“ bootstacktop”和“ bootstack”的值:
# Set the stack pointer
movl $(bootstacktop),%esp
Run Code Online (Sandbox Code Playgroud)
在同一汇编文件的末尾,给出了“ bootstacktop”的“定义”:
###################################################################
# boot stack
###################################################################
.p2align PGSHIFT # force page alignment
.globl bootstack
bootstack:
.space KSTKSIZE
.globl bootstacktop
bootstacktop:
Run Code Online (Sandbox Code Playgroud)
我找到了值“ destackbly”中的“ bootstacktop”,这是上述“ mov”指令的反汇编的一部分:
# Set the stack pointer
movl $(bootstacktop),%esp
f0100034: bc 00 40 11 f0 mov $0xf0114000,%esp
Run Code Online (Sandbox Code Playgroud)
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:
Run Code Online (Sandbox Code Playgroud)
将与对齐页面bootstack任何值被定义PGSHIFT。bootstack是一个标签(内存地址),它恰好在其后.space KSTKSIZE分配了空间(分配的空间量= KSTKSIZE)。KSTKSIZE将在中定义memlayout.h。该.globl bootstacktop指令只是说该标签将成为全局标签(就像extern在C中声明的变量一样)。bootstackstop是另一个标签(内存地址),它将是中最后一个字节之后的地址bootstack。它还被全局声明为其他对象使用。bootstacktop - bootstack = KSTKSIZE
映像或可执行文件中项目的布局将由链接器将这些对象放置在最终映像中的位置确定。通常,链接描述文件会驱动更复杂的图像布局。如果您有一个链接描述文件,不妨参考一下它,以了解最终图像/可执行文件的布局。
您没有说要在磁盘上反汇编映像文件,还是在程序加载到内存后进行反汇编,但是基于该值,0xf0100034我想这是由虚拟机确定的某种虚拟或物理地址。内核将文件加载到内存中时(可能是ELF对象或等效对象)。然后,它将是内核将映像加载到内存中的内存位置与链接器生成的映像文件中对象的偏移量的组合。
您的问题没有提供足够的信息来明确说明该特定值是如何得出的,因为我们没有使用过的图像(可执行文件),图像所用的布局类型(是ELF / PE等)还是操作系统用来加载映像的内存位置。