在一些教程的帮助下,我写了一小段代码, 从我的软盘启动后显示一个字符串。
我现在的问题是,我不明白某些界限,我希望你能帮助我, 或者告诉我,如果我是对的。
代码:
mov ax, 07C0h
add ax, 288 ; (512 + 4096) / 16 = 288
mov ss, ax
mov sp, 4096
mov ax, 07C0h
mov ds, ax
感谢您的帮助。
答案 0 :(得分:5)
mov ax, 07C0h
add ax, 288 ; (512 + 4096) / 16 = 288
mov ss, ax
这将堆栈段(ss)的起始位于段号07C0h + 288处。引导加载程序在段号07C0h的开头加载。引导加载程序的大小为512字节,每个段为16字节。这意味着堆栈段在引导加载程序结束后开始4096个字节。
mov sp, 4096
这将堆栈指针设置为4096.这意味着堆栈顶部现在超过堆栈段的开始4096字节。实际上,这已经为堆栈分配了4096个字节。
mov ax, 07C0h
mov ds, ax
这会将数据段设置为07C0h(引导加载程序启动的段)。当您稍后在引导加载程序中引用数据标签时,它们将使用数据段,因此您的引导加载程序必须位于数据段的开头,才能在内存中找到正确的位置。
答案 1 :(得分:3)
mov ax, 07C0h // copy the address 07C0h into the register ax
add ax, 288 // add the number 288 to the address in ax
mov ss, ax // copy the result to the stack segment register (07C0h + 288)
mov sp, 4096 // set the stack pointer to 4096
mov ax, 07C0h // copy the address 07C0h to ax again
mov ds, ax // copy the address 07c0h from ax into ds
..这就是你所有的。