3.1 as86汇编器
在开始讲述as86汇编器前,这本书引用内核中bootsect.s框架程序汇编代码来解释,记录下这一小段代码中不理解的地方,下面是这段实例代码:
.globl begtext, begdata, begbss, endtext, enddata, endbss .text !正文段 begtext: !标号 .data !数据段 begdata: !标号 .bss !未初始化数据段 begbss: !标号 .text !正文段 BOOTSEG = 0X07C0 !BIOS加载bootsect代码的原始段地址 entry start start: jmpi go,BOOTSEG go:
mov ax,cs mov ds,ax mov es,ax mov [msg1+17],ah mov cx,#20 mov dx,#0x1004 mov bx,#0x000c mov bp,#msg1 mov ax,#0x1301 int 0x10 !BIOS中断调用0x10,功能0x13,子功能01 loop1: jmp loop1 !死循环 msg1: .ascii "Loading system..." !调用BIOS中断显示的信息,共20个ASCII码字符 .byte 13,10 .org 510 !表示以后语句从地址510(0x1FE)开始存放 .word 0xAA55 !有效引导扇区标志,供BIOS加载引导扇区使用 .text endtext: .data enddata: .bss endbss:
问题1:书中说“ entry是保留关键字,用于迫使ld86链接器在生成可执行文件中包括进其后指定的标号'start'”,又说“在我们的示例中以及Linux内核boot/bootsect.s和boot/setup.s汇编程 序中完全可以忽略这个关键词,因为我们不希望在生成的纯二进制文件中包含任何符号信息”。以前学汇编的时候,把entry理解为定义程序的入口,如果在二进制可执行文件中没有这 个入口start,那程序从哪里开始执行是怎么确定的呢?
问题2:jmpi go,BOOTSEG,“这是一个段间远跳转语句。BIOS把程序加载到0X7C00并跳转到该处时,所有段寄存器的值均为0,这个跳转语句是为了给CS赋值0X7C0,即此时 CS:IP=0X07C0:0X0005.“,为什么要把程序默认加载到0X7C00,为什么IP的值是0X0005?
问题3:.word 0XAA55,”在此处放置有效扇区引导标志字0XAA55“,什么是有效扇区引导标志字?