石家庄网站推广专家,php网站分类目录源码,哈尔滨行业网站建设策划,宁波seo推广公司排名前言#xff1a;这是我2023年5月份做的一个小项目#xff0c;最终是完成了整个OS。笔记的话#xff0c;只记录了第一周。想完善#xff0c;却扔在草稿箱里许久。最终决定#xff0c;还是发出来存个档吧。
一、汇编语言
基础指令
MOV: move赋值#xff0c;数据传送指令…前言这是我2023年5月份做的一个小项目最终是完成了整个OS。笔记的话只记录了第一周。想完善却扔在草稿箱里许久。最终决定还是发出来存个档吧。
一、汇编语言
基础指令
MOV: move赋值数据传送指令。一个规则源数据和目的数据必须位数相同。该指令的数据传送源和传送目的地不仅可以是寄存器或常数而且可以是内存地址ADD: add加演算指令CMP: compare比较指令JMP: jump/goto跳转跳转到指定的内存地址例如JMP 0x7c50ORG: origin源头起点程序要从指定的该地址开始DB: define byte往文件里直接写入1个字节的指令db小写功能相同也可直接用它写字符串RESB: reserve byte预留n个字节空出地址上自动填充0x00
条件跳转指令
JE: jump if equal如果相等就跳转JB: jump if below如果小于就跳转JAE: jump if above or equal大于或等于时就跳转JBE: jump if below or equal小于或等于时就跳转JC: jump if carry如果进位标志是1就跳转JNC: jump if not carry如果进位标志是0就跳转
其他指令
DW: define word16位2字节DD: define double-word32位4字节BYTE/WORD/DWORD: 保留字DWORD: Double Word双字节数据类型是指注册表的键值每个word为2个字节的长度DWORD 双字即为4个字节每个字节是8位共32位entry: 入口标签的声明指定JMP指令的跳转目的地【汇编中所有标号都是数字其对应的数字由汇编语言编译器根据ORG指令计算出来】EQU: equal声明常数fin: finish结束INT: interrupt中断调用BIOS函数的指令HLT: halt停止让CPU停止动作的指令进入待机状态节能CLI: clear interrupt flag中断标志置为0STI: set interrupt flag中断标志置为1EFLAGS: 存储进位标志和中断标志等标志的寄存器PUSHFD: push flags double-word标志位的值按双字节长压入栈POPFD: pop flags double-word标志位的值按双字节长从栈弹出LGDT: 指定一个内存地址从指定的地址【ESP6】读取6个字节后赋值给GDTR寄存器48位将指定的段上限【存放在ESP4】和地址值【ESP8】赋值给名为GDTR的48位寄存器低位放在内存地址小的字节里前$: 这一行现在的字节数若有ORG代表将要读入的内存地址[]: 内存/主存对于CPU其为外部存储器
二、存储相关概念 缓冲区地址从软盘上读出的数据装载到内存的哪个位置
EBX处理4G内存32位基址寄存器
起辅助作用的段寄存器MOV AL,[ES:BS] 代表ES*16BX的内存地址
先用附加段寄存器指定一个大致的地址然后再用基址寄存器来指定其中一个具体地址 可以默认省略数据段寄存器DS,DS必须预先指定为0
例如
MOV CX,[1234] 等价于MOV CX,[DS:1234]
MOV AL,[SI]等价于MOV AL,[DS:AL] 指定处理的扇区数范围在0x01-0xff(指定0x02以上的数值时要特别注意能够连续处理多个扇区的条件。如果是FD的话似乎不能跨越多个磁道也不能超过64KB的界限) 读盘顺序扇区-磁头-柱面 AH0x02: 读盘
AH0x03: 写盘
AH0x04: 校验
AH0x0c: 寻道
AL处理对象的扇区数只能同时处理连续的扇区
CH柱面号0xff
CL扇区号0-5位|柱面号0x3002
DH磁头号
DL驱动器号
ES:BX缓冲地址校验及寻道时不使用
返回值
FLAGS.CF: 进位标志
FLACG.CF0: 没有错误AH0
FLAGS.CF1: 有错误错误号码存入AH内与重置reset功能一样
0x10(16号): 控制显卡
//显示一个字符
AH0x0e;
ALcharacter code;
BH0;
BLcolor code;
返回值无
//系统复位复位软盘状态再读一次
AH0X00
DL0X00
INT0x13 正在上传…重新上传取消正在上传…重新上传取消
一般向一个空软盘保存文件时
1文件名会写在0x002600以后的地方
2文件的内容会写在0x004200以后的地方 如果与C语言联合使用有的寄存器能自由使用EAX/ECX/EDX其他寄存器只能使用其值不能改变其值
char *p;//用于BYTE类地址
short *p;//用于WORD类地址
int *p;//用于DWORD类地址 正在上传…重新上传取消正在上传…重新上传取消 os思想把操作和机制分开 三、术语
TAB4: TAB键的宽度
FAT12: 用Windows或MS-DOS格式化出来的软盘就是该格式
boot sector: 启动区软盘的第一个扇区512字节为1扇区一张软盘共有2880个扇区
IPL: initial program loader启动程序加载器必须取8字节的名字
boot: bootstrap启动原指靴子上附带的便于拿取的靴带自力更生完成任务
BIOS: basic input output system基本输入输出系统组装在电脑主板的ROM(read only memory)单元里
0x00007c00-0x00007dff: 启动区内容的装载地址 地址空间一个进程用于寻址内存的一套地址集合。主要用于解决多个应用程序同时处于内存中并且互不影响的问题——保护和重定位。
.com: 地址空间可以非数字以.com结尾的网络域名的集合也是地址空间。 sys是system的缩写,就是系统的意思,sys是Windows的系统文件。如安装文件日志文件驱动文件备份文件操作如播放等文件还有些垃圾文件等诸如此类。 都是这类sys后缀名的。
sys文件是驱动程序的可执行代码,其扩展名为.sys,驱动程序安装保持在windows/system32/drivers目录中。 在windows中文件的文件的路径是用反斜杠\表示当初是为了和Unix的文件路径使用”/“区分开来例如 C:\windows\system,但是我们在写程序的时候能不能再路径的字符串中写成C:\windows\system答案是不能的这一点想一下就会可以理解在很多编译器中“\”是一个转义字符例如“\n,\r”等如果在程序中写成“C:\windows\system“那么实际上编译出来的就是“C:windowssystem 从而获取不到文件但是这个路径可以写成C:\windows\system或者也可以用正斜杠C:/windows/system,这两中方式都是可以的。说到这里基本上这两种用法不会混淆了只要记住”\“反斜杠有转义的功能那么写路径的时候就不会出问题了。 顺便拓展一下文件的相对路径和绝对路径 例如一个绝对路径C:\Windows\System\aaa.dll 如果当前目录是C:\windows 那么aaa.dll这个文件的地址可以表示为 ./system/aaa.dll 中”.“表示当前路径 …/windows/system/aaa.dll中”…“表示父级目录。 VGA显卡VGAVideo Graphics Array视频图形阵列是IBM于1987年提出的一个使用模拟信号的电脑显示标准。 sprintf: 只对内存进行操作可应用于所有OS。不是按指定格式输出只是将输出内容作为字符串写在内存中。能够不使用OS的任何功能。 分段将4GB的内存分割每一块的起始地址都看作0来处理
分页paging有多少个任务就要分多少页还要对内存进行排序 GDT设定要优先于IDT
GDT: global (segment) descriptor table全局段号记录表。将这些数据整齐地排列在内存的某个地方然后将内存的起始地址和有效设定个数放在CPU内被称作GDTR(global segment descriptor table register)的特殊寄存器中设定完成。C语言里不能对GDTR赋值。
IDT: interrupt descriptor table中断记录表
中断功能当CPU遇到外部状况变化或者是内部偶然发生某些错误时会临时切换过去处理这种突发事件。这就是中断功能。
要使用鼠标就必须要使用中断。
各个设备有变化时就产生中断中断发生后CPU暂时停止正在处理的任务并做好接下来能够继续处理的准备转而执行中断程序。中断程序执行完后再调用事先设定好的函数返回处理中的任务。正是得益于中断机制CPU可以一直不用查询键盘、鼠标、网卡等设备的状态将精力集中在处理任务上。
这就是为什么每个操作前后要加中断标志的原因叭~ 系统专用和应用程序用 等价于 内核模式和用户模式 PIC: programmable interrupt controller可编程中断控制器。将8个中断信号IRQ(interrupt request)集合成一个中断信号的装置。 正在上传…重新上传取消正在上传…重新上传取消 PIC寄存器8位
IMR: interrupt mask register中断屏蔽寄存器。8位分别对应8路IRQ信号。如果该位值为1对应IRQ信号被屏蔽PIC忽视该路信号。理由对中断设定进行更改时如果再接受别的中断会引起混乱所以要屏蔽此外还可以屏蔽静电干扰等。
ICW: initial control word初始化控制数据。只有CPU里word指代16位这里不一定
OCW:操作命令字。OCW1写入奇地址口OCW2、OCW3写入偶地址口。功能PIC继续时刻监视IRQ信号中断是否发生。io_out8(PIC0_0CW2, 0x60IDQ号码) 四、遇到的问题
描述问题1模拟运行操作系统时双击!cons_9x.bat启动失败。 解决方法导致该问题的原因是我自己没有仔细看书上的标注双击!cons_nt.bat重试后启动成功。原因是两个文件中的命令不同!cons_9x.bat中命令为command适合linux一类系统而!cons_nt.bat中命令为cmd.exe适合我现在所用的windows系统。
问题2 正在上传…重新上传取消正在上传…重新上传取消
人麻了以为路径表示不对跟着重新打了一遍一模一样的最后发现是拼写失误IMG写成ING了。
改了名称一切正常。
网上跟我同一个报错的但理由又是各不相同。 问题3数据也能执行吗msg 机器语言也能显示吗entry
不会报错标号只是一个数字但会错乱
不太懂以下的语句
0A 0A——OR CL,[BPSI]
68 65 6C——PUSH 0x6c65 问题4 正在上传…重新上传取消正在上传…重新上传取消 正在上传…重新上传取消正在上传…重新上传取消 问题5 无法生成sys文件
磁盘名称11字节
代码抄错生成镜像文件时一定要确保bin,sys, Makefile 同时存在
报错驱使我把代码看得更细 人才把200写成了2OO吐血 正在上传…重新上传取消正在上传…重新上传取消
学会定位错误。添加新的中间文件makefile时需要注意前后的连贯性是否需要添加/增减 正在上传…重新上传取消正在上传…重新上传取消
忘记声明全局变量了 正在上传…重新上传取消正在上传…重新上传取消
问题可能出在makefile/naskfunc.nas/bootpack.c中 问题 正在上传…重新上传取消正在上传…重新上传取消
使用32位寄存器需要你进入保护模式进入保护的方法就是开A20 gate我看下面几行的汇编应该就是在对CR0的这个位进行设置从而进行快速A20。如果想使用64位寄存器就必须在进入保护模式之后开启长模式(long mode)。 正在上传…重新上传取消正在上传…重新上传取消
INSTRSET指令告诉nask这个程序是给486使用的哦nask会将EAX解释成寄存器名
486是英特尔系列的CPU【32位】 指定内存时不知道是BYTE,WORD,DWORD只有另一方也是寄存器的时候才能省略 p不是指针而是地址变量用于存放地址值 问题如何显示字符
这个逻辑还是没有搞清楚 //extern char hankaku[4096]; why can delete?
//GDT的长度是怎么定的0x270000-0x27ffff 问题
第六天中的GB到底是什么
1GB(Gigabyte)1024MB
G:granularity颗粒度单位的大小
4KB * 1M4GB。1KB * 1M 1GB。 问题 为什么键盘输入需要缓冲区
缓冲区其实就是一块内存空间它用在硬件设备和用户程序之间用来缓存数据 目的是让快速的CPU 不必等待慢速的输入输出设备同时减少操作硬件的次数。 _io_stihlt
汇编语言写的函数链接到C语言使用时一定要加_
根据CPU规范机器语言的STI指令之后如果紧跟着HLT指令那么就暂不受理这两条指令之间的中断而要等到HLT指令之后才受理所以使用io_stihlt函数就能克服这一问题 最常出现的错误cant link
关注细节语法错误重点看中断部分
.h 和 naskfunc.nas 问题
改善FIFO缓冲区还存在E0问题 五、总结感悟
头文件.h 和 makefile类正则匹配的共同目的减少重复片段头文件.h的作用类似目录报错首先检查笔误再依次按关联度从高到低排查文件