调用BIOS中断显示Hello World
2013-12-04 19:48
183 查看
今天又回过头去把第一个显示“Hello,OS world”的程序看了一遍,所谓温故而知新嘛,虽然简单但是也很重要。
参考资料:《一个操作系统的实现》,《Linux内核设计的艺术》(新设计团队著,也推荐一下这本书,写的是关于linux内核讲解的书,写的很好,被翻译成了繁体和英语)
好的,关于下面的代码进行一下解释,虽然比较简,但是写下来,以后想不起来也可以翻出来看。
1.电脑的启动:
电脑加电以后通过硬件逻的办法使得CS:IP=0xF000:0xFFF0,这样CS:IP就指向了内存0xFFFF0,而BIOS程序的入口地址就在0xFFFF0处,这样BIOS程序就被执行了。BIOS程序在内存最开始的位置(0x00000)用1K的内存空间构建了中断向量表,在紧挨着的位置用256字节的内存空间构建了BIOS数据区,并在大约57k以后的位置加载了中断服务程序。
2.,由于我们是软盘启,在BIOS执行完之后,会让cpu接收到一个int0x19中断。cpu收到这个中断后,回去执行这个中断服务,这个终端服务就是启动加载服务程序,将软驱0号磁头对应盘面的0磁道1扇区的内容复制到内存0x07c00处,这也是为什么有org
07c00h这句话了。
3.在这段代码中,由于cs=ds所以指令和数据在一个段里,寻址是按照段:偏移量,所以在内存中的存储应该是这样的:
就是说从0x07c00开始先指令(包括操作数,如mov ax,cs对应的机器码),然后再是数据Message和510-($-$$)个0,再最后是0xaa55,一共512字节。
代码:
org 07c00h
mov ax,cs
mov ds,ax
mov es,ax
call ClearView
call DispStr
jmp $
ClearView:
mov ax,0600h
mov bx,0700h
mov cx,0
mov dx,0184fh
int 10h
ret
DispStr:
mov ax,Message
mov bp,ax
mov cx,15
mov ax,01301h
mov bx,000ch
mov dx,0
int 10h
ret
Message: db "Hello,OS World!"
times 510 - ($ - $$) db 0
dw 0xaa55
下面贴出机器码,在linux下查看机器码的方法是:
1.使用vim -b xxx.bin(后缀可无)
2.会看到乱码,然后在命令模式下输入%!xxd即可
其中b801 13这其实就是mov ax,01301h对应的机器码
0000000: 8cc8 8ed8 8ec0 e806 00e8 1200 e9fd ffb8 ................
0000010: 0006 bb00 07b9 0000 ba4f 18cd 10c3 b832 .........O.....2
0000020: 7c89 c5b9 0f00 b801 13bb 0c00 ba00 00cd |...............
0000030: 10c3 4865 6c6c 6f2c 4f53 2057 6f72 6c64 ..Hello,OS World
0000040: 2100 0000 0000 0000 0000 0000 0000 0000 !...............
0000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000080: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000090: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000100: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000110: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000120: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000130: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000140: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000150: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000180: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000190: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001f0: 0000 0000 0000 0000 0000 0000 0000 55aa ............
参考资料:《一个操作系统的实现》,《Linux内核设计的艺术》(新设计团队著,也推荐一下这本书,写的是关于linux内核讲解的书,写的很好,被翻译成了繁体和英语)
好的,关于下面的代码进行一下解释,虽然比较简,但是写下来,以后想不起来也可以翻出来看。
1.电脑的启动:
电脑加电以后通过硬件逻的办法使得CS:IP=0xF000:0xFFF0,这样CS:IP就指向了内存0xFFFF0,而BIOS程序的入口地址就在0xFFFF0处,这样BIOS程序就被执行了。BIOS程序在内存最开始的位置(0x00000)用1K的内存空间构建了中断向量表,在紧挨着的位置用256字节的内存空间构建了BIOS数据区,并在大约57k以后的位置加载了中断服务程序。
2.,由于我们是软盘启,在BIOS执行完之后,会让cpu接收到一个int0x19中断。cpu收到这个中断后,回去执行这个中断服务,这个终端服务就是启动加载服务程序,将软驱0号磁头对应盘面的0磁道1扇区的内容复制到内存0x07c00处,这也是为什么有org
07c00h这句话了。
3.在这段代码中,由于cs=ds所以指令和数据在一个段里,寻址是按照段:偏移量,所以在内存中的存储应该是这样的:
指令 ... |
数据 |
代码:
org 07c00h
mov ax,cs
mov ds,ax
mov es,ax
call ClearView
call DispStr
jmp $
ClearView:
mov ax,0600h
mov bx,0700h
mov cx,0
mov dx,0184fh
int 10h
ret
DispStr:
mov ax,Message
mov bp,ax
mov cx,15
mov ax,01301h
mov bx,000ch
mov dx,0
int 10h
ret
Message: db "Hello,OS World!"
times 510 - ($ - $$) db 0
dw 0xaa55
下面贴出机器码,在linux下查看机器码的方法是:
1.使用vim -b xxx.bin(后缀可无)
2.会看到乱码,然后在命令模式下输入%!xxd即可
其中b801 13这其实就是mov ax,01301h对应的机器码
0000000: 8cc8 8ed8 8ec0 e806 00e8 1200 e9fd ffb8 ................
0000010: 0006 bb00 07b9 0000 ba4f 18cd 10c3 b832 .........O.....2
0000020: 7c89 c5b9 0f00 b801 13bb 0c00 ba00 00cd |...............
0000030: 10c3 4865 6c6c 6f2c 4f53 2057 6f72 6c64 ..Hello,OS World
0000040: 2100 0000 0000 0000 0000 0000 0000 0000 !...............
0000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000080: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000090: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000100: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000110: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000120: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000130: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000140: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000150: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000180: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000190: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001f0: 0000 0000 0000 0000 0000 0000 0000 55aa ............
相关文章推荐
- os通过调用bios的中断能实现的服务
- 使用BIOS中断和汉字库显示汉字
- BIOS中断调用与DOS功能调用
- 调用 BIOS 视频中断向量(int 10h)输出字符串
- 调用BIOS中断实现重启关机
- DOS系统功能调用与BIOS中断调用
- 利用BIOS中断或DOS中断实现一个显示当前时间的程序
- BIOS中断调用
- 使用BIOS中断显示字符串笔记(int 10h 13号中断)
- bios中断调用查询表
- Linux0.11 系统启动时所调用的BIOS中断
- DOS系统功能调用与BIOS中断调用 [转自KingofCoders]
- 利用BIOS 中断INT 0x10显示字符和字符串
- DOS及BIOS中断调用实验
- DOS及BIOS中断调用实验
- 对调用INT 10H中断显示字符串的优化
- 对调用INT 10H中断显示字符串的优化
- babyos (一)——利用BIOS 中断INT 0x10显示字符和字符串
- IBM-PC汇编语言BIOS和DOS中断调用程序设计
- [Intel汇编-NASM]软中断以及BIOS中断调用