【发布时间】: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。所以我现在不需要这些信息