美文网首页
[OS64位][015]源码阅读:代码清单3-23 ~ 3-24

[OS64位][015]源码阅读:代码清单3-23 ~ 3-24

作者: AkuRinbu | 来源:发表于2019-05-16 20:12 被阅读0次

    学习笔记

    使用教材(配书源码以及使用方法)
    《一个64位操作系统的设计与实现》
    http://www.ituring.com.cn/book/2450
    https://www.jianshu.com/p/28f9713a9171

    源码文件

    • 第3章\程序\程序3-4\ loader.asm

    调试运行

    运行结果
    • 随便新建一个文件,然后将其命名成 kernel.bin ,就可以查看运行效果
    [anno@localhost Desktop]$ sudo cp loader.bin media
    [anno@localhost Desktop]$ sync
    
    [anno@localhost Desktop]$ sudo cp kernel.bin media
    [anno@localhost Desktop]$ sync
    
    • 打开bochs ,反汇编,可以计算出断点位置b 0x1033c ,至此是Get SVGA Mode Info SUCCESSFUL!,断点之后开始的就是 SET SVGA Mode (一旦运行SET部分的机器码,就会改变bochs窗口的大小)
    0001033c: (                    ): mov ax, 0x4f02            ; b8024f
    0001033f: (                    ): mov bx, 0x4180            ; bb8041
    00010342: (                    ): int 0x10                  ; cd10
    00010344: (                    ): cmp ax, 0x004f            ; 83f84f
    00010347: (                    ): jnz .-38                  ; 75da
    
    • 重要的断点
    0x7c00  boot
    0x7d34  boot 跳转到 loader
    0x1000:0080 ( 即 0x10080 loder.bin) loader第一条指令
    
    反汇编 u 0x10080:0x10280 查看512字节
    
    • 完整运行步骤可参考

    [OS64位][011]源码阅读:代码使用与命令行操作 程序3-3 boot.asm loader.asm 以及 mount 使FAT文件系统生效
    https://www.jianshu.com/p/6c7f9f12c2af

    代码清单3-23 源码 line : 671 ~ 709 : 显示十六进制数字

    • 模块Label_DispAL功能:显示十六进制数字
    • 传入参数:AL=要显示的十六进制数
    显示十六进制数.png

    代码清单3-24 源码 line : 332 ~ 478 : 显示视频图像芯片的查询信息,并且根据查询信息配置芯片的显示模式

    显示视频图像芯片的查询信息,并且根据查询信息配置芯片的显示模式
    ;=======    get SVGA information
    ;=======    Get SVGA Mode Info
    Label_SVGA_Mode_Info_Get
          ;=======  display SVGA mode information
          Label_SVGA_Mode_Info_FAIL
          Label_SET_SVGA_Mode_VESA_VBE_FAIL
    Label_SVGA_Mode_Info_Finish
    ;=======    set the SVGA mode(VESA VBE)
    

    参考资料

    显存显示相关

    • 显示到显示屏 上要在 【显存】 填入 【ASCII码的值】

    [048][汇编语言]实验10 3、数值显示
    https://www.jianshu.com/p/187d1fce3e45

    • BCD码转换成ASCII
    ;-------------------------------------------------------------------------------
    ;子程序:   bcd_to_ascii
    ;参数:        AL = BCD码
    ;返回:        AH 十位数的ASCII码 
    ;           AL 个位数的ASCII码
    ;-------------------------------------------------------------------------------
    bcd_to_ascii:           ;新0x70中断中调用的子程序
                            ;将BCD码转换成ASCII
        mov ah,al
        and al,0x0f         
        add al,0x30         ;个位数的ASCII码
        
        shr ah,4
        and ah,0x0f
        add ah,0x30         ;十位数的ASCII码
    
    ret
    

    [014][x86汇编语言]采用更新周期结束中断,动态时钟(Bochs 调试: 在中断向量表IVT中,查看新的0x70号中断程序的入口地址)
    https://www.jianshu.com/p/0667a55bafce

    图像芯片信息相关

    • Int 0x10, AH=0x4f

    http://www.delorie.com/djgpp/doc/rbinter/ix/10/4F.html

    104F00 INT 10 - VESA SuperVGA BIOS (VBE) - GET SuperVGA INFORMATION
    104F01 INT 10 - VESA SuperVGA BIOS - GET SuperVGA MODE INFORMATION
    104F02 INT 10 - VESA SuperVGA BIOS - SET SuperVGA VIDEO MODE

    AX = 4F00h
    ES:DI -> buffer for SuperVGA information
     (see 00077 http://www.delorie.com/djgpp/doc/rbinter/it/77/0.html)
    
    Return:
    AL = 4Fh if function supported
    AH = status 
      00h successful ES:DI buffer filled
      01h failed
    

    http://www.delorie.com/djgpp/doc/rbinter/id/78/2.html

     0Eh    DWORD   pointer to list of supported VESA and OEM video modes
            (list of words terminated with FFFFh)
    

    http://www.delorie.com/djgpp/doc/rbinter/it/77/0.html

    • INT10H AX = 4F01h
    INT 10 
    - VESA SuperVGA BIOS 
    - GET SuperVGA MODE INFORMATION
    AX = 4F01h
    CX = SuperVGA video mode 
    (see #04082 for bitfields)
    ES:DI->256-byte buffer for mode information (see #00079)
    
    Return: 
    AL = 4Fh if function supported
    AH = status
    00h successful ES:DI buffer filled
    01h failed
    
    

    http://www.delorie.com/djgpp/doc/rbinter/id/79/2.html

    相关文章

      网友评论

          本文标题:[OS64位][015]源码阅读:代码清单3-23 ~ 3-24

          本文链接:https://www.haomeiwen.com/subject/sauwaqtx.html