30天自制操作系统day2汇编语言
《30天自制操作系统》一书中第1天和第二天中有关汇编语言的程序的理解
; hello-os
; TAB=4
ORG 0x7c00 ; 指明程序的装载地址
; 以下的记述用于标准FAT12格式的软盘
JMP entry
DB 0x90
DB "HELLOIPL" ; 启动区的名称可以是任意的字符串(8字节)
DW 512 ; 每个扇区(sector)的大小(必须为512字节)
DB 1 ; 簇(cluster)的大小(必须为1个扇区)
DW 1 ; FAT的起始位置(一般从第一个扇区开始)
DB 2 ; FAT的个数(必须为2)
DW 224 ; 根目录的大小(一般设成224项)
DW 2880 ; 该磁盘的大小(必须是2880扇区)
DB 0xf0 ; 磁盘的种类(必须是0xf0)
DW 9 ; FAT的长度(必须是9扇区)
DW 18 ; 1个磁道有几个扇区
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 ; 换行两次
DB "hello, world"
DB 0x0a ; 换行
DB 0
RESB 0x7dfe-$ ; 填写0x00,直到0x001fe
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
DB:define byte 往文件里直接写入1个字节 的指令
RESB:reserve byte 储备 RESB 10 储备10行
0x:16进制数
DW:define word word表示16位 就是2字节
DD:define double-word 32位表示4个字节
RESB 0x1fe-$ $可以表示这一行现在的字节数
TAB=4:tab键的宽度
FAT12格式:(FAT12 Format)用Windows或MS-DOS格式化出来的软盘就是这种格式
启动区:(boot sector):软盘的第一个扇区称为启动区 该扇区的最后两个字节的内容不是55 AA,计算机会认为这张盘没有所需的启动程序,就会保一个不能启动的错误
IPL:initial program loader启动程序加载器 加载操作系统本身的程序放在启动区
ORG:origin 告诉nask,在开始执行时,将这些机器指令装载到内存中的指定地址
- $:代表将要读入的内存地址
JMP:jump goto
entry:标签的呃声明,用于指定JMP指令的跳转目地等 入口
MOV:赋值
AX:accumulator,累加寄存器
CX:counter,计数寄存器
DX:data,数据寄存器
BX:base,基址寄存器
SP:stack pointer,栈指针寄存器
BP:base pointer,基址指针寄存器
SI:source index,源变址寄存器
DI:destination index,目的变址寄存器
16位寄存器,因此可以存储16位的二进制数 X表示扩展
======================================================================================================================================================
AL:累加寄存器低位(accumulator low)
CL:计数寄存器低位(counter low)
DL:数据寄存器低位(data low)
BL:基址寄存器低位(base low)
AH:累加寄存器高位(accumulator high)
CH:计数寄存器高位(counter high)
DH:数据寄存器高位(data high)
BH:基址寄存器高位(base high)
================================================================================================================================================================
AX = AL + AH
================================================================================================================================================================
32位寄存器:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI
段寄存器(segment register):16位寄存器
- ES:附加段寄存器(extra segment)
- CS:代码段寄存器(code segment)
- SS:栈段寄存器(stack segment)
- DS:数据段寄存器(data segment)
- FS:没有名称(segment part 2)
- GS:没有名称(segment part3)
===========================================================================================================================================================
MOV BYTE [678], 123 :用内存的’678‘号地址来保存’123‘这个数值
MOV WORD [678], 123:678号和旁边的679都会做出反应,低位保存在678,高位保存在679
数据大小[地址]
可以用寄存器来指定内存地址
只有BX、BP、SI、DI 不可以:AX、CX、DX、SP
MOV BX, DX
MOV AL, BYTE[BX]
源数据和目的数据必须位数相同 MOV AL [BX]
CMP:比较指令
JE:条件跳转指令,比较结果相等,跳转到指定的地址;不相等,则不跳转,继续执行下一条指令
fin:标号,表示结束
INT:软件中断指令 interrupt
BIOS:basic input output system基本输入输出系统(程序) 出厂时就组装在电脑主板上的ROM单元里 各种函数的集合,可以被INT调用
HLT:让CPU进入待机状态 halt
30天自制操作系统day2汇编语言的更多相关文章
- 30天自制操作系统-day2
30天自制操作系统(linux)-day2 使用简单的汇编语言 首先Centos环境安装nasm,使用vim工具编辑一个os.asm文件,文件内容如下: DB 0xeb, 0x4e, 0x90, 0x ...
- 《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统
Day2 汇编语言学习与Makefile入门 本文仅带着思路,研究源码里关于文件系统的参数 关于day2主程序部分及更多内容,请看<30天自制操作系统>笔记 导航 发现学习中的变化 源码差 ...
- 《30天自制操作系统》笔记(03)——使用Vmware
<30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...
- 《30天自制操作系统》笔记(02)——导入C语言
<30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...
- 30天自制操作系统(三)进入32位模式并导入C语言
1 制作真正的IPL IPL(Initial Program Loader),启动程序装载器,但是之前并没有实质性的装载任何程序,这次作者要开始装载程序了. 虽然现在开发的操作系统啥功能也没有,作者说 ...
- 《30天自制操作系统》笔记(06)——CPU的32位模式
<30天自制操作系统>笔记(06)——CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...
- 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操 ...
- 30天自制操作系统第八天学习笔记(u盘软盘双启动版本)
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第八天的学习思考: 关于鼠标是怎么 ...
随机推荐
- JMeter_用户自定义变量
在实际测试过程中,我们经常会碰到脚本开发时与测试执行时的服务地址不一样的情况,为了方便,我们会把访问地址参数化,当访问地址变化了,我们只需要把参数对应的值改动一下就可以了. 一.添加用户自定义变量元件 ...
- JMeter_请求参数
在做接口测试时,发送请求的参数有两种格式,一种是Parameters,一种是JSON 一.Jmeter传参 JMeter 传Parameters格式的参数 JMeter 传JSON格式的参数 二.区分 ...
- Go的日志库go-logging
配置文件config.yaml log: prefix: '[MY-LOG] ' log-file: true stdout: 'DEBUG' file: 'DEBUG' config/config. ...
- SSTI(以Twig模板引擎为例)
一.模板注入与常见Web注入 就注入类型的漏洞来说,常见 Web 注入有:SQL 注入,XSS 注入,XPATH 注入,XML 注入,代码注入,命令注入等等.注入漏洞的实质是服务端接受了用户的输入,未 ...
- 【PTA】6-2 读文章(*) (31 分)
请编写函数,从文件中读出文章,将其输出到屏幕上. 函数原型 void ReadArticle(FILE *f); 说明:参数 f 为文件指针.函数读出 f 所指示文件中的文章,将其输出到屏幕上. 裁判 ...
- RHCSA 第二天
1.Linux中的文件类型以及符号的表示 (1) 普通文件: 使用 ls -l 命令后,第一列第一个字符为 "-" 的文件为普通文件,如上图所示,普通文件一般为灰色字体,绿色字体的 ...
- 【数据结构与算法】蓄水池抽样算法(Reservoir Sampling)
问题描述 给定一个数据流,数据流长度 N 很大,且 N 直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出 m 个不重复的数据. 比较直接的想法是利用随机数算 ...
- Ajax_同源策略以及跨域问题
Ajax_同源策略 同源策略是浏览器的一种安全策略, 同源指的是:协议.域名.端口.必须完全相同. 违背同源策略就是跨域. 而AJAX是默认遵循同源策略的: 同源说通俗一点呢就是页面跟获取请求的接口是 ...
- Go 指针,标识符命名规范及关键字
#### Go 指针,标识符命名规范,关键字,运算符回顾了一下之前写的文章,以及考虑到后期的内容较多, 从这篇开始逐渐增加文章内容; 这篇我们主要学习一Go 中的指针,标识符关键字以及运算符##### ...
- ps -ef aux区别
第一点 -ef是System V展示风格,而aux是BSD风格. BSD风格 字段含义: USER:用户名称 PID:进程号 %CPU:进程占用CPU的百分比 %MEM:进程占用物理内 ...