文章目录
前言
以下内容是自己的理解,有错误的地方,欢迎在评论区指证。
引导扇区程序(boot sector)
1.我们要写一个引导扇区的程序,然后将程序制作成img镜像,再将镜像文件放入软盘驱动里面,这样我们的操作系统就可以正常运行了。
第一个驱动程序hello word.asm的代码
org 07c00h;
mov ax,cs
mov ds,ax
mov es,ax
call DispStr
jmp $;无限循环
DispStr:
mov ax,BootMessage
mov bp,ax
mov cx,16
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
ret
BootMessage:db "hello world! 233"
times 510-(--$)db 0;
dw 0xaa55;
org 07c00h;
-
知识充电
- bios
- 定义:
按下电源键,电脑会执行bios程序(此时计算机的操作权在bios手里),bios(基本输入输出系统)是个人电脑启动时加载的第一个软件。它为于计算机主板的一个ROM芯片上。 - 功能:
是对硬件进行设置和控制,还可以排除系统故障或者诊断系统问题,是连接软件程序与硬件设备的一座"桥梁"
- 定义:
- 汇编
用汇编写程序,就好像使用古老的算盘打算子去做计算一样。
- bios
-
代码运行流程
bios根据电脑的启动设置(硬盘/u盘/软盘/光驱),去找到磁盘的0面,0磁道,1扇区的执行(代)码,如果改代码:大小是512字节,以0xAA55结尾,这是一个引导扇区,执码是引导程序。
所以org(即origin)代表故事开始的标志,07c00h是故事开始的地方(内存偏移地址0x7c00处),故事的内容就是hello word.asm的代码(此时计算机的操作权就变更掌握在了hello word.asm代码手里)---------------总结:加载这段程序到内存偏移地址0x7c00的内存处
DispStr
这是一个自定义函数:意思是:display string 显示字符串函数
times 510-( − - −$) db 0
db指令表示data byte 往文件里写入字节的指令。在汇编语言中,DB指令可以向文件里写入任何数据(声音,图像,文本,甚至程序)。比如db ‘‘hi’’ 汇编语言会查对应的字符编码,并转为相应的二进制,就不用我们在去查对应的字符编码了
resb指令全称reserve byte 预约字节指令。从现在的地址开始,往后写入多少字节的0x00,比如resb 10 ,就用0x00来补齐这空出来的10个字节的空间。汇编语言中,数字前面加0x代表16进制数,不加就是10进制数。
resb 510-$
//我们前面输入了132个字节,所以这里的$=132,往后连续输出378个字节,填满510个字节为止
计算机读写软盘是以512个字节为单位进行读写。boot本意靴子,是bootstrap(鞋子上的鞋带)有自力更生完成任务的意思。计算机里叫自启动
int 10h
寄存器是存储电路,它是机器语言里的变量,mov是复制的意思,AX,CX中x是extend,意味扩展
16位的cpu,它的一个寄存器可以存储16个二进制数(16位),即2字节,8个寄存器全用上,能存储cpu能存储16个字节
byte是字节(8位),word是字(16位),deword是双字(32位),他们是汇编语言中的关键字。
mov byte [678],123
//内存中的电路收到信号,某8个存储单元就会相应,存入123所对应的电信号
mov word[678] ,123
//内存中的678和679单元就会做出响应,保存123这个16的数值
int中断指令
hlt指令是让cpu进入待机状态,只要外部变化(移动鼠标,按下键盘),cpu就会醒过来
call和ret指令
call和ret都是函数调用的意思
PC(progress count)是一个16位的计数器,本质还是一个寄存器。
在程序开始执行前,将程序指令序列的起始地址,即程序的第一条指令所在的内存单元地址送入PC,CPU按照 PC的指示从内存读取第一条指令(取指)。当执行指令时,CPU自动地修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数(指令字节数),使 PC总是指向下一条将要取指的指令地址。由于大多数指令都是按顺序来执行的,所以修改PC 的过程通常只是简单的对PC 加“指令字节数”。
当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的目 标地址。处理器总是按照PC 指向取指、译码、执行,以此实现了程序转移。
关于更多的程序计数器,请自行百度百科:程序计数器
指令=操作数+操作码(是指令序列号,用来告诉CPU需要执行哪一条指令)
call 指令功能是: 将下条指令的地址值压到栈顶上,然后将PC值设置为操作数
ret指令功能是:将栈顶值弹出到PC上,就完事了
磁盘上的代码:
mov b,8
mov a,b
add a,b
push a
pop a
首先是读入内存,代码总共有5行,每行就是一条指令,mov,add,push,pop就是操作码,b,8 | a,b …就是操作数 存入内存的时候是存到命令,8存到数据,cpu会一次取一条指令,从内存中拿到命令和数据…包含指令的地址,放入寄存器中,然后进行运算。将计算结果比如说2写回到内存的数据单元存起来。