org 0x7c00     //主引导程序的入口地址为0x7c00(物理地址),类似于用c或c++程序中的main函数。

start:       //定义标签,标签的含义就是mov ax,cs这条指令的地址。
mov ax,cs
mov ss,ax
mov ds,ax
mov es,ax

首先将关键寄存器的值设置为0,但是并没有写成mov ax,0,为什么?
在开始执行的时候,cs这个段寄存器它里面的值就是0(可利用Bochs调试进行查看),而这个地方要初始化的就是各个段寄存器了。
cs段寄存器代表的是代码段;
ds代表的数据段
es代表的是附加数据段;
注意在这个程序中并没有进行明显的分段,换句话说,数据段和代码段是集中在一起的。

mov si,msg    //表示将msg这个标签所代表的地址放到si寄存器中。msg代表的地址就是db 0x0a,0x0a指令的地址

print:
mov al,[si]     //[si]就表示取数据,si寄存器里面保存的是一个地址,取地址中的数据,就使用[],类似于c语言中的*号。
         // mov al,[si]这条语句执行后,al里面保存的就是si所指向的内存中第一个字节的数据了。
add si, 1       // si= si+1,具体含义就是si所保存的地址值加1.
cmp al, 0x00    //判断一下有没有到达数据的末尾,那么数据的末尾应该如何来标识呢?
                        //判断一下al里面保存的数据是否是0x00.如果是,就结束了。
je last              //je这条指令就是看看cmp al,0x00的比较结果是不是相等,如果相等,就跳转.这就是je的含义了(jump if equal)。

//跳转到哪里呢,跳转到last这个标签所代表的地址处。

//如果al寄存器中的值不是0x00,就表示我们应该打印数据
mov ah,0x0e  //设置参数
mov bx,0x0f  //设置参数
int 0x10        //使用int指令来触发中断,触发中断的结果是什么呢?就是在屏幕上面打印一个字符。
jmp print

last:          //跳转到这里意味着数据打印结束了。
hlt              //数据大印结束了,就应该让cpu停止了。所以使用hlt指令
jmp last     // 无条件跳转,相当于一个死循环

//定义打印到屏幕上的数据了
msg:
db 0x0a,0x0a        //db=define byte 这个地方定义了两个连续的数据0x0a,0x0a就是换行
db "Hello DIOS"   //继续使用db来定义字符串
db 0x0a,0x0a       //继续定义两个字节的数据,换行符
db 0x00               //0x00就代表了数据的结束符
只看上面的代码,主引导程序写完了吗? 答案是显然的,没有
因为主引导程序应该放到主引导区MBR中,那么主引导区的标志应该是什么呢?就是0x55,0xaa
//db 0x55,0xaa //这样就完事了吗?还没有。为什么?上面的代码显然没有512个字节,就需要使用填零的操作。怎么去填零呢?

times 510-($-$$) db 0x00     //$就表示该行的地址,$$就代表这段汇编代码的起始地址,因此$-$$就是表示我们编写的汇编代码一共占用了多少个字节。510-已经编写的代码所占的字节数,就代表着需要填零的个数了。
//注意一下,这个地方是510去减,而不是512去减。因为下面 db 0x55,0xaa占用了两个字节
db 0x55,0xaa

Hello,DTOS!(中)的更多相关文章

  1. 基于ABP落地领域驱动设计-01.全景图

    什么是领域驱动设计? 领域驱动设计(简称:DDD)是一种针对复杂需求的软件开发方法.将软件实现与不断发展的模型联系起来,专注于核心领域逻辑,而不是基础设施细节.DDD适用于复杂领域和大规模应用,而不是 ...

  2. Abp vNext 基础篇丨分层架构

    介绍 本章节对 ABP 框架进行一个简单的介绍,摘自ABP官方,后面会在使用过程中对各个知识点进行细致的讲解. 领域驱动设计 领域驱动设计(简称:DDD)是一种针对复杂需求的软件开发方法.将软件实现与 ...

  3. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  4. ABP(现代ASP.NET样板开发框架)系列之16、ABP应用层——数据传输对象(DTOs)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之16.ABP应用层——数据传输对象(DTOs) ABP是“ASP.NET Boilerplate Project ...

  5. DDD 领域驱动设计-领域模型中的用户设计

    上一篇:<DDD 领域驱动设计-如何控制业务流程?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新,并增加了 ...

  6. ABP应用层——数据传输对象(DTOs)

    ABP应用层——数据传输对象(DTOs) 基于DDD的现代ASP.NET开发框架--ABP系列之16.ABP应用层——数据传输对象(DTOs) ABP是“ASP.NET Boilerplate Pro ...

  7. [周译见] C# 7 中的模范和实践

    原文地址:https://www.infoq.com/articles/Patterns-Practices-CSharp-7 关键点 遵循 .NET Framework 设计指南,时至今日,仍像十年 ...

  8. JS组件系列——在ABP中封装BootstrapTable

    前言:关于ABP框架,博主关注差不多有两年了吧,一直迟迟没有尝试.一方面博主觉得像这种复杂的开发框架肯定有它的过人之处,系统的稳定性和健壮性比一般的开源框架肯定强很多,可是另一方面每每想到它繁琐的封装 ...

  9. 使用MediatR重构单体应用中的事件发布/订阅

    标题:使用MediatR重构单体应用中的事件发布/订阅 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10640280.html 源代码:https ...

随机推荐

  1. golang 服务端和客户端(二)

    1.golang服务端 package main import( "net/http" ) func main(){ //注册处理函数,用户连接,自动调用指定的处理函数 http. ...

  2. JavaScript中的数组Array

    抄自:https://www.jianshu.com/p/7e160067a06c js中数组的方法种类众多,有ES5之前版本中存在的,ES5新增,ES6新增等:并且数组的方法还有原型方法和从obje ...

  3. 鲜贝7.3--python安装

    方法一:google 搜索 anaconda 进入官网下载64位最新版本 勾选加入环境变量 +默认3.7 打开cmd pip 发现已经完成安装 右键此电脑 属性 高级属性 环境变量 ’ 已经被加入 方 ...

  4. Python文件读取中:f.seek(0)和f.seek(0,0)有什么区别

    file.seek()方法标准格式是:seek(offset,whence=0)offset:开始的偏移量,也就是代表需要移动偏移的字节数whence:给offset参数一个定义,表示要从哪个位置开始 ...

  5. AtCoder Grand Contest 036

    Preface 这篇已经鸽了好久的说,AGC037都打完了才回来补所以题目可能都记不大清楚了,如有错误请指正 这场感觉难度远高于上一场,从D开始就不会了,E没写(看了题解都不会写),F就是抄曲明姐姐的 ...

  6. java8 LinkedHashMap 原理

    LinkedHashMap 原理 基于jdk1.8 HashMap原理:http://www.cnblogs.com/zhaojj/p/7805376.html LinkedHashMap 继承Has ...

  7. webpack打包教程(一)常用loader详解

    1.打包图片 // { // test: /\.(png|jpe?g|gif)$/i, // use: [{ // loader: 'file-loader', // options: { // na ...

  8. Visual Studio 定制模板类---详细步骤

    1.先定义一个类文件,将要定义的信息写入类文件 比如我每次写一个命令都是这个套路,要继承接口,要写上相应的特性,每次都 是重复的工作: 2.提取类模板 项目=>导出模板 这里你可以导出项目模板和 ...

  9. Spring源码系列 — 注解原理

    前言 前文中主要介绍了Spring中处理BeanDefinition的扩展点,其中着重介绍BeanDefinitionParser方式的扩展.本篇文章承接该内容,详解Spring中如何利用BeanDe ...

  10. Out,ref,params修饰符,可选参数,命名参数

    out输出,在调用函数中声明,在被调用函数中赋值: ref在调用函数中赋值,后调用: params修饰符,static double CalculateAverage(params[] values) ...