3.1 as86汇编器

在开始讲述as86汇编器前,这本书引用内核中bootsect.s框架程序汇编代码来解释,记录下这一小段代码中不理解的地方,下面是这段实例代码:

3.1 as86汇编器
.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:
3.1 as86汇编器

问题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“,什么是有效扇区引导标志字?

3.1 as86汇编器

上一篇:笔记


下一篇:MVP一周精选 20191129: 用技术实现商业价值,用技术实现人生价值!