zoukankan      html  css  js  c++  java
  • 《30天自制操作系统》笔记4 --- (Day2 下节)了解如何用汇编写操作系统中的HelloWorld

    关于上一节,我测试了发现3e、4c、4e都OK ,4b 4d 4f都进不去系统还把qemu卡死了。 50不会输出HelloWorld,可能需要hex偶数且在0x3e~4f区间吧。上节复制并运行命令如下:

    copy /y helloos-Copy.img ..z_toolsqemufdimage0.bin && ..z_toolsmake.exe -C ../z_tools/qemu
    View Code

    先不管上一节了,这节我们写HelloWorld

    看不清请右击“从新窗口打开图片”,下为P29 P39两页对照

     MOV就是赋值,没什么难的。所以我们用P39来研究,方便一点。

    既然C语言是顺序结构,那汇编就更是了(事实上的确是),所以我们先挑后面容易的打印字符部分来看

    H、L是寄存器高低位,高位0x0e为当前光标处显示字符功能,低位为字符内容(这里通过把数组每个元素赋值给加法寄存器低位)

    这一段是这么执行的(C语言的标签):entry => putloop(循环n次) => fin(无限次循环)

    goto 就是跳转到标签所在位置,并从标签开始往下执行。如

    int i = 0;
    
    try:
        printf("%s", "Hello");
        i--;
    go: 
        printf("%s", "World");
    to:     
        if (i < 0)
            goto try;

    这个会执行try => go => to,再跳转到try,重新try go to这样顺序执行下来。(直到i<0才停止)

    再看msg标签部分

    按照ASCII码表,这个msg明显就是" hello, world "嘛,''是字符串结束符 (NUL),'a'是换行符' '(LF)

     关于HLT,总之就是暂停并等下一次操作。这里是为了节省cpu资源

     该汇编指令是处理器“暂停”指令。“暂停” HaLT,没有操作数[1] 
    功能:
    使程序停止运行,处理器进入暂停状态,不执行任何操作,不影响标志。
    当复位(外语:RESET)线上有复位信号、CPU响应非屏蔽中断、CPU响应可屏蔽中断3种情况之一时,CPU脱离暂停状态,执行HLT的下一条指令。

    那个输出字符到屏幕的功能是这样实现的:

    这里有一个的INT 0x10是一个叫BIOS中断的东西,参考: BIOS 中断向量表 和 BIOS中断大全

    看了一下,从我开始找操作系统相关的资料到现在,基本上有用的全面的资料都能在维基百科里找到...没有科学就绝望了

     作者说无法显示字体颜色,应该就是这个原因吧?


    研究完了打印部分,我们来看最主要的部分,给寄存器赋值部分

    AX = 0

    然后注意,SS = AX是把AX的值赋给SS,AX的值是数值0 但并不是地址。所以这一列就只是将AX SS DS ES都初始化为0,

    而SP = 0X7C00 和 SI = msg 才是这部分的重点

    所以我们得找一下 栈指针和源变址 两个寄存器的作用

    这么多寄存器,我们得找一下他们的作用:

    寄存器速记(第二个字母)

    S segment 段寄存器
    X 基于八的extend 16位寄存器
    P pointer 指针寄存器

    寄存器名(省略寄存器三字):

    AX 加法(add)

    SS 栈段(Stack segment)

    SP 栈指针

    DS 数据段

    ES 附加段(extra)

    我猜:

    SP栈指针 指向整个程序/操作系统开始的地方

    SI存放msg标签的数据,即" hello, world ",然后由之后的程序把SI所存的地址值不断+1并不断赋值给AL(这个寄存器存放着需要中断变量/函数INT 10要打印的字节),类似于c语言的data = a[++i],并且判断AL == 0成立时跳出循环,以此实现在屏幕上打印HelloWorld的功能

    事实上:

     

     也就是说标签名代表了标签所在地址

    大概就是这样了,具体看书里的即可

    重要参考资料:

    --------蓝天上的云_转载请注明出处.
  • 相关阅读:
    剑指Offer 14. 最长公共前缀
    SpringCloud学习笔记【一】:多模块聚合工程基本环境搭建
    SpringCloud学习笔记【零】:官方文档翻译之简介
    SpringBoot利用AOP巧妙记录操作日志
    SpringBoot中BeanValidation数据校验与优雅处理详解
    解决:IDEA无法创建Java文件,只能创建kotlin文件
    SpringBoot实现文件上传功能详解
    SpringBoot快速瘦身,快速部署jar
    SpringBoot的外部化配置最全解析!
    IDEA解决yml配置文件中文输出乱码问题
  • 原文地址:https://www.cnblogs.com/yucloud/p/10951537.html
Copyright © 2011-2022 走看看