【发布时间】:2014-03-12 13:37:01
【问题描述】:
我正在编写一个非常基本的内核。我试图编写一个函数,参数通过堆栈传递。内核使用 nasm 编译(如 this question 中所述)并使用 QEMU 运行。我正在使用 gdb 进行调试。
在遇到问题很长一段时间后,我写了这个来测试一些基本的堆栈操作:
BITS 16
global start
start:
mov ax, 0x7C00
add ax, 288
mov ss, ax
mov sp, 4096
mov ax, 0x7C00
mov ds, ax
test:
push 42
push 43
push "T"
pop ax
pop ax
push 44
pop ax
pop ax
jmp $
一步一步地查看sp 包含的内容并查看指向地址的内容表明sp 被正确地递减/递增,但它指向的地址始终包含0x0000。
我认为这可能与mov sp, 4096 行有关。所以我把它注释掉了。这也不起作用。唯一的区别是sp 指向的值现在是其他一些值,而不是我推到那里的值。
我需要做些什么来初始化堆栈或类似的东西吗?
【问题讨论】:
-
您确定您在寻找正确的细分市场吗?
-
没有。我如何选择要查看的细分市场。我必须看哪个?
-
您已将
ss设置为0x7d20(288=0x120)。您应该查看该段,或者,如果您的调试器使用物理地址,则应用通常的实模式计算16*ss+sp。
标签: assembly gdb stack qemu osdev