当前位置: 首页 > news >正文

30天自制操作系统-2

这一天我们会学到汇编语言,与makefile,还记昨天用了大量的DD,DW等指令,虽然已经很不错了,但我们想让它更为人看得懂。

一上来我也推荐个编辑器吧,我一般用Sublime(翻译推荐的是notepad++,这个一般被我用来打开某个单独文件)因为我以前用它习惯性写lua代码,所以,工程类的东西我还是喜欢Sublime

ORG 0x7c00 ;指明程序装在地址

JMP entry
DB 0x90

; 程序核心

entry:

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

    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

    RESB    0x7dfe-$        ; 填写0x00直到0x001fe

    DB        0x55, 0xaa

这一下基本每句代码都比较好的来解释他的意思了。虽然汇编是个很古老的语言了,但至少我们看得懂。后面大部分还是用C来写逻辑,汇编提供底层接口函数。

首先是ORG指令,他告诉编译器要让我们的程序从这个地址开始,也就是装载到指定内存地址中去。原因当然是没有啊,因为要是我来定我会定个520。
一些简单的指令就不多讲。
有几个比较具有代表性的寄存器,这里说说。
AX-累加寄存器
CX-计数寄存器
DX-数据寄存器
BX-基址寄存器
SP-栈指针寄存器
BP-基址指针寄存器
SI-源变址寄存器
DI-目标变址寄存器

然后这些寄存器可以拆为高八位与第八位分别是后缀改为LOW和HIGH这里有个比较蛋疼的问题,就是当我要取BP,SP,SI,DI这四个寄存器的低八位与高八位的时候,就得通过一个媒婆来实现,例如,MOV AX,SI 然后再用AL,AH取出来,当然可能当时Intel大叔们这样设计是有他们的原因的。
这些都是16位的寄存器后来32后有了EAX等。。,EAX取高16位非常不好取,所以一般用低16位,因为要通过位运算来得到高16位。
还有一个段寄存器
ES-附加段寄存器
CS-代码段寄存器
SS-栈段寄存器
DS-数据段寄存器
FS-没有名称
GS-没有名称

这些寄存器都可以根据其名称知道他们的作用

首先是jmp到一个标号,这个标号会被编译器自动解析为所对应的内存地址,如果你想写指定内存地址那我认为你是疯了。

接下来看看[SI],这个代表的就是去取内存条中的字节
由于用作此作用的寄存器只有BX,BP,SI,DI这几个,所以又来了个蛋疼的问题

MOV BX,DX
MOV AL,BYTE[BX]
就得这样玩儿。由于AL是8位的寄存器,所以从指定内存地址中读取一个字节内容到AL,mov的规则是左右数据必须相同,和高级语言一样。

cmp比较指令,若成立执行下一句代码若不成立略过下一句代码向后执行。

现在要来讲个很有意思的指令了,int(中断指令)其实我最开始学的时候,我据把他当成调用函数来看待,和高级语言非常类似。首先就是根据BIOS说好的我先往哪些寄存器里填东西,然后再调用某个int则可以实现某个功能。

MakeFile:

这个makefile在以后几乎随时都要用到,掌握它,不吃亏。
集成开发环境的作用就是一个软件提供了,从代码编写到运行为你最终想要看到的样子,makefile就是在写这样一个规则,当然这中间的一个个具体工作的工具,作者已提供(其实我认为作者对这部分工具没有开源,对我们来说是不可控的,不是一件好事)。
我在这里讲解的makefile不建议读者学习,仅用于自己记录(忘理解),可以上Google参考更详细的makefile教程。
格式:
要生成的文件 : 需要为生成而准备的文件 若成立则会执行下一句命令
''表示此行不够补到下行继续

make很聪明,若需要准备的文件不存在,它会首先去检查一下之前是否有命令可以生成这个文件。
没有考察过是否是根据日期来是否重新生成,或者是md5呢(对于其内部不太清楚)

关于最后:
关于作者的提问数据也能"执行"吗?机器语言也能"显示"吗? 如果是初学者一定会问的问题,若提前了解过汇编,那么这个问题,或许早就在学汇编的时候问过了。不管你是图片还是程序,甚至是音乐,在计算机看来都是0,1,关键在于你如何看待这些数据。

第二天已经over啦。总结一下,从昨天到今天,主要用上了makefile对于我们开发时常看效果简直是太方便啦。而且又解决了一些看不懂的代码,明天继续

相关文章:

  • Python运行速度如何?
  • keepalived实现服务高可用
  • js如何遍历表单所有控件
  • Vue.js 2.x笔记:安装与起步(1)
  • Form身份验证
  • Linux常用命令——runlevel、init
  • python爬虫——爬取豆瓣TOP250电影
  • 携程小程序初体验
  • java虚拟机之垃圾回收算法
  • 10分钟了解JS堆、栈以及事件循环的概念
  • 常见面试题—css实现垂直水平居中
  • hyperLedger fabric 从0到1 + End2EndIT源码解析
  • 天猫校园店一个月签约100家高校!未来要服务2000万高校人群
  • T-SQL 簡易小數處理
  • 基于 CentOS 搭建 WordPress 个人博客
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • Android Volley源码解析
  • Apache的80端口被占用以及访问时报错403
  • JavaScript服务器推送技术之 WebSocket
  • java第三方包学习之lombok
  • Redis字符串类型内部编码剖析
  • Travix是如何部署应用程序到Kubernetes上的
  • 搭建gitbook 和 访问权限认证
  • 翻译:Hystrix - How To Use
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 日剧·日综资源集合(建议收藏)
  • 十年未变!安全,谁之责?(下)
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #QT(一种朴素的计算器实现方法)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (MATLAB)第五章-矩阵运算
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net core 依赖注入的基本用发
  • .NET gRPC 和RESTful简单对比
  • .NET程序员迈向卓越的必由之路
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • :=
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [17]JAVAEE-HTTP协议
  • [2016.7 test.5] T1
  • [C/C++]数据结构 栈和队列()
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [CTSC2014]企鹅QQ
  • [Java][Android][Process] ProcessBuilder与Runtime差别
  • [LeetCode]-Integer to Roman 阿拉伯数字转罗马数字
  • [pasecactf_2019]flask_ssti proc ssti config
  • [POJ - 2386]
  • [POJ2411]Mondriaan's Dream
  • [Qt]解析moc文件