• 自己动手从零写桌面操作系统GrapeOS系列教程——16.封装打印字符串函数


    学习操作系统原理最好的方法是自己写一个简单的操作系统。


    在上一讲中我们向屏幕打印字符串“GrapeOS”用了十几行汇编代码,如果要输出的字符比较多,这种方法太繁琐了。本讲我们将打印字符串封装成一个函数,使用时就方便多了。

    一、mbr7.asm

    mbr7.asm代码如下:

    org 0x7c00 ;如果没有该行将无法正确打印要显示的字符串。
    
    ;初始化段寄存器。
    mov ax,cs
    mov ds,ax ;ds指向与cs相同的段。
    mov ax,0xb800
    mov es,ax ;本程序中es专用于指向显存段。
    
    ;打印字符串:"GrapeOS boot start."。
    mov si,boot_start_string
    mov di,80 ;在屏幕第2行显示。
    call func_print_string
    
    stop:
    hlt
    jmp stop 
    
    ;打印字符串函数。
    ;输入参数:ds:si,di。
    ;输出参数:无。
    ;ds:si 表示字符串起始地址,以0为结束符。
    ;di 表示字符串在屏幕上显示的起始位置(0~1999)。
    func_print_string:
    mov ah,0x07 ;ah表示字符属性,0x07表示黑底白字。
    shl di,1 ;乘2(屏幕上每个字符对应2个显存字节)。
    .start_char: ;以点开头的标号为局部标号,完整形式是 func_print_string.start_char,但在同一个全局标号func_print_string内部不需要写完整形式。
    mov al,[si]
    cmp al,0
    jz .end_print
    mov [es:di],ax ;将字符和属性放到对应的显存中。
    inc si
    add di,2
    jmp .start_char
    .end_print:
    ret
    
    boot_start_string:db "GrapeOS boot start.",0
    
    times 510-($-$$) db 0
    db 0x55,0xaa
    

    下面我们来编译运行,看看效果:

    从上面QEMU的截图中看到,我们在屏幕第二行成功打印出了字符串“GrapeOS boot start.”,符合预期。

    二、拓展讲解伪指令org

    如果我们将代码中的第一行“org 0x7c00”删除掉,会怎么样呢?请看下面实验截图:

    从上面QEMU截图中可以看到,屏幕第二行显示出了一个奇怪的字符,这并不是我们想要显示的字符串“GrapeOS boot start.”。原因是代码“org 0x7c00”表示本程序将来会加载到地址为0x7c00的内存处,这样在汇编器汇编时标号“boot_start_string”才能计算出正确的地址。如果没有“org 0x7c00”,汇编器默认会认为本程序将来会加载到地址为0x0的内存处,标号“boot_start_string”计算出的地址会在内存的前512个字节中,这明显是错误的地址,打印出来的字符串自然也是错的。
    下面我们用反汇编验证一下:

    从上面的反汇编截图可以看到,此时标号“boot_start_string”被计算为0x29。
    我们将程序中的“org 0x7c00”恢复,重新汇编后反汇编,截图如下:

    从上面的反汇编截图可以看到,此时标号“boot_start_string”被计算为0x7c29,这才是正确的。


    本讲视频版地址:https://www.bilibili.com/video/BV1qT411D7oV/
    本教程代码和资料:https://gitee.com/jackchengyujia/grapeos-course
    GrapeOS操作系统QQ群:643474045

  • 相关阅读:
    超全Chat GPT论文修改指令
    K8S(四):通过yaml 文件编排一个web-MySQL小项目
    Java语言基础第二天
    elasticsearch的docker安装与使用
    R基本语法
    Latex
    DSSD : Deconvolutional Single Shot Detector
    wirehark数据分析与取证hack.pcapng
    Python中的科学计算和数学建模
    bypass绕WAF
  • 原文地址:https://www.cnblogs.com/chengyujia/p/17225975.html