ORG 0x7c00:指定将本代码装载到内存的0x7c00开始的位置;内存中0号位置开始的部分和0xf0000号位置的附近存放着BIOS的程序;内存中0x00007c00~0x00007dff号位置专门用来存放启动区代码
JMP entry:跳转到entry所在的内存地址
MOV AX, 0:赋值AX = 0
寄存器:
寄存可以混用,但使用指定功能的寄存器可以使生成的二进制代码更短。
32位寄存器:
EAX:extend accumulator,累加寄存器,做加法EAX+一个数
ECX:extend counter,计数寄存器
EDX:extend data,数据寄存器
EBX:extend base,基址寄存器,计算内存地址的基点
ESP:extend stack pointer,栈指针寄存器,使用PUSH、POP指令时自动对这个寄存器进行操作
EBP:extend base pointer,基址指针寄存器
ESI:extend source index,源变址寄存器
EDI:extend destination index,目的变址寄存器
16位寄存器:
AX、CX、DX、BX、SP、BP、SI、DI:相应的32位寄存的低16位
8位寄存器:
AL、CL、DL、BL:相应的16位寄存器的低8位
AH、CH、DH、BH:相应的16位寄存器的高8位
段寄存器,使用段功能时使用:
ES:附加段寄存器
CS:代码段寄存器
SS:栈段寄存器
DS:数据段寄存器
FS
GS
[678]:内存中678号的位置上的内容
[SI]:内存中SI号的位置上的内容;根据SI寄存器中存的值得不同,就可以访问到不同位置得内存;只有BX、BP、SI、DI有此功能
BYTE、WORD、DWORD:可以指定一次操作的内存数据大小,BYTE一次操作1字节,WORD一次操作2字节、DWORD一次操作4字节
ADD SI, 1:加法指令,SI = SI + 1
CMP AL, 0:AL是否等于0;结果会保存在标志寄存器中
JE:条件跳转指令,CMP的结果为相等时,则跳转;会自动去访问标志寄存器中的结果
INT 0x10:
软件中断指令,调用BIOS函数中的控制显卡功能
参数:
AH = 0x0e
AL = 要显示的字符
BH = 0
BL = 颜色代码
INT 0x10
返回值:无
HLT:让CPU停止动作的指令,进入待机状态,当按下键盘、移动鼠标时,CPU就会醒过来
更可理解的汇编代码
ORG 0x7c00
JMP entry
DB 0x90
一段FAT12格式软盘固定代码
entry:
SS = DS = ES = 0
SP = 0x7c00
SI = msg的地址
putloop:
用AL依次读取msg写入的字符串
向AL、AH、BL、BH设置参数,调用BIOS函数显示字符串
fin:
HLT;JMP fin;
msg:
2个换行
声明想要输出的字符串
换行
DB 0x00
.lst文件:文本文件,可以用来确认每条汇编指令是怎样翻译为机器语言的
edimg.exe:磁盘映像管理工具,可以读入空白磁盘映像文件、写入内容、输出磁盘映像文件
制作启动区
保留汇编程序的前512字节(直到写55AA的那个位置)
修改asm.bat:使用nask.exe将汇编代码转换为.bin二进制文件和.lst文件
makeimg.bat:使用edimg.exe基于.bin文件生成.img磁盘映像文件
运行:打开cmd,输入asm、makeimg、run
Makefile
新建Makefile空文件
编写文件生成规则:
想要生成的文件 : 需要的文件列表;回车缩进;生成方法(使用的工具位置,工具所需参数)
make.bat:调用make.exe同时接收并传递参数
打开cmd
输入make -r 想要生成的文件:
程序会自动寻找Makefile里记录的生成所需文件和生成方法,然后生成文件;
当所需文件不存在时,程序还会先自动从它的Makefile里寻找有没有所需文件的生成方法,有的话就自动生成文件,然后继续生成指定的文件;
当指定生成一个文件时,若已有该文件,程序会自动根据各所需文件的修改时间判断当前已有文件是否已是最新的,不是的话才重新生成
进一步减少制作文件时输入的参数:
在Makefile里添加命令:想要使用的命令 : ;回车缩进;实际调用的命令
使用 make 设定的命令,即可自动调用Makefile里设定好的实际命令
书里添加的命令:
img:生成.img文件;
asm:生成.bin文件;
run:生成.img文件;复制.img文件到qemu;打开QEMU模拟器;
install:生成.img文件;使用imgtol.com 向磁盘写入.img文件;
clean:删除所有中间生成文件
src_only:删除除源文件以外的所有文件
什么都不加:等同于img