Day_02 汇编语言学习与Makefile入门

发布于 2021-03-31  84 次阅读


文本编辑器的选择

选择使用Notepad++
下载地址: Notepad++
(之后了解了一下背景,这个软件作者是个台独!!!所以我们应该抵制这样的软件)
(在这里我给大家推荐VSCode或者轻量级的VIM)

继续开发

;helloos3
; hello-os
; TAB=4

        ORG     0x7c00          ; 指明程序的装在地址

; 以下的记述用于标记FAT12格式的软盘

        JMP     entry
        DB      0x90
        DB      "HELLOIPL"         ; 启动区的名称可以是任意是字符串(8字节)
        DW      512              ; 每个扇区(sector)的大小(必须为512字节)
        DB      1                ; 簇(cluster)的大小(必须为1个扇区)
        DW      1                ; FAT的起试位置(一般从第一个扇区开始)
        DB      2                  ; FAT的个数(必须为2)
        DW      224             ; 根目录的大小(一般设置成224项)
        DW      2880             ; 该磁盘的大小(必须是2880扇区)
        DB      0xf0             ; 磁盘的种类(必须是0xf0)
        DW      9                ; FAT的长度(必须是9扇区)
        DW      18               ; 1个磁道(track)有几个扇区(必须是18)
        DW      2                ; 磁头数(必须是2)
        DD      0                ; 不使用分区,必须是0
        DD      2880            ; 重写一次磁盘的大小
        DB      0,0,0x29        ; 固定
        DD      0xffffffff       ; (可能是)卷标号码
        DB      "HELLO-OS   " ; 磁盘的名称(11字节)
        DB      "FAT12   "         ; 磁盘格式化名称(8字节)
        RESB    18               ; 空出18字节

; 程序主体核心

entry:
        MOV     AX,0            ;初始化寄存器
        MOV     SS,AX
        MOV     SP,0x7c00
        MOV     DS,AX
        MOV     ES,AX

        MOV     SI,msg
putloop:
        MOV     AL,[SI]
        ADD     SI,1            ; 给SI加1
        CMP     AL,0
        JE      fin
        MOV     AH,0x0e         ; 显示一个文字
        MOV     BX,15           ; 指定字符颜色
        INT     0x10            ; 调用显卡BIOS
        JMP     putloop
fin:
        HLT                     ; 让CPU停止;等待指令
        JMP     fin             ; 无限循环

msg:
        DB      0x0a, 0x0a      ; 换行2次
        DB      "hello, world"
        DB      0x0a            ; 换行
        DB      0

        RESB    0x7dfe-$        ; 填写0x00,直到0x001fe

        DB      0x55, 0xaa

; 以下是启动区以外部分的输出

        DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB    4600
        DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB    1469432

ORG指令:告诉nask,在开始执行的时候,把这些机器语言指令装载到内存中的哪个地址。($)含义:不再是输出文件的第几个字节,而是代表将要读入的内存地址。
file
JMP指令,相当于C语言中的goto语句。
‘entry:’这是标签的声明,用于指定JMP指令跳转的目的地等。

AX---累加寄存器
CX---计数寄存器
DX---数据寄存器
BX---基质寄存器
SP---栈指针寄存器
BP---基质指针寄存器
SI---源变址寄存器
DI---目的变址寄存器

file

file

file

在汇编语言中,所有标号都仅仅是单纯的数字。每个标号对应的数字,是由汇编语言编译器根据ORG指令计算出来的。
CPU访问内存的速度比访问寄存器慢很多倍。
file

MOV BYTE[678],123
这个指令是要用内存678号地址来保存123这个数值。这里的678,不过是一大串(ON)或者(OFF)的电信号。当内存受到这一串信号时,电路中的某8个存储单元就会响应,这8个存储单元会记住代表‘123’的开或关的电信号。
file
file
file
想把DX内存里的内容赋给AL

MOV BX,DX
MOV AL,BYTE[BX]

file
把SI地址的1个字节的内容读入AL中

ADD是加法指令。ADD SI,1 ;SI=SI+1
CMP是比较指令。它相当于C语言中的if语句,

if(a==3)
{
    处理;
}

即对a和3进行比较,CMP a,3告诉CPU比较对象,然后下一步写“如果二者相等,需要做什么”
JE是条件跳转指令之一。‘比较结果相等,则跳转到指定的地址;不等,则不跳转’

CMP AL,0
JE fin

相当于

if(AL == 0)
{
    goto fin;
}

INT是软终端指令。BIOS(basic input output system)出厂时装在电脑主板的ROM单元里。
file
file

HLT,halt(停止)让CPU停止动作的指令,不是彻底的停止,而是让CPU进入待机状态。如果没有HLT指令,CPU就会不停的空转,负荷100%,费电。

//  用c语言改写后的helloos.nas程序节选
entry:
    AX = 0;
    SS = AX;
    SP = Ox7c00;
    DS = AX;
    ES = AX;
    SI = msg;
putloop:
    AL = BYTE[SI];
    SI = SI + 1;
    if(AL == 0)
    {
    goto fin;
    }
    AH = 0x0e;
    BX = 15;
    INT 0x10;
    goto putloop;
fin:
    HLT;
    goto fin;

就是因为这个程序,我门才能够把msg里写的数据,一个字符一个字符的显示出来,并且数据变成0后,HLT指令就会让程序进入无限循环。'hello world'就是这样显示出来的。

0x00007c00-0x00007dff ;启动区内容的装载地址

制作启动区

不要用nask来做整个磁盘映像,先用它来制作512字节的启动区,剩下的部分用磁盘影响管理工具来做。
file

Makefile入门

Makefile就像一个非常聪明的批处理文件。

  1. 先创建一个不带扩展名的文件Makefile,然后用文本编辑器输入以下内容
# 文件生成规则

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

表示注释。ipl.bin : ipl.nas Makefile的意思是,如果想要制作ipl.bin,就先检查ipl.nas 和Makefile两个文件是否都准备好了。如果两个文件都有了,Make工具就会自动执行Makefile的下一行

file
file
当编辑ipl.nas中的输出信息,更改输出并保存,再次执行make -r helloos.img发现它重新生成输出文件,也就是,make.exe不仅仅判断输入文件是否存在。还会判断文件的更新日期。并根据这个来决定是否需要重新生成输出文件。
再Makefile里面增加

img :
    ../z_tools/make.exe -r helloos.img

修改以后我门只需要输入make img就能达到和make -r helloos.img一样的效果。makeing.bat就没用了
加入以下内容:

asm :
    ../z_tools/make.exe -r ipl.bin

img :
    ../z_tools/make.exe -r helloos.img

run :
    ../z_tools/make.exe img
    copy helloos.img ..\z_tools\qemu\fdimage0.bin
    ../z_tools/make.exe -C ../z_tools/qemu

install :
    ../z_tools/make.exe img
    ../z_tools/imgtol.com w a: helloos.img

这样'run.bat'等其他都用不到了。输入“make run”它首先会执行make img 然后再启动模拟器。
“make clean”删除最终成果(helloos.img)以外的所有中间生成文件,把硬盘整理干净。
“make scr_only”可以把程序源程序以外的文件全部删除干净。
make命令的默认动作,当执行不带参数的make时,就相当于执行“make img”命令

default :
    ../z_tools/make.exe img

make.exe是GUN项目组的人开发的。
file


擦肩而过的概率