第二天 汇编语言和启动区
基于第一天的基础上,将机器语言转成汇编语言
简单总结了下汇编的指令和寄存器:
指令(大小写均可)
;注释
DB往文件例写入一个字节的指令
RESB后接数字,表示空出多少个字节并补上0,RESB 0x1fe-$这里的$表示一个变量,可以返回这一行现在的字节数
DW和DB很像,写入2个字节16位
DD写入4个字节32位
ORG会告诉nask在开始执行的时候把这些机器语言指令转载到内存中的哪个地址,$在这里表示将要读入的内存地址,而且只能写0x7c00
JMP相当于C语言的goto,后面接一个目的地的标签,并执行所在地址的程序
MOV赋值,MOV AX,0表示将0赋值给AX,但是0这个值还存在原位置,有个规则源数据和目的数据位数相同,因此如果内存赋给已知大小的寄存器是,可以省略关键字(BYTE,WORD,DWORD),MOV AL,BYTE[SI]可写成MOV AL,[SI]
ADD加法指令,ADD SI,1表示SI=SI+1
CMP比较指令,c中if命令的一部分,CMP a,3比较a和3
JE条件跳转指令之一,根据比较结果决定是否跳转,
比如CMP AL,0
JE fin
表示
if(AL==0){goto fin;}
INT软件中断指令,用来调用BIOS(基本输入输出系统)就是各种函数的集合,INT后接数字,不同的数字表示不同的函数,这里用了0x16(16)用来控制显卡用来输出文字
HLT让CPU进入待机,但按下键盘或鼠标就会醒来继续执行,
内存
如果命令中出现[]中括号,表示内存,比如mov AL,[SI]表示将内存中SI所表示的内存地址赋给AL
BYTE,WORD,DWORD都是汇编的保留字,分别表示8位(1字节),16位(2字节),32位(4字节)
例如MOV BYTE [678],123表示内存678地址保存01111011
MOV WORD [678],123表示内存678地址(下位)保存01111011,地址679(上位)保存00000000
MOV DWORD [678],123表示内存678地址(下位)保存01111011,地址679,680,681(上位)都保存00000000
寄存器也可以代表内存地址,但是只限于BX,BP,SI,DI这四个可以用,因为CPU没有处理其他寄存器指令的电路
注:内存中的地址也不是随便使用(可查看内存分布),其中启动区内存装载地址0x00007c00-0x00007dff
寄存器(相当于内置变量)
8个16位的寄存器,8个8位的寄存器,8个32位的寄存器(如果CPU是32位)
大的寄存器包含小的寄存器,因为CPU的大小已经定了
16位
AX——累加寄存器
CX——计数寄存器
DX——数据寄存器
BX——基址寄存器
SP——栈指针寄存器
BP——基址指针寄存器
SI——源变址寄存器
DI——目的变址寄存器
不管使用哪一个寄存器做中间存贮变量都能得到相同的运算结果,但是就算把这8个全用起来也才有16个字节
8位
AL——累加寄存器低位
CL——计数寄存器低位
DL——数据寄存器低位
BL——基址寄存器低位
AH——累加寄存器高位
CH——计数寄存器高位
DH——数据寄存器高位
BH——基址寄存器高位
其中AX的0-7位是AL,8-15位是AH。CX,DX,BX一样;SP,BP,SI,DI中没有高低8位需要先赋值给AX等有高低位的寄存器,再取值
32位
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI同样和16位寄存器有一些是公用的
段寄存器(16位)
ES——附加段寄存器
CS——代码段寄存器
SS——栈段寄存器
DS——数据段寄存器
FS——没名称
GS——没名称
下面基于第一天的逐步修改
第一次:https://pan.baidu.com/s/1Rjqi6rKFJK6OuGuIP4paWw
第二次:https://pan.baidu.com/s/1UySuMDUyjcwKxXCijmDp8Q
第三次:https://pan.baidu.com/s/1DcQrTGe1rK8qn_v3dE0IfA
以上都可以用nask.exe来生成img文件,例如nask.exe helloos.nas helloos.img
nask工具:https://pan.baidu.com/s/1Hkw8cbePEK8hG0x5VbekbQ
基于系统盘会变的臃肿,因此制作512字节的启动区
启动区文件:https://pan.baidu.com/s/1MF0fRi7ngpbhW4bvm6MDCg
nask.exe ipl.nas ipl.bin ipl.lst这时再制作的时候可以输出以下lst文件(描述每个指令是怎么翻译成机器语言,这时的lst文件会比较小)
继续
根据bin文件来生成img文件
edimg.exe imgin:fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
edimg.exe磁盘镜像管理工具:https://pan.baidu.com/s/1IHK5ELsYPyqJlpmiQO2nmg
fdimg0at.tek文件:https://pan.baidu.com/s/1Nmd9zkGwEoorUboxjooa3A
或者使用批处理文件Makefile
可以创建Makefile文件,里面写上
#如果构建ipl.bin会自动检查ipl.nas和Makefile是否存在,存在执行
ipl.bin : ipl.nas Makefile
nask.exe ipl.nas ipl.bin ipl.lst
helloos.img : ipl.bin Makefile#同样也会先检查
edimg.exe imgin:fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
然后可以用make.exe工具来进行构建bin和img文件
https://pan.baidu.com/s/1WrdH9xpfw3UF_BfKfHcbig
make -r ipl.bin和make -r helloos.img,如果直接执行make -r helloos.img也会自动在Makefile文件中先找ipl.bin,先生成依赖再执行make -r helloos.img
Makefile文件
https://pan.baidu.com/s/1AZaW9_lT7NdFNhtI-okYlg