实验日期 | 实验项目 |
---|---|
2020.10.10 | 第2天 汇编语言学习和Makefile入门 |
(1).内容概要
(2).关键代码分析
ORG指令:告诉编译器,把这些机器语言指令装载到内存中的哪个地址。
entry部分
MOV AX,0 ; 初始化寄存器
MOV SS,AX ;初始化段寄存器
MOV SP,0x7c00 ;0x7c00表示程序的装载地址
MOV DS,AX ;段寄存器DS,DS是一个默认的段寄存器。MOV CX ,[DS:1234] 等价于 MOV CX ,[1234],[DS:1234]表示DS*16+1234,所以开始DS必须初始化为0。
MOV ES,AX
MOV SI,msg ;将输出信息存放的标号赋值给SI,msg可以看做是一个标号,代表的是一个地址信息
在entry部分中涉及到了常见的寄存器,总结如下
AX——累加寄存器 CX——计数寄存器
DX——数据寄存器 BX——基址寄存器
SP——栈指针寄存器 BP——基址指针寄存器
SI——源变址寄存器 DI——目的变址寄存器
段寄存器
ES——附加段寄存器 CS——代码段寄存器
SS——栈段寄存器 DS——数据段寄存器
FS——没有名称 GS——没有名称
可以存放地址的寄存器:BX,BP,SI,DI
寄存器AX,CX,DX,BX可以分为高8位和低8位表示,以AX为例,AX的高8位表示为AH,低8位表示为AL。
putloop部分
MOV AL,[SI] ;取内存中地址为SI对应的一个字节的信息给AL
ADD SI,1 ; SI加1
CMP AL,0 ;将AL和0进行比较,并设置标志位
JE fin ; 如果AL为0,说明已经全部显示,跳转到fin对应的地址处执行
MOV AH,0x0e ; 显示一个字符
MOV BX,16 ; 指定字符颜色
INT 0x10 ; 中断调用显卡BIOS
JMP putloop ;循环执行
在putloop部分中进行数据传送的格式为MOV 目的操作数,源操作数,其中目的和源操作数的为内存地址时,固定格式为数据大小 [地址],表示从指定内存地址中取出多少字节的数据。
fin部分
HLT ; 使得CPU进入待机状态,等待命令。HLT表示让CPU进入待机状态,当有外部操作时,CPU从待机状态苏醒,继续执行程序。
JMP fin ; 无限循环
msg部分
DB 0x0a, 0x0a ; 换行
DB "hello, world" ;显示信息的内容
DB 0x0a ; 换行
DB 0
RESB 0x7dfe-$ ; 启动装载地址加上启动区大小得到0x7dfe,$表示前面占用的字节数
DB 0x55, 0xaa ;启动盘的结束标志
(1).内容概要
在原有helloos.nas的基础上只保留512个字节的部分,其余部分删除,即DB 0x55 0xaa以后的内容删除,并将文件命名为ipl.nas。
磁盘映像文件的制作步骤
a. 使用笔者的edimg.exe工具将启动区的汇编代码转化为机器代码ipl.bin,并输出ipl.lst列表文件(ipl.lst可以用来确认每个指令是如何翻译成机器指令的)
b. 以机器代码ipl.bin为基础,制作helloos.img。首先读入一个空的磁盘映像文件,将ipl.bin写入这个空的磁盘映像文件的开头,最后生成helloos.img文件。
(2).关键代码分析
..\z_tools\nask.exe ipl.nas ipl.bin ipl.lst
…表示返回上一级目录,在z_tools的文件夹中利用nask.exe工具将ipl.bin文件上生成ipl.bin
..\z_tools\edimg.exe imgin:../z_tools/fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
在z_tools的文件夹中利用edimg.exe工具,读入一个空磁盘映像文件fdimg0at.tek,wbinimg src:ipl.bin len:512 from:0 to:0 表示将大小为512字节的ipl.bin文件的从第0个字节到第0个字节之外的内容写入fdimg0at.tek,最后生成helloos.img。
(1).内容概要
Makefile文件就是其实就是将多个批处理指令合到一起,只结合make.exe使用就可以实现自动的执行程序指令或者是执行某些指令。Makefile文件格式如下:
target:dependency
(tab)command
其中target表示需要生成的目标文件;dependency表示生成目标文件所需要的依赖文件;command表示生成目标文件的编译规则命令行
(2).关键代码分析
..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
返回到上一级z_tools中使用make.exe工具,其中%1 %2 %3 %4 %5 %6 %7 %8 %9表示传入参数的数据,这里传入参数有9个,对应到Makefile文件中就是有9条指令。
ipl.bin: ipl.nas Makefile
../z_tools/nask.exe ipl.nas ipl.bin ipl.lst
helloos.img:ipl.bin Makefile
../z_tools/edimg.exe imgin:../z_tools/fdimg0at.tek \
wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
这部分代码是制作磁盘映像文件的指令。第1行的表示如果ipl.nas和Makefile文件都在,则执行下面的指令生成ipl.bin文件。同理第4行代码表示如果ipl.bin和Makefile文件都在,则执行下面的指令生成helloos.img文件。
#生成映像文件
img:
../z_tools/make.exe -r helloos.img
#生成启动区对于的二进制文件
asm:
../z_tools/nask.exe ipl.nas ipl.bin ipl.lst
install:
../z_tools/imgtol.com w a: helloos.img
#运行程序
run:
../z_tools/make.exe img
copy helloos.img ..\z_tools\qemu\fdimage0.bin
../z_tools/make.exe -C ../z_tools/qemu
#删除文件
clean:
-del ipl.bin
-del ipl.lst
#调用clean指令清除除了源文件之外的所有文件
src_only:
../z_tools/make.exe clean
-del helloos.img
执行make –r hellood.img时,没有任何显示,且cmd终端一致在输出make –r hellood.img。
对照教材修改Makefile和make.bat文件中的内容。修改后,程序不再显示这个错误。
输入make命令时(使用make指令时,没有带参数时,默认执行最前面的指令,这里将make run写在最前面的指令里边了),显示找不到系统文件。
在default里边加上make img,首先生成helloos.img 映像文件,或者在run里边加上…/z_tools/make.exe img生成helloos.img。这个错误的出现也提醒我们,在执行对应指令时,应该看所需的文件是否已经存在,如果不存在,make.exe可以自己根据执行前的指令事前生成吗?如果不能,则需要手动加入生成。
使用Makefile文件简化执行过程,源程序执行需要首先输入make img生成helloos.img,再执行make run运行。现在写一个default在Makefile文件的最前面,其内容包含了make img和make run,这样在执行的时候只需要输入make即可完成执行程序。
default :
make img
make run
make img表示使用make.exe去读取Makefile中img的内容,并执行,这里作用是生成映像文件。make run表示使用make.exe去读取Makefile中run中的内容,并执行,这里的作用是使用qemu软件模拟执行这个程序。
其余代码部分和内容3一致
在生成/删除文件后,在终端使用dir显示当前文件夹的文件,看是否生成/删除成功;使用Makefile文件中的命令用记事本打开汇编代码文件ipl。
default :
make img
make run
dir
start "" "./ipl.txt"
make clear_all_wg
dir
make img和make run与创新点1一致。dir是显示当前文件夹下的所有文件信息, start是打开当前路径下的ipl.txt文件,make clear_all_wg是清空所有除了源代码以外的所有文件。
其余代码部分和内容3一致