zoukankan      html  css  js  c++  java
  • 第二天 汇编语言和启动区

    基于第一天的基础上,将机器语言转成汇编语言

    简单总结了下汇编的指令和寄存器:

    指令(大小写均可)
    ;注释
    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

  • 相关阅读:
    Spinal Tap Case
    Sorted Union
    Search and Replace
    Boo who
    Missing letters
    DNA Pairing
    Pig Latin
    Where art thou
    Roman Numeral Converter
    Redis高级客户端Lettuce详解
  • 原文地址:https://www.cnblogs.com/timeTraveler/p/9903970.html
Copyright © 2011-2022 走看看