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: }
相关推荐
标题《天书夜读从汇编语言到windows内核编程》和描述“以汇编语言为引,带你畅游windows内核,熟悉内核编程”所涉及的知识点包括汇编语言基础、Windows操作系统内核结构、以及在Windows内核层面上进行编程的方法和...
在Windows操作系统中,引导程序的过程相对复杂,涉及到多个阶段和组件。本资源包含的是基本操作系统的引导程序源码,对于理解Windows启动流程以及进行系统级编程有着极高的学习价值。 引导程序通常分为MBR(主引导...
除此之外,你还会接触到系统调用接口,这是用户模式程序与内核交互的主要途径。学习如何使用系统调用调试工具(如kd、windbg)来分析系统行为,排查问题,是提升内核级调试技能的重要环节。 总之,《Windows内核...
本书全面解析了Windows内核的工作机制,涵盖了从系统启动、进程管理、线程调度、内存管理到设备驱动等多个核心领域,是IT从业者深入了解操作系统底层运行机制的重要参考资料。 在Windows内核中,系统启动是一个至关...
在Windows操作系统环境中,驱动程序是连接...总的来说,"Windows驱动程序编写指南"将引导读者深入了解驱动程序的工作原理,学习如何为USB和打印机设备编写高效、稳定的驱动程序,从而更好地利用Windows平台的硬件资源。
在Windows系统中,内核开发涉及到驱动程序编写、系统服务实现以及系统稳定性与性能优化。KmdKit提供了必要的工具和文档,使得开发者能够直接在内核层面上进行编程。 **汇编语言**是计算机科学的基础,特别是对于低...
本书还将讨论安全性和稳定性问题,因为内核编程涉及到系统的核心部分,任何错误都可能导致系统崩溃或被恶意利用。读者将学习如何编写安全、可靠的内核代码,遵循最佳实践来防止内存泄漏、缓冲区溢出等常见问题。 ...
Grub4dos是一款基于GRUB(Grand Unified Bootloader)的引导管理器,它允许用户在不修改MBR(主引导记录)的情况下,通过Windows系统引导其他操作系统,包括Linux。Grub4dos不仅易于使用,而且功能强大,支持命令行...
1. 观察并记录Windows系统从按下电源开关到操作系统完全启动的整个过程,分析其启动机制。 2. 编写并运行一个简单的C语言程序,包含主程序和被调用程序,以实践计算机处理用户程序的步骤。 实验步骤: 1. Windows...
- **背景介绍**:《天书夜读:从汇编语言到Windows内核编程》是一本旨在帮助读者从基础的汇编语言入门,逐步过渡到Windows内核编程领域的书籍。作者谭文具有丰富的Windows内核驱动开发经验,对于汇编语言与Windows...
当用户将Windows 98光盘放入光驱,电脑读取win98.bif文件后,会依据其中的指令进行一系列操作,如检测硬件、加载驱动程序、初始化操作系统内核等。win98.bif的灵活性使得它可以适应不同的硬件配置,无论是简体中文版...
这本书旨在引导读者从基础的汇编语言学习,逐步深入到复杂的Windows操作系统内核编程。在这个过程中,读者将了解到计算机系统的核心运作机制,从而能够更有效地进行系统级的开发和优化。 汇编语言是计算机科学的...
1. 内核初始化:这是Linux启动的第一步,包括加载引导程序、解压内核镜像、设置内存管理、初始化中断处理等。通过注释,读者可以了解到系统如何从零开始构建整个运行环境。 2. 进程管理:内核如何创建、调度、终止...
9. **系统初始化**:这部分源代码描述了操作系统启动过程,包括硬件检测、初始化引导加载器、加载内核、启动第一个进程等步骤。 10. **并发与同步**:在多处理器环境下,内核需要有效地管理和同步资源。这部分源...
4. **内核模式与用户模式**:在Windows系统中,内核模式拥有最高的权限,可以直接访问硬件资源,而用户模式下的应用程序则受到更多的限制,以保护系统的稳定性。在64位内核编程中,理解这两种模式之间的交互至关重要...
从上到下,书中揭示了Windows的网络栈,包括映射、API、名称解析和协议驱动程序,这对于网络编程和网络安全分析尤其重要。 8. 诊断引导问题和执行崩溃分析。引导问题是操作系统启动时可能遇到的麻烦之一,而系统...