我们继续学习操作系统的相关内容。

; hello-os
; TAB=4 ORG 0x7c00 ; このプログラムがどこに読み込まれるのか ; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 JMP entry
DB 0x90
DB "HELLOIPL" ; ブートセクタの名前を自由に書いてよい(8バイト)
DW 512 ; 1セクタの大きさ(512にしなければいけない)
DB 1 ; クラスタの大きさ(1セクタにしなければいけない)
DW 1 ; FATがどこから始まるか(普通は1セクタ目からにする)
DB 2 ; FATの個数(2にしなければいけない)
DW 224 ; ルートディレクトリ領域の大きさ(普通は224エントリにする)
DW 2880 ; このドライブの大きさ(2880セクタにしなければいけない)
DB 0xf0 ; メディアのタイプ(0xf0にしなければいけない)
DW 9 ; FAT領域の長さ(9セクタにしなければいけない)
DW 18 ; 1トラックにいくつのセクタがあるか(18にしなければいけない)
DW 2 ; ヘッドの数(2にしなければいけない)
DD 0 ; パーティションを使ってないのでここは必ず0
DD 2880 ; このドライブ大きさをもう一度書く
DB 0,0,0x29 ; よくわからないけどこの値にしておくといいらしい
DD 0xffffffff ; たぶんボリュームシリアル番号
DB "HELLO-OS " ; ディスクの名前(11バイト)
DB "FAT12 " ; フォーマットの名前(8バイト)
RESB 18 ; とりあえず18バイトあけておく ; プログラム本体 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-$ ; 0x7dfeまでを0x00で埋める命令 DB 0x55, 0xaa ; 以下はブートセクタ以外の部分の記述 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432

ORG 0x7c00表示让程序被装载到内存的0x7c00号地址。

jmp entry相当于C语言中的goto entry,跳转语句。这是因为前面的东西都是起动区和填充内容,不是可执行的代码,因此要跳过这一部分。

MOV语句其实就是一个赋值语句,MOV AX,0 表示C语言中的 AX=0; 这一语句。

AX其实就是一个寄存器。关于寄存器的内容可以见原文:

汇编语言中经常使用寄存器,这是因为寄存器的访问速度会比内存快很多。

其他的详见书本。然后,我们重点讲下putloop部分,这是汇编语言写循环的基本操作。

我们使用C语言写类似的语句一定是这样的:

for(si=msg;*si != 0x00;i++){
//一些输出文字的操作
}

[SI]表示SI号内存的内容,例如[0x220000]表示0x220000号地址的内容。

其实这个语句可以看做是一个指针,汇编的[x]就是C语言中的*x。

就像上图,SI不断向右,指向下一个内存位置并输出这个字符,直到结束。

汇编语言没有for循环语句,只能使用跳转的方式进行。思路是“如果没有到0,就再执行一遍”,再次执行一遍,就是进行跳转,转到putloop的地方继续执行。

后面有个fin,反复执行HLT。HLT是休眠指令。

讲了这样久,终于把汇编程序讲完了。我们下期再见。

最新文章

  1. C# TransactionScope 使用
  2. jquery制作弹出层带遮罩效果,点击阴影部分层消失
  3. [转]pycharm 2016 注册码
  4. java如何准确的读取多音字
  5. 你好,C++(19)“老师,我这次四级考试过了没有?”——4.2 条件选择语句
  6. C#之系统异常处理机制
  7. C语言的隐式类型转换
  8. springcloud 新增微服务
  9. GIT-windows系统部署git服务器
  10. 中兴F660光猫改桥接
  11. 【PyTorch深度学习60分钟快速入门 】Part5:数据并行化
  12. Oracle spatial、openlayers、geoserver开发地理信息系统总结
  13. DevExpress WinForms v18.2新版亮点(五)
  14. php 通过stomp协议连接ActiveMQ
  15. [转载] npm 一些操作
  16. Spring源码分析之IOC容器(一)
  17. vsftp移植(待续)
  18. 物料类型AM11没有任务清单类型N定义
  19. C#串口通讯
  20. kindeditor简单使用

热门文章

  1. STM32启动文件详解及SystemInit函数分析(转)
  2. 课程设计- 基于ssm的捐赠物资分配管理系统 && 基于java的申请救援管理系统
  3. Java 多线程与并发【原理第二部分笔记】
  4. Prometheus alertmanager邮件发送+grafana告警展示
  5. STP规则
  6. 一文搞懂B树、B-树、B+树
  7. centos7上安装redis6-0-5
  8. vue同一个页面可以有多个router-view
  9. TCP三次握手中SYN,ACK,Seq含义
  10. C#多线程---I/O线程实现异步请求