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: }
相关推荐
用 Rust 编写的 Windows 内核模式驱动程序\n这个库只是 windows 内核模式驱动程序的概念验证,可以用 Rust 编程语言编写。\n它包含Windows Driver Kit的类型、常量和绑定 ,目标操作系统从 Windows XP (x86x64) 开始...
对于DOS的汇编程序员来说,就像在一夜之间,我们发现自己曾经学过的几乎所有的东西都被Windows封装到内核中去了,由于保护模式的存在,我们又无法像在DOS下那样闯入系统内核为所欲为。在Windows下用任何语言编程都...
驱动程序被操作系统加载在内核模式下,它与Windows操作系统内核的其他组件进行密切交互。本章主 要介绍Windows操作系统内核的基本概念,同时还介绍应用程序和驱动程序之间的通信方法。 2.1 Windows操作系统概述...
非常容易上手,用实例详细讲解PCI、USB、虚拟串口、虚拟摄像头、SDIO等驱动程序的开发,归纳了多种调试驱动程序的高级技巧,如用WinDBG和VMWARE软件对驱动进行源码级调试,深入Windows操作系统的底层和内核,透析...
上篇基本上是第一版的修订,只是做了一个调整,那便是在兼顾 Windows和Linux两方面用户的基础上,默认在Linux下建立开发环境来编写我们的操作系统。至于这样做的原因,在本书第 2章有比较详细的说明。当然,开发环境...
这是一个几乎完全用Rust编写的引导程序和内核,完全没有第三方依赖性。此代码库中的所有内容都是您明智的代码所需要的。 建筑 要求 要构建它,您需要Rust, nasm和lld-link (来自LLVM的链接器)。无论构建系统如何...
驱动程序被操作系统加载在内核模式下,它与Windows操作系统内核的其他组件进行密切交互。本章主要介绍Windows操作系统内核的基本概念,同时还介绍应用程序和驱动程序之间的通信方法。 2.1 Windows操作系统概述 ...
本书详细介绍如何在个人电脑上安装配置Caldera和Red Hat两种发行版本的Linux操作系统,并能帮助用户解决安装和配置过程中出现的各种问题。本书既能指导你进行基本的安装步骤,也能指导你定制独具特色的Linux 操作...
本书详细介绍如何在个人电脑上安装配置Caldera和Red Hat两种发行版本的Linux操作系统,并能帮助用户解决安装和配置过程中出现的各种问题。本书既能指导你进行基本的安装步骤,也能指导你定制独具特色的Linux 操作...
第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 ...
上篇基本上是第一版的修订,只是做了一个调整,那便是在兼顾 Windows和Linux两方面用户的基础上,默认在Linux下建立开发环境来编写我们的操作系统。至于这样做的原因,在本书第 2章有比较详细的说明。当然,开发环境...
第4章“Android的底层库和程序”,介绍Android系统的基础程序,以本地程序为主。 第5章“Android的Java虚拟机和Java环境”,这是介于本地和Java层之间的相关内容,主要介绍Android的Java虚拟机Dalvik的基本概念...
本章主要介绍电子邮件系统、Linux下的电子邮件系统,以及建立Linux下的邮件服务器。 第16章:DNS服务器。本章主要介绍DNS工作的原理、Linux下的域名服务器系统以及BIND的安装与配置等内容。详细叙述了主DNS服务器和...
本书在详细分析操作系统原理的基础上,用丰富的实例代码,一步一步地指导读者用C语言和汇编语言编写出一个具备操作系统基本功能的操作系统框架。本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。...
自己动手写操作系统在详细分析操作系统原理的基础上,用丰富的实例代码,一步一步地指导读者用C语言和汇编语言编写出一个具备操作系统基本功能的操作系统框架。本书不同于其他的理论型书籍,而是提供给读者一个动手...
第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 ...
我的第一个业余操作系统是用Rust编写的,其中一个版本的代码约为20,000行,并支持多任务,Windows,WebAssembly运行时和简单的应用程序。 特征 用Rust编写的业余操作系统 不是POSIX克隆系统 使用UEFI引导64位操作...
soso Soso是一个简单的类似Unix的操作系统,用Nasm程序集编写,并且大多是用C编写的。它支持多重引导,因此由Grub启动。 可以使用Nasm和Clang来构建。 如果需要,可以使用GCC代替Clang。 测试soso Soso是一个简单的...
嵌入式系统的内核引导启动过程浅析 linux的内核及其内核源码分析U-Boot PoorSakura vol.4 中文补丁(雯雅婷4 汉化补丁) 嵌入式系统构件基于arm sqlserver2005技术内幕:t-sql程序设计part1(中文完整版分4份下) ...