《30天自制操作系统》第2天

一、介绍文本编译器

用Notepad++

二、继续开发

helloos.nas节选

;hello-os
;TAB=4
       
        ORG   0x7c00      ;指明程序的装载地址

;以下的记述用于标准FAT12格式的软盘
 
        JMP   entry
        DB    0x90
--(中略)--

;程序核心

entry:
        MOV   AX,0         ;初始化寄存器
        MOV   SS,AX
        MOV   SP,0x7c00
        MOV   DS,AX
        MOV   ES,AS

        MOV   SI,msg
putloop:
        MOV   AL,[SI]
        ADD   SI,1          ;给SI加1
        CMP   AL,0

        JE    fin
        MOV   AH,0x0e       ;显示一个文字
        MOV   BX,15         ;指定字符颜色
        INT   0x10          ;调用显卡BIOS
        JMP   putloop
fin:
        HLT                 ;让CPU停止,等待指令
        JMP   fin           ;无线循环
msg:
        DB    0x0a,0x0a     ;换行2次
        DB    "hello,world"
        DB    0x0a          ;换行
        DB    0

学习新指令:

1、ORG指令:这个指令会告诉nask,在执行的时候,把这些机器语言指令装载到内存中的哪个地址

                   而且有了这个指令,美元符$的含义也变化了,代表的是将要读入的内存地址

2、JMP指令:相当于C语言的goto语句,跳转的意思

3、entry:标签的声明,用于指定JMP指令的跳转目的地

4、MOV指令:赋值(类似于copy)

                  " MOV     AX,0 " 相当于 " AX=0 "

                  "MOV      SS,AX " 相当于 "SS=AX;"

5、CPU中有一种名为寄存器的存储电路,具有代表性的有8个

           AX——累加寄存器

           CX——计数寄存器

           DX——数据寄存器

           BX——基址寄存器

           SP——栈指针寄存器

           BP——基址指针寄存器

           SI——源变址寄存器

           DI——目的变址寄存器

   这些寄存器全是16位的,所以可以存储16位的二进制数

   这8个寄存器全部合起来只有16个字节。

   另一方面,CPU还有8个8位寄存器

            AL——累加寄存器低位

            CL——计数寄存器低位

            DL——数据寄存器低位

            BL——基址寄存器低位

            AH——累加寄存器高位

            CH——计数寄存器高位

            DH——数据寄存器高位

            BH——基址寄存器高位

6、32位寄存器:就是在16位寄存器的名字前加上一个E就行了

    32位寄存器也只能存储32个字节

7、段寄存器:以下都是16位的

             ES——附加段寄存器

             CS——代码段寄存器

             SS——栈段寄存器

             DS——数据段寄存器

             FS——没有名称

             GS——没有名称

8、MOV  SI,msg:JMP entry = JMP 0x7c50

               因为msg的地址是0x7c74,所以这个指令的意思是:把0x7c74带入到SI寄存器中

9、MOV  AL,[SI]:[ ]代表内存

                对于CPU来说,内存属于外部存储器   

                举例:MOV   BYTE  [678],123:这个指令就是用内存为"678"号地址保存123这个数值

                           MOV   WORD  [678] ,123:这种情况下,内存地址中的678号和679号都会做出                                                                            反应 ,一共是16位。123会变成一个16位的数值                                                                                0000000001111011,下位的01111011保存在678                                                                              号,上位的00000000保存在旁边的679号

    在汇编语言中指定内存地址时,用下面的方法写:

               数据大小  [地址]

          如果指定的数据大小为BYTE,那么使用的存储单元就只是地址所指定的字节

          如果指定的数据大小为WORD,则相邻的一个字节也会成为这个指令的操作对象

          如果指定的数据大小为DWORD,则与WODE相邻的两个字节都会成为操作对象

         (相邻:地址增加方向的相邻)

      内存地址的指定方法,不仅可以用常数,还可以用寄存器。不过可用的寄存器只有BX、BP、        SI、DI。

      MOV有个规则:源数据和目的数据必须位数相同;意思就是能向AL里带入的只有BYTE,所以        就可省略,写成:MOV  AL,[SI]

   所以这个指令的意思:把SI地址的1个字节的内容读入AL中

10、ADD指令:是加法指令     ADD  SI,1  =  SI=SI+1

11、CMP指令:比较指令     CMP   a,3   意思就是将a和3进行比较,然后下一步写"如果二者相            等,需要做什么"

12、JE:条件跳转指令之一,对于JE而言:如果比较结果相等,就跳转到指定的地址;如果不              等,则不跳转,继续执行下一条指令

13、INT:软件中断指令

14、BIOS:基本输入输出系统

15、HLT指令:让CPU停止动作,意思是让CPU进入待机状态

补充:系统中ORG指令的值:0x00007c00-0x00007dff(启动区内容的装载地址)

三、先制作启动区

     文件名:ipl.nas

     改造asm.bat,将输出的文件名改为ipl.bin,输出列表文件ipl.lst

     增加了makeing.bat,以ipl.bin为基础,制作磁盘映像文件helloos.img.的批处理文件

     编译到测试的步骤:双击!cons,然后在命令行窗口按顺序输:asm->makeing->run这三个命令       即可

四、Makefile入门

  首先生成一个不带扩展名的文件Makefile,再用文本编辑器写入以下内容:

#文件生成规则
ipl.bin : ipl.nas Makefile
    ../z_tools/nask.exe ipl.nas ipl.bin ipl.lst

helloos.img : ipl.bin Makefile
    ../z_tools/eding.exe  img:../z_tools/fdimg0at.tek ¥
        wbinimg src:ipl.bin len:512 from:0 to:0   imgout:helloos.img

#:表示注释

ipl.nas Makefile:如果想要制作文件ipl.bin,就先检查一下ipl.nas和Makeflie这两个文件是否准备                好 ,如果这两个文件都有了,Make工具就会自动执行Makefile的下一行

helloos.ing也相同

在Makefile中加入以下代码

#命令
img:
   ../z_tools/make.exe -r helloos.img
asm:
   ../z_tools/make.exe -r ipl.bin
run:
   ../z_tools/make.exe img
   copy helloos.img ..¥z_tools¥qemu¥fdimage0.bin
   ../z_tools/make.exe -C ../z_tools/qemu
install:
   ../z_tools/make.exe img
   ../z_tools/imgtol.com w a:helloos.img

增加这些后,就不需要makeing.ing 、run.bat 、install.bat

以后直接输入make run就能顺利运行了

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值