调用BIOS中断显示Hello World

原创 2013年12月04日 19:48:54

今天又回过头去把第一个显示“Hello,OS world”的程序看了一遍,所谓温故而知新嘛,虽然简单但是也很重要。

参考资料:《一个操作系统的实现》,《Linux内核设计的艺术》(新设计团队著,也推荐一下这本书,写的是关于linux内核讲解的书,写的很好,被翻译成了繁体和英语)

好的,关于下面的代码进行一下解释,虽然比较简,但是写下来,以后想不起来也可以翻出来看。

1.电脑的启动:

电脑加电以后通过硬件逻的办法使得CS:IP=0xF000:0xFFF0,这样CSIP就指向了内存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  ............


bios中断调用查询表

中断调用 若要调用中断,可以使用X86汇编语言的 INT指令。 例如,如下的x86汇编语言指令可以使用BIOS的0x10中断向屏幕打印一个字符。 mov ah, 0x0e mov al, ...
  • piaopiaopiaopiaopiao
  • piaopiaopiaopiaopiao
  • 2013年08月03日 21:30
  • 2583

利用BIOS 中断INT 0x10显示字符和字符串

注:以下程序系原创,使用AT&T格式汇编来调用BIOS 0x10中断,如有错误,欢迎指正。表达能力较差,写的不好,但若能帮助一二访客,幸甚。 使用BIOS 显示服务(Video Servic...
  • judyge
  • judyge
  • 2016年08月23日 11:14
  • 1051

BIOS中断调用

BIOS和DOS中断大全DOS中断:1、字符功能调用类(Character-Oriented Function)01H、07H和08H —从标准输入设备输入字符02H —字符输出03H —辅助设备的输...
  • longronglin
  • longronglin
  • 2010年04月21日 21:38
  • 2290

php环境搭建,小白helloworld初试

学php的起因是因为阿里云的云服务器好贵啊。用来搞测试网站有点方。虚拟主机倒是便宜,不过只有html和php环境。 一、本人php小白,有啥不对的,请指正。 1.各种软件环境:前人栽树,所以出...
  • u013100581
  • u013100581
  • 2017年01月04日 17:48
  • 971

使用BIOS中断显示字符串笔记(int 10h 13号中断)

BIOS的10H中断的13号中断用于显示字符串,参数为: 1、AH=13H 2、AL=显示方式       如果AL=0,表示目标字符串仅仅包含字符,属性在BL中包含,不移动光标       如果AL...
  • pdcxs007
  • pdcxs007
  • 2015年02月01日 23:19
  • 6454

如何从零开始搭建一个能够显示HelloWorld的网站

大学毕业后,在工地搬砖,搬砖的同事都说,现在是一个互联网加的时代 ,搬砖行当也应该与时俱进,加入互联网的大军,然后大家开始讨论如果创建一个公司叫滴滴搬砖应该挺赚钱的,毕竟现在房价那么贵,但是我们搬砖的...
  • yequnat
  • yequnat
  • 2017年07月15日 12:11
  • 224

JNI学习--通过Java应用调用C语言的函数打印hello,world

本文主要的内容来源于Java Native Interface: Programmer's Guide and Specification中的第二章的内容,最后附加遇到的问题的解决方案。可通过http...
  • bjutstar
  • bjutstar
  • 2012年03月29日 19:09
  • 1482

【从头学android】第一个程序,点按钮显示Hello World

1.Java文件 /** * */ package com.itest; import android.app.Activity; import android.os.Bundle; imp...
  • lsj19830812
  • lsj19830812
  • 2011年12月27日 14:50
  • 3551

python第一个hello world注意问题!!

如果你第一次写python代码,想写一个通常的hello world ,那么你需要注意这个hello world的写法,这和python的版本有直接关系!!! Python 3.x: prin...
  • sunylat
  • sunylat
  • 2016年12月24日 10:36
  • 1114

从Hello World 程序开始

欢迎来到ncurses 的世界。在我们踏上学习ncurses 的路途之前,让我们先写一个小程序, 来了解一下应用ncurses 库所编写程序的结构。 编译包含NCURSES 库函数的程序 如果要调用n...
  • wenyue043
  • wenyue043
  • 2015年11月11日 10:42
  • 360
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:调用BIOS中断显示Hello World
举报原因:
原因补充:

(最多只允许输入30个字)