[OS64位][015]源码阅读:代码清单3-23 ~ 3-24
2019-05-16 本文已影响0人
AkuRinbu
学习笔记
使用教材(配书源码以及使用方法)
《一个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
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
0Eh DWORD pointer to list of supported VESA and OEM video modes
(list of words terminated with FFFFh)
- 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