简单的引导程序代码解释



我有这个简单的引导加载程序代码,但我不确定它的所有功能。

mov ax, 07c00h
mov ds, ax
mov si, msg
ch_loop: lodsb
   or al, al
   jz hang
   mov ah, 0eh
   int 10h
   jmp ch_loop
hang:
   jmp hang
msg db "Hello, world!", 13, 10, 0
times 512-($-$$) db 0

首先,我认为你告诉BIOS加载在内存位置7c00(为什么不说org 7c00h?或者这不是x86汇编?)。接下来把ax的值代入dx。然后,将'msg'的值移动到si(为什么是si?)。接下来,我认为你正在创建一个循环来打印屏幕上的所有字符。我不知道or al, al是什么意思。如果为0跳转到挂起函数(当所有的字符都打印到屏幕上时是否等于0 ?)接下来的两行和视频有关。我知道int 10h是视频/图形模式的BIOS中断。在int 10h之后我明白了。我真的觉得组装很难。我知道ax是一个累加寄存器,但这实际上意味着什么?

谁来帮帮我!
提前感谢
有任何问题,请评论!
PS:有没有真正有深度的网站可以做这样的事情?另外,Assembly中的"pages"是什么?您使用bh寄存器,但为什么使用bh呢?

您确定代码以

开头吗?
        mov     ax,07c00h
        mov     ds,ax

相对
        mov     ax,07c0h
        mov     ds,ax

?

BIOS总是在0000:7c00加载一个引导扇区(或分区)。对于Microsoft分区扇区,BIOS在0000:7c00处加载扇区映像,代码将自身向下移动到0000:600,然后定位并加载一个引导扇区到0000:7c00,并跳转到引导扇区代码。对于多引导系统,循环可能会再次重复。

有没有真正有深度的网站可以做这样的事情?

OSDev是搜索以下问题答案的地方:

http://forum.osdev.org/

http://wiki.osdev.org/

int 10h调用BIOS视频服务。在本例中,输出一个字符。int 10h左右是一个循环,从消息中读取字符,消息末尾的0导致循环退出到另一个没有尽头的"hang"循环。现在,将这些操作放在一起,您希望代码做什么:)

最新更新