提交 5b43033b 创建 作者: 赵鹏翀's avatar 赵鹏翀

init template

上级
/*.img
/bochs/bios.bin-1.7.5
/bochs/bochs.exe
/bochs/bochsdbg.exe
/bochs/VGABIOS-lgpl-latest
/Debug
/Release
bochsout.txt
*.bak
\ No newline at end of file
memory: guest=32, host=32
romimage: file=Bochs/bios.bin-1.7.5 # http://www.seabios.org/SeaBIOS
vgaromimage: file=Bochs/VGABIOS-lgpl-latest
clock: sync=realtime, time0=local
pci: enabled=1, chipset=i440fx, slot1=pcivga
private_colormap: enabled=0
boot: disk
floppy_bootsig_check: disabled=0
log: bochsout.txt
panic: action=ask
error: action=report
info: action=report
debug: action=ignore
debugger_log: -
parport1: enabled=1, file="parport.out"
speaker: enabled=1, mode=sound
e1000: enabled=1, mac=52:54:00:12:34:56, ethmod=slirp, script=slirp.conf
usb_uhci: enabled=1, port1=disk:USBstick.img
<?xml version="1.0" encoding="gb2312"?>
<ASMProject Version="1.00" Name="PC006" ProjectType="pcproject" ProjectTemplateID="6e19cd19-4258-45ef-ac3f-b4a0371532f4" TemplatePath="PC006\Project" IncrementalUpload="-1" ProjectID="b40e5f4c-861b-4b8d-af83-0ce5baf6172c" IsSubmitWork="0">
<Configurations>
<Configuration Name="Debug" ConfigurationType="2" DebuggerFlavor="2">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool"/>
<Tool Name="JWASMAssemblerTool" ObjectFile="$(IntDir)\$(InputName).bin" ObjectFormate="0" ListFile="$(InputName).lst" GenerateDebugInformation="-1" VersionDebugInfo="-1" AdditionalOptions="/W0"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool"/>
<Tool Name="JWlinkLinkerTool" AdditionalOptions="disable 1014"/>
<Tool Name="PostBuildEventTool" CommandLine="echo U̾ļ...&#xA;mkimage.exe &quot;$(IntDir)\boot.bin&quot; &quot;$(IntDir)\loader.bin&quot; &quot;USBstick.img&quot;&#xA;"/>
</Configuration>
</Configurations>
<Files>
<Filter Name="Bochs">
<File RelativePath=".\Bochs\bios.bin-1.7.5" NoUpload="-1">
</File>
<File RelativePath=".\Bochs\bochs.exe" NoUpload="-1">
</File>
<File RelativePath=".\Bochs\bochsdbg.exe" NoUpload="-1">
</File>
<File RelativePath=".\Bochs\bochsrc.bxrc" NoUpload="-1">
</File>
<File RelativePath=".\Bochs\VGABIOS-lgpl-latest" NoUpload="-1">
</File>
</Filter>
<File RelativePath=".\bochsout.txt" NoUpload="-1">
</File>
<File RelativePath=".\boot.asm">
</File>
<File RelativePath=".\loader.asm">
</File>
<File RelativePath=".\USBstick.img">
</File>
</Files>
</ASMProject>
添加文件
LOADER_BASE equ 1000h
codeseg segment
org 7c00h ;告诉编译器程序加载到7c00处
start:
mov ax, 0 ;读取0面0道2扇区的内容到0:1000(即loader的内容)
mov es, ax
mov bx, LOADER_BASE
mov al, 4 ;读取的扇区数(拟定loader占用4个扇区)
mov ch, 0 ;磁道
mov cl, 2 ;扇区号(读第二个扇区)
mov dl, 80h ;硬盘从80h开始
mov dh, 0 ;0面
mov ah, 2 ;读扇区操作
int 13h
mov bx, 0b800h ;清屏
mov es, bx
mov bx, 0
mov cx, 25*80
clear:
mov word ptr es:[bx], 20h ;空格
mov word ptr es:[bx+1], 7h ;字符属性
add bx, 2
loop clear
mov ax, LOADER_BASE ;程序跳转到0:1000h处执行loader.bin
jmp ax
db 446- ($-start) dup (0) ;前446字节的内容不满时,用0填充
;硬盘分区表(共64字节,每16字节为一项,每项表示一个分区,共4项)
;每项中第一个字节表示引导指示符,80h表示活动分区,00h表示无效分区
db 80h
;第二、三、四个字节在这里没有用到。
db 00h, 00h, 00h
;第五个字节定义分区类型。01h表示未定义的分区类型。
db 01h
;第六、七、八个字节在这里没有用到。
db 00h, 00h, 00h
;第九到第十二字节表示逻辑起始扇区号(相对于逻辑0扇区的扇区数)。一个扇区大小为 512 字节。
dd 00010000h ;第一个分区前有 32MB 空白区域
;第十三到第十六字节表示该分区所占用的扇区数(总扇区数)
dd 00010000h ;第一个分区共 32MB 大小
;其余三项全部为0,表示没有其他分区。
db 16 dup (0)
db 16 dup (0)
db 16 dup (0)
dw 0aa55h ;可引导标志,2字节。这样446+64+2=512字节,恰好等于引导扇区的字节数。
codeseg ends
end
codeseg segment
org 1000h ;告诉编译器程序加载到1000处
jmp start ;程序的功能是使用8253的定时计数功能,统计使用串传送指令传递数据所消耗的时间
time dw 0 ;用于保存计数值
start:
mov ax, cs ;全部置0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 7c00h ;初始化栈
;*********************设置8253的计数器0**********************************
cli ;关中断
;设定计数器0为工作方式3,采用二进制计数,以低高字节的顺序输入计数值
;ax写中入初值1193
;写入低字节计数值。1.19318MHz/1193=1000hz,所以时间间隔是1ms
;写入高字节计数值
;*********************安装新的int 08h中断向量****************************
;因为计数器0的输出端out0连接了IRQ0,且IRQ0的中断类型号是08h
;所以改写新的中断向量
mov word ptr es:[8h * 4], new08 ;安装新的int 08h中断例程
mov word ptr es:[8h * 4 + 2], 0
sti ;开中断
;*********************向内存中写入数据供向显存传输所用*******************
mov ax, 6fffh
mov ds, ax
mov bx, 0
mov al, 30h
mov cx, 4bh ;从0开始循环至小写的z,共75个字符
s1:
mov [bx], al
mov [bx+1], 02h
inc bl
inc bl
inc al
loop s1
;*********************使用串传送指令传输数据*****************************
mov time, 0 ;计数器置0
mov cx, 0ffffh
string:
mov si, 0 ;从ds:si处向显存中发送数据
mov di, 0 ;初始目的地址为es:di=b800:0000
mov ax, 0b800h
mov es, ax
mov ax, cx ;将外层循环的cx值保存在ax中
mov cx, 96h ;因为两个字节分别保存一个字符的ASCII码值和属性,所以75个字符需要150(96h)个字节
cld
rep movsb
mov cx, ax ;恢复外层循环值
loop string
;*********************显示使用串传送之后的计数***************************
mov ax, time ;将time中的计数值给ax当做被除数
mov si, 0
call dtoc ;将word型数据转换成十进制数的以0结尾的字符串,保存在ds:si
mov dh, 6 ;设置行列号
mov dl, 38
mov cl,000ch
call show_str ;将ds:si处字符串显示
mov ax, stringmessage ;显示字符串
mov bp, ax ;es:bp串地址
mov ax, 0
mov es, ax
mov cx, 36 ;串长度
mov ax, 1301h ;ah = 13 ,al = 01
mov bx, 000ch ;页号bh = 0,黑底红字bl = 0ch 高亮
mov dh, 5h ;设置行列号
mov dl, 1h
int 10h ;10h号中断
;*********************程序结束*******************************************
over: ;让程序在这里死循环
jmp over
;*********************用到的子程序***************************************
dtoc: ;将word型数据转换成十进制数的以0结尾的字符串,保存在ds:si
push dx
push cx
push ax
push si
push bx
mov bx,0
s8:
mov cx,10d
mov dx,0
div cx
mov cx,ax
jcxz s2
add dx,30h
push dx
inc bx
jmp short s8
s2:
add dx,30h
push dx
inc bx ;再进行一次栈操作(补充当"商为零而余数不为零"时的情况)
mov cx,bx
mov si,0
s3:
pop ax
mov [si],al
inc si
loop s3
okay:
pop bx
pop si
pop ax
pop cx
pop dx
ret ;数值转换的子程序定义结束
show_str: ;显示字符串的子程序
push bx
push cx
push si
mov al,0a0h
dec dh
mul dh
mov bx,ax
mov al,2
mul dl
sub ax,2
add bx,ax
mov ax,0b800h
mov es,ax
mov di,0
mov al,cl
mov cx, 3 ;控制只显示3个字符,即计数
s:
mov ah,ds:[si]
mov es:[bx+di],ah
mov es:[bx+di+1],al
inc si
add di,2
loop s
pop si
pop cx
pop bx
ret
;************************************************************************
;*********************新的int 08h****************************************
new08:
cli ;关中断,防止程序执行时外部产生的中断造成影响
;计数器time的值+1。注意使用push、pop指令来保护用到的寄存器
;服务程序返回前发送EOI命令,告诉8259A中断结束,因为IRQ0属于主片的端口,所以需要向主片发送EOI命令
;写入主片EOI命令。必须发送EOI命令,否则计数会一直循环下去
iret
;************************************************************************
stringmessage:
db "The command of stringtransfer spend:"
codeseg ends
end
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论