您现在的位置是:主页 > news > 网站url改版/正规接单赚佣金的平台

网站url改版/正规接单赚佣金的平台

admin2025/5/21 23:15:45news

简介网站url改版,正规接单赚佣金的平台,天津网站模板建站,wordpress缩略图调用之前的IPL(Intial Program Loader)并没有装载程序,接下来通过之前的IPL装载程序,读入磁盘内容,完成真正的IPL。 ; hello-os; TAB4CYLS EQU 10 ; 相当于c语言中的#define,声明常数,CYLS 10ORG 0…

网站url改版,正规接单赚佣金的平台,天津网站模板建站,wordpress缩略图调用之前的IPL(Intial Program Loader)并没有装载程序,接下来通过之前的IPL装载程序,读入磁盘内容,完成真正的IPL。 ; hello-os; TAB4CYLS EQU 10 ; 相当于c语言中的#define,声明常数,CYLS 10ORG 0…

之前的IPL(Intial Program Loader)并没有装载程序,接下来通过之前的IPL装载程序,读入磁盘内容,完成真正的IPL。

 ; hello-os; TAB=4CYLS    EQU        10      ; 相当于c语言中的#define,声明常数,CYLS = 10ORG        0x7c00          ; 指明程序的装载地址; 以下这段是标准FAT32格式软盘专用的代码JMP       entryDB        0x90DB        "HELLOIPL"       ; freeparam 启动区的名称可以是任意的字符串(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                ; 不使用分区,必须是0DD        2880             ; 重写一次磁盘大小DB        0,0,0x29         ; 意义不明,固定DD        0xffffffff       ; (可能是)卷标号码DB        "HELLO-OS   "    ; freeparam 磁盘的名称(11字节)DB        "FAT12   "       ; 磁盘格式名称(8字节)RESB      18               ; 先空出18字节; 程序核心entry:MOV        AX,0            ; 初始化寄存器MOV        SS,AXMOV        SP,0x7c00       ; 0x7c00到0x7dff为启动区内容的装载地址MOV        DS,AX           ; DS必须指定为0,因为它是默认的段寄存器,地址的值会加上这个值的16倍; 读磁盘,读入第二个扇区 C0-H0-S1(柱面0,磁头0,扇区1的缩写)第一个扇区存储IPLMOV        AX,0x0820      MOV        ES,AX           ; [ES:BX] = ES * 16 + BX 中的数据被加载到0x8200到0x83ff的地方,0x8200到0x81ff为读入启动区后放置的地方MOV        CH,0        ; 柱面0,CH代表柱面号MOV        DH,0        ; 磁头0,DH代表磁头号,0表示正面MOV        CL,2        ; 扇区2,CL代表扇区号readloop:MOV        SI,0            ; 记录失败次数的寄存器;如果装载不成功,重试最多5次retry:MOV        AH,0x02     ; AH=0x02 : 读盘,AH=0x03:写盘MOV        AL,1        ; 1个扇区MOV        BX,0MOV        DL,0x00     ; A驱动器,DL代表驱动器号INT        0x13        ; 调用磁盘BIOSJNC        next        ; 没出错时跳转到next,进位标志为0时跳转ADD        SI,1        ; SI加1  CMP        SI,5        ; 比较SI与5JAE        error       ; SI >= 5时,跳转到 errorMOV        AH,0x00         ; 连同下面两句是系统复位,复位软盘状态MOV        DL,0x00     ; A驱动器INT        0x13        ; 重置驱动器JMP        retry;读到第18扇区next:MOV        AX,ES       ; 把内存地址后移0x200(0x200 = 512)ADD        AX,0x0020       ; ADD    AX, 512 / 16 ,下一个扇区地址MOV        ES,AX       ; 因为没有ADD ES,0x020 指令,所以这里稍微绕个弯,ES指定读入地址ADD        CL,1        ; CL加1,CL是扇区号CMP        CL,18       ; 比较CL与18JBE        readloop        ; 如果CL<=18,跳转至readloop;至此已读完一个柱面,接下来再读入9个柱面(1个柱面18个扇区)MOV        CL,1            ; 扇区号ADD        DH,1            ; 磁头号,1表示反面,C0-H0-S18扇区的下一扇区是磁盘反面的C0-H1-S1CMP        DH,2JB         readloop        ; 如果DH < 2,则跳转到readloopMOV        DH,0ADD        CH,1            ; 柱面号加1CMP        CH,CYLS        JB         readloop        ; 如果CH < CYLS,则跳转到readloop,CYLS为声明的常数,为10; 读完所有数据后,调到0x8200位置,即haribote.sys中的指令MOV        [0x0ff0],CH     ; 将CYLS的值写到内存地址0x0ff0中。JMP        0xc200          ; naskfunc.nas开始执行的地方fin:HLT                        ; 让CPU停止;等待指令JMP        fin             ; 无限循环error:MOV        SI,msgputloop:MOV        AL,[SI]ADD        SI,1            ; 给SI加1CMP        AL,0JE         finMOV        AH,0x0e         ; 显示一个文字MOV        BX,15           ; 指定字符颜色INT        0x10            ; 调用显卡BIOSJMP        putloopmsg: ; 信息显示部分DB        0x0a, 0x0a       ; 换行2次DB        "load, error!"   ; freeparamDB        0x0a             ; 换行DB        0RESB      0x7dfe-$         ; 填写0x00,直到0x001fe,是为了保证第510字节(即第0x1fe字节)开始的地方是55AA,DB        0x55, 0xaa       ;如果启动区最后2字节不是0x55aa,计算机会认为盘上没有需要启动的程序。

现在已经把软盘中的10 * 2 * 18 * 512 = 180KB 装载入内存0x8200到0x34fff的地方了。至此,已完成启动区的制作。
双击!cons_nt.bat,输入make run后,出现如下画面:
这里写图片描述

着手开发操作系统
编写一个OS程序,保存为haribote.nas

;haribote-os
;TAB = 4ORG     0xc200      ;程序要装载的地方MOV     AL,0x13     ;VGA显卡,32x00x8位颜色MOV     AH,0x00     ;设置AH=0x00,调用显卡BIOS函数,就可以切换显示模式了,AL中设置模式INT     0x10        fin:HLT                  ; 使CPU基本处于睡眠状态JMP fin

用nask编译,输出成二进制文件haribote.sys:
双击!cons_nt.bat,输入:..\z_tools\nask.exe haribote.nas haribote.sys
接下来将这个文件保存到磁盘映像hribote.img中。
Makefile中的内容更新:

TOOLPATH = ../z_tools/
MAKE     = $(TOOLPATH)make.exe -r
NASK     = $(TOOLPATH)nask.exe
EDIMG    = $(TOOLPATH)edimg.exe
IMGTOL   = $(TOOLPATH)imgtol.com
COPY     = copy
DEL      = deldefault :$(MAKE) img#制作文件ipl.binipl.bin : ipl.nas Makefile #要制作文件ipl.bin,需先检查ipl.nas和Makefile这两个文件是否准备好$(NASK) ipl.nas ipl.bin ipl.lstharibote.sys : haribote.nas Makefile$(NASK) haribote.nas haribote.sys haribote.lstharibote.img : ipl.bin haribote.sys Makefile$(EDIMG)   imgin:../z_tools/fdimg0at.tek \wbinimg src:ipl.bin len:512 from:0 to:0 \copy from:haribote.sys to:@: \imgout:haribote.img
#生成 helloos.imgimg :$(MAKE) haribote.imgrun :$(MAKE) img$(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin$(MAKE) -C ../z_tools/qemuinstall :$(MAKE) img$(IMGTOL) w a: haribote.img#删除最终成果以外的所有中间生成文件,将硬盘清理干净clean :-$(DEL) ipl.bin-$(DEL) ipl.lst-$(DEL) haribote.sys-$(DEL) haribote.lst-del ipl.lst#把源程序以外的文件全部删干净src_only :$(MAKE) clean-$(DEL) haribote.img

双击!cons_nt.bat,输入make img后,生成haribote.img,此时hanbote.sys已经写入hairbote.img中
说明:
文件名写在0x002600以后的地方
文件的内容写在0x004200以后的地方

从启动区执行操作系统

目的:执行磁盘映像上位于0x4200号地址的程序。
现况:从启动区开始,磁盘上的内容转载到了内存0x8000号地址。
结果:0x4200处的内容位于内存0x8000+0x4200=0xc200处
操作:haribote.nas中加入ORG 0xc200
ipl.nas中处理的最后加JMP 0xc200

输入make run后的画面:
这里写图片描述

32位模式前期准备
修改harbote.nas

;haribote-os
;TAB = 4; 有关BOOT_INFO
CYLS    EQU 0x0ff0      ;设定启动区
LEDS    EQU 0x0ff1
VMODE   EQU 0x0ff2      ;有关颜色数目的信息
SCRNX   EQU 0x0ff4      ;分辨率的x
SCRNY   EQU 0x0ff6      ;分辨率的y
VRAM    EQU 0x0ff8      ;图像缓冲区的开始地址,VRAM指显卡内存ORG     0xc200      ;程序要装载的地方MOV     AL,0x13     ;VGA显卡,32x00x8位颜色MOV     AH,0x00     ;设置AH=0x00,调用显卡BIOS函数,就可以切换显示模式了,AL中设置模式INT     0x10        MOV     BYTE [VMODE],8    ; 记录画面模式MOV     WORD [SCRNX],320MOV     WORD [SCRNY],200MOV     DWORD [VRAM],0x000a0000 ;这种画面模式下"VRAM是0xa0000到0xaffff的64KB; 用BIOS取得键盘上各种LED指示灯的状态MOV     AH,0x02INT     0x16            ; keyboard BIOSMOV     [LEDS],AL
fin:HLTJMP fin

开始导入C语言
haribote.nas改成了asmhead.nas,为调用C语言,添加了100行左右的汇编代码。它的功能是承接IPL程序,调用bootpack.c中的主函数。这部分后面再讲。

最重要的OS核心部分为C语言程序bootpack.c,从现在开始,将越来越多的采用C语言编写OS。
bootpack.c :

//告诉C编译器,有一个函数在别的文件里void io_hlt(void);  //是函数声明,意思是函数在别的文件中,自己找一下吧void HariMain(void) //程序从此处开始运行,函数名不能改
{fin:io_hlt();       //执行naskfunc.nas里的_io_hltgoto fin;
}

接下来用汇编写一个函数naskfunc.nas,因为C语言无法实现HLT,所以需要写成汇编语言,供C语言函数调用:

; naskfunc
; TAB=4[FORMAT "WCOFF"]              ; 制作目标文件的模式,因为该函数之后要与bootpack.obj链接,所以也需要编译成目标文件。[BITS 32]                     ; 制作32位模式用的机器语言; 制作目标文件的信息[FILE "naskfunc.nas"]          ; 源文件名信息GLOBAL    _io_hlt      ; 程序中包含的函数名,必须在函数前加"_",否则不能很好地与C语言函数链接;需要链接的函数名,都需要用GLOBAL声明; 以下是实际的函数[SECTION .text]                ; 目标文件中写了这些后再写程序_io_hlt:                      ; 先写一个用GLOBAL声明的函数名相同的编号,表示函数void io_hlt(void)HLT                   ; 使CPU基本处于睡眠状态    RET                   ; 相当于return

Makefile中的内容也变化了,将ipl.nas、asmhead.nas、bootpack.c、naskfunc.nas组合成为一个OS程序。

TOOLPATH = ../z_tools/
INCPATH  = ../z_tools/haribote/MAKE     = $(TOOLPATH)make.exe -r
NASK     = $(TOOLPATH)nask.exe
CC1      = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quiet 
GAS2NASK = $(TOOLPATH)gas2nask.exe -a
OBJ2BIM  = $(TOOLPATH)obj2bim.exe
BIM2HRB  = $(TOOLPATH)bim2hrb.exe
RULEFILE = $(TOOLPATH)haribote/haribote.rul
EDIMG    = $(TOOLPATH)edimg.exe
IMGTOL   = $(TOOLPATH)imgtol.com
COPY     = copy
DEL      = deldefault :$(MAKE) img# 启动区ipl.bin : ipl.nas Makefile$(NASK) ipl.nas ipl.bin ipl.lstasmhead.bin : asmhead.nas Makefile$(NASK) asmhead.nas asmhead.bin asmhead.lstbootpack.gas : bootpack.c Makefile$(CC1) -o bootpack.gas bootpack.cbootpack.nas : bootpack.gas Makefile$(GAS2NASK) bootpack.gas bootpack.nasbootpack.obj : bootpack.nas Makefile$(NASK) bootpack.nas bootpack.obj bootpack.lstnaskfunc.obj : naskfunc.nas Makefile$(NASK) naskfunc.nas naskfunc.obj naskfunc.lstbootpack.bim : bootpack.obj naskfunc.obj Makefile$(OBJ2BIM) @$(RULEFILE) out:bootpack.bim stack:3136k map:bootpack.map \bootpack.obj naskfunc.obj
# 3MB+64KB=3136KBbootpack.hrb : bootpack.bim Makefile$(BIM2HRB) bootpack.bim bootpack.hrb 0haribote.sys : asmhead.bin bootpack.hrb Makefilecopy /B asmhead.bin+bootpack.hrb haribote.sysharibote.img : ipl.bin haribote.sys Makefile$(EDIMG)   imgin:../z_tools/fdimg0at.tek \wbinimg src:ipl.bin len:512 from:0 to:0 \copy from:haribote.sys to:@: \imgout:haribote.img#生成 helloos.imgimg :$(MAKE) haribote.imgrun :$(MAKE) img$(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin$(MAKE) -C ../z_tools/qemuinstall :$(MAKE) img$(IMGTOL) w a: haribote.img#删除最终成果以外的所有中间生成文件,将硬盘清理干净clean :-$(DEL) *.bin-$(DEL) *.lst-$(DEL) *.gas-$(DEL) *.obj-$(DEL) bootpack.nas-$(DEL) bootpack.map-$(DEL) bootpack.bim-$(DEL) bootpack.hrb-$(DEL) haribote.sys#把源程序以外的文件全部删干净src_only :$(MAKE) clean-$(DEL) haribote.img

bootpack.c变成机器语言的过程:
使用cc1.exe从bootpack.c生成gas汇编语言bootpack.gas
使用gas2nask,将gas汇编语言bootpack.gas变成nask能翻译的汇编语言bootpack.nas
使用nask.exe将bootpack.nas生成目标文件bootpack.obj(机器语言)
使用obj2bim.exe将bootpack.obj生成二进制映像文件bootpack.bim,这一步是因为C语言不能编写所有的程序,有一部分用汇编来写,然后链接到C语言程序上
使用bim2hrb.exe将bootpack.obj生成bootpack.hrb,这是因为映像文件只是将各部分全都链接在一起,做成了完整的机器语言文件,为了实际使用,还需要加工,如加上识别的文件头,或者压缩等。

使用make run命令后,结果没有变化
这里写图片描述