Я слежу за этой программой загрузочного сектора hello-world, которая имеет следующий скрипт компоновщика:
ENTRY(mystart)
SECTIONS
{
. = 0x7c00;
.text : {
entry.o(.text)
*(.text)
*(.data)
*(.rodata)
__bss_start = .;
*(.bss)
*(COMMON)
__bss_end = .;
}
.sig : AT(ADDR(.text) + 512 - 2)
{
SHORT(0xaa55);
}
/DISCARD/ : {
*(.eh_frame)
}
__stack_bottom = .;
. = . + 0x1000;
__stack_top = .;
}
Ниже следует entry.S
:
.code16
.text
.global mystart
mystart:
ljmp $0, $.setcs
.setcs:
xor %ax, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %ss
mov $__stack_top, %esp
cld
call main
Ниже приведена функция main
void main(void) {
int i;
char s[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
for (i = 0; i < sizeof(s); ++i) {
__asm__ (
"int $0x10" : : "a" ((0x0e << 8) | s[i])
);
}
while (1) {
__asm__ ("hlt");
};
}
Я ожидал, что __stack_top
примет значение 0x8E00 (0x7C00 + 0x200 (512 байт загрузочного сектора) + 0x1000 (стек 4 КБ)), но когда я проверяю программу в gdb, инструкция
mov $__stack_top, %esp
толкает 0x8c93 в% esp.
Почему это происходит? eh_frame
влияет как-то или я что-то здесь упускаю? Пожалуйста, помогите.