`
lobin
  • 浏览: 385424 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Windows下编写主引导程序到系统内核

 
阅读更多

Windows下编写主引导程序到系统内核

 

Windows下编写主引导程序、系统内核程序都比在linux平台下麻烦得多。这里给一个例子:

 

	K_CODE_SEG = 3000h
	K_CODE_OFFSET =	0000h

_text segment
	org	7c00h
_start:	
	; es, user data segment
	mov	dx, K_CODE_SEG
	mov	es, dx


	mov	ah, 02h	

	;mov	dl, 81h	; drive 0 驱动器 00H~7FH:软盘;80H~0FFH:硬盘 
	mov	dl, 00h
	;mov	dl, 0
	mov	dh, 0	; head 0 磁头
	mov	ch, 0	; track 柱面
	mov	cl, 2	; sector 扇区,读取第2个扇区

	mov	al, 10	; 指定要读取的扇区数
	mov	bx, 0	; 将指定扇区读到es:bx位置
	int	13h

	jnc	read_sector_ok
	

read_sector_error:
	mov	si, m_read_sector_error
p1:
	mov	al, [si]
	add	si, 1
	cmp	al, 00h
	je	endl
	mov	ah, 0eh
	mov	bx, 0fh
	int	10h
	jmp	p1

read_sector_ok:
	mov	si, m_read_sector_ok
p0:
	mov	al, [si]
	add	si, 1
	cmp	al, 00h
	je	jmp_to
	mov	ah, 0eh
	mov	bx, 0fh
	int	10h
	jmp	p0


jmp_to:
	mov	bx, 8
	mov	ax, es:[bx]
	mov	dx, 16
	mul	dx
	mov	cl, 4
	shr	ax, cl
	add	ax, word ptr offset_segment_jmp_to + 2
	mov	word ptr offset_segment_jmp_to + 2, ax

	; jmp	3000h:0h
	;db	0eah		; jmp far
	;dw	K_CODE_OFFSET	; offset
	;dw	K_CODE_SEG	; segment: K_CODE_SEG = 3000h


	; jmp	3000h:0h
	;db	0eah			; jmp far
	;dw	K_CODE_OFFSET, K_CODE_SEG	; offset, segment. segment: K_CODE_SEG = 3000h


	; jmp	3000h:0h
offset_segment_jmp_to:	
	dw	K_CODE_OFFSET, K_CODE_SEG

	mov	ax, cs
	cmp	ax, K_CODE_SEG
	jz	_1
	jmp	dword ptr offset_segment_jmp_to
_1:
	jmp	dword ptr offset_segment_jmp_to - 7c00h
	
endl:
	hlt
	jmp endl

m_read_sector_ok:
	db	0ah, 0ah
	db	"[ook] read sector", 0dh, 0ah
	db	0ah, 0ah
	db	00h

m_read_sector_error:
	db	0ah, 0ah
	db	"[err] read sector", 0dh, 0ah
	db	0ah, 0ah
	db	00h

	; MBR扇区位于整个硬盘的第一个扇区.
	; 硬盘扇区为512字节,所以主引导程序大小仅能也只能512字节。
	db	510-($-seg _start) dup(0)
	; MBR结束标志
	db	85, 170	; 0x55, 0xaa
_text ends
	end	_start

 

	.MODEL SMALL, C

	extrn test_09h:near

_DATA SEGMENT
	MESSAGE1 DB '[1] HELLO, INT 21H->09H!', 0DH, 0AH, '$'
_DATA ENDS

_TEXT SEGMENT
	ASSUME CS:_TEXT, DS:_DATA
	;ORG 1000H
MAIN PROC NEAR
_START:
	; DS = DS + CS
	MOV AX, _DATA
	MOV DX, CS
	ADD AX, DX
	MOV DS, AX

	MOV SI, OFFSET MESSAGE1
	
PRINT_MESSAGE:	
	MOV AL, [SI]
	CMP AL, '$'
	JE  ENDL

	MOV AH, 0EH
	MOV BX, 0FH
	INT 10H

	INC SI
	JMP PRINT_MESSAGE

	;MOV DX, OFFSET MESSAGE1	; 字符串首偏移地址放到DX中
	;MOV AH, 9
	;INT 21H			; 输出字符串

ENDL:
	CALL test_09h
	
;EXIT:
;	MOV AH, 4CH
;	INT 21H

EXIT:
	HLT
	JMP EXIT
MAIN ENDP
_TEXT ENDS
	END MAIN

 

char message[] = "Hello, MASM!\r\n$";

void test_09h() 
{
  _asm mov si, offset message;

loop: 
  _asm mov al, [si];
  _asm cmp al, '$';
  _asm je ret;

  _asm mov ah, 0eh;
  _asm mov bx, 0fh;
  _asm int 10h;

  _asm inc si;
  _asm jmp loop;
ret:

}

 

1
0
分享到:
评论

相关推荐

    用Rust编写的Windows内核模式驱动程序_Rust_下载

    用 Rust 编写的 Windows 内核模式驱动程序\n这个库只是 windows 内核模式驱动程序的概念验证,可以用 Rust 编程语言编写。\n它包含Windows Driver Kit的类型、常量和绑定 ,目标操作系统从 Windows XP (x86x64) 开始...

    windows环境下32位汇编语言程序设计

    对于DOS的汇编程序员来说,就像在一夜之间,我们发现自己曾经学过的几乎所有的东西都被Windows封装到内核中去了,由于保护模式的存在,我们又无法像在DOS下那样闯入系统内核为所欲为。在Windows下用任何语言编程都...

    windows驱动开发技术详解-part2

     驱动程序被操作系统加载在内核模式下,它与Windows操作系统内核的其他组件进行密切交互。本章主 要介绍Windows操作系统内核的基本概念,同时还介绍应用程序和驱动程序之间的通信方法。  2.1 Windows操作系统概述...

    Windows驱动开发技术详解

    非常容易上手,用实例详细讲解PCI、USB、虚拟串口、虚拟摄像头、SDIO等驱动程序的开发,归纳了多种调试驱动程序的高级技巧,如用WinDBG和VMWARE软件对驱动进行源码级调试,深入Windows操作系统的底层和内核,透析...

    自己动手写操作系统(含源代码).part2

    上篇基本上是第一版的修订,只是做了一个调整,那便是在兼顾 Windows和Linux两方面用户的基础上,默认在Linux下建立开发环境来编写我们的操作系统。至于这样做的原因,在本书第 2章有比较详细的说明。当然,开发环境...

    chocolate_milk:纯Rust x86_64引导程序和内核

    这是一个几乎完全用Rust编写的引导程序和内核,完全没有第三方依赖性。此代码库中的所有内容都是您明智的代码所需要的。 建筑 要求 要构建它,您需要Rust, nasm和lld-link (来自LLVM的链接器)。无论构建系统如何...

    Windows驱动开发技术详解的光盘-part1

     驱动程序被操作系统加载在内核模式下,它与Windows操作系统内核的其他组件进行密切交互。本章主要介绍Windows操作系统内核的基本概念,同时还介绍应用程序和驱动程序之间的通信方法。  2.1 Windows操作系统概述 ...

    linux安装与配置简明手册

    本书详细介绍如何在个人电脑上安装配置Caldera和Red Hat两种发行版本的Linux操作系统,并能帮助用户解决安装和配置过程中出现的各种问题。本书既能指导你进行基本的安装步骤,也能指导你定制独具特色的Linux 操作...

    LINUX安装与配置简明手册

    本书详细介绍如何在个人电脑上安装配置Caldera和Red Hat两种发行版本的Linux操作系统,并能帮助用户解决安装和配置过程中出现的各种问题。本书既能指导你进行基本的安装步骤,也能指导你定制独具特色的Linux 操作...

    《操作系统真象还原》高清完整版,baidu云

    第2章 编写MBR主引导记录,让我们开始 掌权 52 2.1 计算机的启动过程 52 2.2 软件接力第一棒,BIOS 52 2.2.1 实模式下的1MB内存布局 52 2.2.2 BIOS是如何苏醒的 54 2.2.3 为什么是0x7c00 56 2.3 让MBR先飞一会儿 58 ...

    自己动手写操作系统(含源代码).part1

    上篇基本上是第一版的修订,只是做了一个调整,那便是在兼顾 Windows和Linux两方面用户的基础上,默认在Linux下建立开发环境来编写我们的操作系统。至于这样做的原因,在本书第 2章有比较详细的说明。当然,开发环境...

    android系统原理及开发要点详解

     第4章“Android的底层库和程序”,介绍Android系统的基础程序,以本地程序为主。  第5章“Android的Java虚拟机和Java环境”,这是介于本地和Java层之间的相关内容,主要介绍Android的Java虚拟机Dalvik的基本概念...

    LINUX操作系统(电子教案,参考答案)

    本章主要介绍电子邮件系统、Linux下的电子邮件系统,以及建立Linux下的邮件服务器。 第16章:DNS服务器。本章主要介绍DNS工作的原理、Linux下的域名服务器系统以及BIND的安装与配置等内容。详细叙述了主DNS服务器和...

    自己动手写操作系统

    本书在详细分析操作系统原理的基础上,用丰富的实例代码,一步一步地指导读者用C语言和汇编语言编写出一个具备操作系统基本功能的操作系统框架。本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。...

    自己动手写操作系统 pdf

    自己动手写操作系统在详细分析操作系统原理的基础上,用丰富的实例代码,一步一步地指导读者用C语言和汇编语言编写出一个具备操作系统基本功能的操作系统框架。本书不同于其他的理论型书籍,而是提供给读者一个动手...

    自己动手写操作系统 电子工业出版社 pdf

    第1章 马上动手写一个最小的“操作系统”1 1.1 准备工作1 1.2 10分钟完成的操作系统1 1.3 Boot Sector3 1.4 代码解释3 1.5 水面下的冰山5 1.6 回顾6 第2章 搭建你的工作环境7 2.1 虚拟计算机(Virtual PC)7 2.1.1 ...

    myos:用Rust编写的业余操作系统

    我的第一个业余操作系统是用Rust编写的,其中一个版本的代码约为20,000行,并支持多任务,Windows,WebAssembly运行时和简单的应用程序。 特征 用Rust编写的业余操作系统 不是POSIX克隆系统 使用UEFI引导64位操作...

    一个类似Unix的简单操作系统-C/C++开发

    soso Soso是一个简单的类似Unix的操作系统,用Nasm程序集编写,并且大多是用C编写的。它支持多重引导,因此由Grub启动。 可以使用Nasm和Clang来构建。 如果需要,可以使用GCC代替Clang。 测试soso Soso是一个简单的...

    C程序设计语言(第2版·新版中文)

    嵌入式系统的内核引导启动过程浅析 linux的内核及其内核源码分析U-Boot PoorSakura vol.4 中文补丁(雯雅婷4 汉化补丁) 嵌入式系统构件基于arm sqlserver2005技术内幕:t-sql程序设计part1(中文完整版分4份下) ...

Global site tag (gtag.js) - Google Analytics