`
lobin
  • 浏览: 425811 次
  • 性别: 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
分享到:
评论

相关推荐

    天书夜读从汇编语言到windows内核编程

    标题《天书夜读从汇编语言到windows内核编程》和描述“以汇编语言为引,带你畅游windows内核,熟悉内核编程”所涉及的知识点包括汇编语言基础、Windows操作系统内核结构、以及在Windows内核层面上进行编程的方法和...

    操作系统引导程序源码

    在Windows操作系统中,引导程序的过程相对复杂,涉及到多个阶段和组件。本资源包含的是基本操作系统的引导程序源码,对于理解Windows启动流程以及进行系统级编程有着极高的学习价值。 引导程序通常分为MBR(主引导...

    Windows内核实验教程

    除此之外,你还会接触到系统调用接口,这是用户模式程序与内核交互的主要途径。学习如何使用系统调用调试工具(如kd、windbg)来分析系统行为,排查问题,是提升内核级调试技能的重要环节。 总之,《Windows内核...

    Windows内核原理与实现.pdf

    本书全面解析了Windows内核的工作机制,涵盖了从系统启动、进程管理、线程调度、内存管理到设备驱动等多个核心领域,是IT从业者深入了解操作系统底层运行机制的重要参考资料。 在Windows内核中,系统启动是一个至关...

    windows驱动程序编写指南

    在Windows操作系统环境中,驱动程序是连接...总的来说,"Windows驱动程序编写指南"将引导读者深入了解驱动程序的工作原理,学习如何为USB和打印机设备编写高效、稳定的驱动程序,从而更好地利用Windows平台的硬件资源。

    KmdKit windows内核程序开发包

    在Windows系统中,内核开发涉及到驱动程序编写、系统服务实现以及系统稳定性与性能优化。KmdKit提供了必要的工具和文档,使得开发者能够直接在内核层面上进行编程。 **汇编语言**是计算机科学的基础,特别是对于低...

    从汇编语言到windows内核编程

    本书还将讨论安全性和稳定性问题,因为内核编程涉及到系统的核心部分,任何错误都可能导致系统崩溃或被恶意利用。读者将学习如何编写安全、可靠的内核代码,遵循最佳实践来防止内存泄漏、缓冲区溢出等常见问题。 ...

    用windows引导linux

    Grub4dos是一款基于GRUB(Grand Unified Bootloader)的引导管理器,它允许用户在不修改MBR(主引导记录)的情况下,通过Windows系统引导其他操作系统,包括Linux。Grub4dos不仅易于使用,而且功能强大,支持命令行...

    操作系统实验报告 记录Windows系统启动

    1. 观察并记录Windows系统从按下电源开关到操作系统完全启动的整个过程,分析其启动机制。 2. 编写并运行一个简单的C语言程序,包含主程序和被调用程序,以实践计算机处理用户程序的步骤。 实验步骤: 1. Windows...

    天书夜读:从汇编语言到Windows内核编程

    - **背景介绍**:《天书夜读:从汇编语言到Windows内核编程》是一本旨在帮助读者从基础的汇编语言入门,逐步过渡到Windows内核编程领域的书籍。作者谭文具有丰富的Windows内核驱动开发经验,对于汇编语言与Windows...

    Windows98光盘引导文件win98.bif

    当用户将Windows 98光盘放入光驱,电脑读取win98.bif文件后,会依据其中的指令进行一系列操作,如检测硬件、加载驱动程序、初始化操作系统内核等。win98.bif的灵活性使得它可以适应不同的硬件配置,无论是简体中文版...

    天书夜读——从汇编语言到Windows内核编程

    这本书旨在引导读者从基础的汇编语言学习,逐步深入到复杂的Windows操作系统内核编程。在这个过程中,读者将了解到计算机系统的核心运作机制,从而能够更有效地进行系统级的开发和优化。 汇编语言是计算机科学的...

    Linux内核完全注释:基于0.11内核(V5.0)_0.11内核_linux_linux内核完全注释_Linux内核注释_

    1. 内核初始化:这是Linux启动的第一步,包括加载引导程序、解压内核镜像、设置内存管理、初始化中断处理等。通过注释,读者可以了解到系统如何从零开始构建整个运行环境。 2. 进程管理:内核如何创建、调度、终止...

    windows2003 sp1内核源代码 部分

    9. **系统初始化**:这部分源代码描述了操作系统启动过程,包括硬件检测、初始化引导加载器、加载内核、启动第一个进程等步骤。 10. **并发与同步**:在多处理器环境下,内核需要有效地管理和同步资源。这部分源...

    WIN64内核编程入门手册

    4. **内核模式与用户模式**:在Windows系统中,内核模式拥有最高的权限,可以直接访问硬件资源,而用户模式下的应用程序则受到更多的限制,以保护系统的稳定性。在64位内核编程中,理解这两种模式之间的交互至关重要...

    [深入解析Windows操作系统].SysinternalsSuit.pdf文档

    从上到下,书中揭示了Windows的网络栈,包括映射、API、名称解析和协议驱动程序,这对于网络编程和网络安全分析尤其重要。 8. 诊断引导问题和执行崩溃分析。引导问题是操作系统启动时可能遇到的麻烦之一,而系统...

Global site tag (gtag.js) - Google Analytics