第一讲 - WIN32基础知识-WIN32汇编语言程序设计001

win32asm写的红警2的修改器 from http://zerray.com/ 由于红警2中保存金钱的位置每次载入都不一样,所以不能简单的 WriteProcessMemory 就行了。不过办法当然还是有的。查到一次的地址,然后在地址处下个断点,动态跟踪一下就会发现,代码中有一处 push eax 是用来给出保存金钱的地址的。在该处下断点,每次 eax 的值加 2E8h 刚好是保存金钱的地址。嘿嘿,那只要在这里做一些手脚 阅读详情

必须了解的基础知识

(来自鱼C工作室

本教程对应视频:WIN32汇编语言程序设计视频下载


80x86 处理器的工作模式

实模式

保护模式

虚拟8086模式


Windows 的内存管理机制

Dos 操作系统的内存安排情况

80386 的内存寻址机制

80386 的内存分页机制

Windows 的内存安排

从Win32 汇编的角度看内存寻址


Windows 的特权保护机制

80386 的中断和异常

80386 的保护机制

Windows 的保护机制


这是我们需要了解的一些基础知识,无论学习哪门编程语言,只要在Windows 下编程,这些不能不知 ^_^

80x86 处理器的工作模式
(相关教学视频请关注www.fishc.com
80386以后的处理器有 3 种工作模式:实模式、保护模式和虚拟8086模式。
其实,实模式和虚拟8086模式是为了向下兼容而设置的。而保护模式是我们的主角,是我们现代系统实际上的工作模式。
只有在保护模式下,CPU的寻址才能达到4GB的地址空间,同时,也能实现多任务、内存分页管理和优先级保护等先进的机制。

Windows 的启动过程
1、开启电源  
计算机系统将进行加电自检(POST)。如果通过,之后BIOS会读取主引导记录(MBR)——被标记为启动设备的硬盘的首扇区,并传送被Windows 7建立的控制编码给MBR。

注:硬盘的0磁道的第一个扇区称为MBR,它的大小是512字节,而这个区域可以分为两个部分。第一部分为pre-boot区(预启动区),占446字节;

第二部分是Partition table区(分区表),占66个字节,该区相当于一个小程序,作用是判断哪个分区被标记为活动分区,然后去读取那个分区的启动区,并运行该区中的代码。

MBR他是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。但我们可以用ROM-BIOS中提供的INT13H中断的2号功能来读出该扇区的内容。(介绍BIOS指令)

2、启动菜单生成
Windows启动管理器读取“启动配置数据存储(Boot Confi guration Data store)中的信息。此信息包含已被安装在计算机上的所有操作系统的配置信息。并且用以生成启动菜单。  

当您在启动菜单中选择下列动作时:  
如果您选择的是Windows 7,Windows 启动管理器(Windows Boot Manager)运行%SystemRoot%\System32文件夹中的OS loader —— Winload.exe。  

如果您选择的是自休眠状态恢复Windows 7,那么启动管理器将装载Winresume.exe并恢复您先前的使用环境。 

如果您在启动菜单中选择的是早期的Windows版本,启动管理器将定位系统安装所在的卷,并且加载Windows NT风格的早期OS loader(Ntldr.exe)——生成一个由boot.ini内容决定的启动菜单。 

3、核心文件加载及登录
Windows7启动时,加载其核心文件 Ntoskrnl.exe和 hal.dll —— 从注册表中读取设置并加载驱动程序。

接下来将运行Windows会话管理器(smss.exe)并且启动 Windows启动程序(Wininit exe),本地安全验证(Lsass.exe)与服务(services.exe)进程,完成后,您就可以登录您的系统了。

实模式 (编程互助学习论坛:鱼C论坛)
处理器被复位或者加电的时候以实模式启动。
这时候处理器中各寄存器以实模式的初始化值工作。

80386处理器在实模式下的存储器寻址方式和8086是一样的,由段寄存器的内容乘以 16当做基地址,加上段内的偏移地址形成最终的物理地址,这时候它的32位地址线只使用了低20位。

在实模式下,80386处理器不能对内存进行分页管理,所以指令寻址的地址就是内存中实际的物理地址。在实模式下,所有的段都是可以读、写和执行的。

实模式下80386不支持优先级,所有的指令相当于工作在特权级(优先级0),所以它可以执行所有特权指令,包括读写控制寄存器CR0等。

实际上,80386就是通过在实模式下初始化控制寄存器,GDTR,LDTR,IDTR与TR等管理寄存器以及页表,然后再通过加载CR0使其中的保护模式使能位置位而进入保护模式的。当然,实模式下不支持硬件上的多任务切换。 

实模式下的中断处理方式和8086处理器相同,也用中断向量表来定位中断服务程序地址。

中断向量表的结构也和8086处理器一样:每4个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址。 


从编程的角度看,除了可以访问80386新增的一些寄存器外,实模式的80386处理器和8086有什么进步呢?

其实最大的好处是可以使用80386的32 位寄存器,用32位的寄存器进行编程可以使计算程序更加简捷,加快了执行速度。
比如在8086时代用16位寄存器来完成32位的乘法和除法时,要进行的步骤实在是太多了,现在用32位寄存器一条指令就可以完成。

80386中增加的两个辅助段寄存器FS和GS在实模式下也可以使用,这样,同时可以访问的段达到了6个而不必考虑重新装入的问题;最后,很多80386的新增指令也使一些原来不很方便的操作得以简化

保护模式(编程互助学习论坛:鱼C论坛)
当 80386工作在保护模式下的时候,它的所有功能都是可用的。这时80386所有的32根地址线都可供寻址,物理寻址空间高达4 GB。

在保护模式下,支持内存分页机制,提供了对虚拟内存的良好支持。虽然与8086可寻址的1 MB物理地址空间相比,80386可寻址的物理地址空间可谓很大,但实际的微机系统不可能安装如此大的物理内存。所以,为了运行大型程序和真正实现多任务,虚拟内存是一种必需的技术。 

保护模式下80386支持多任务,可以依靠硬件仅在一条指令中实现任务切换。任务环境的保护工作是由处理器自动完成的。

在保护模式下,80386处理器还支持优先级机制,不同的程序可以运行在不同的优先级上。

优先级一共分0~3 共 4个级别,操作系统运行在最高的优先级0上,应用程序则运行在比较低的级别上。

配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔离各个任务。从实模式切换到保护模式是通过修改控制寄存器CR0的控制位PE(位0)来实现的。在这之前还需要建立保护模式必需的一些数据表,如全局描述符表GDT和中断描述符表IDT等。 

DOS操作系统运行于实模式下,而Windows操作系统运行于保护模式下。

虚拟8086模式 (相关教学视频请关注www.fishc.com
虽说实模式兼容以前的系统,但是设想一下,如果Windows或80386处理器推出的时候宣布不能运行以前的MS-DOS程序,那么就等于放弃了一个巨大的软件库,Windows以及80386处理器可能就会落得和苹果机一样的下场,这是Microsoft 和Intel都不愿看到的。
举个简单的例子,当你正兴高采烈地计划利用80386多任务并行的特性,边欣赏《小甲鱼大战仓小姐》的大片边完成小甲鱼的编程作业时,发觉原来的文档要用到原来的系统才能打开……

由于这种特殊需求的普遍性,虚拟8086应运而生!

虚拟86模式是以任务形式在保护模式上执行的,在 80386上可以同时支持由多个真正的80386任务和虚拟86模式构成的任务。

在虚拟86模式下,80386支持任务切换和内存分页。在Windows 操作系统中,有一部分程序专门用来管理虚拟86模式的任务,称为虚拟86管理程序。

既然虚拟86模式以保护模式为基础,它的工作方式实际上是实模式和保护模式的混合。

为了和8086程序的寻址方式兼容,虚拟86模式采用和8086一样的寻址方式,即用段寄存器乘以16当做基址再配合偏移地址形成线性地址,寻址空间为1 MB。

但显然多个虚拟86任务不能同时使用同一位置的1 MB地址空间,否则会引起冲突。操作系统利用分页机制将不同虚拟86任务的地址空间映射到不同的物理地址上去,这样每个虚拟86任务看起来都认为自己在使用0~1 MB的地址空间。 

8086代码中有相当一部分指令在保护模式下属于特权指令,如屏蔽中断的cli和中断返回指令iret 等。

这些指令在8086程序中是合法的。如果不让这些指令执行,8086代码就无法工作。为了解决这个问题,虚拟86管理程序采用模拟的方法来完成这些指令。

虚拟86管理程序在异常处理程序中检查产生异常的指令,如果是中断指令,则从虚拟86任务的中断向量表中取出中断处理程序的入口地址,并将控制转移过去。 

如果是危及操作系统的指令,如cli等,则简单地忽略这些指令,在异常处理程序返回的时候直接返回到下一条指令。

通过这些措施,8086程序既可以正常地运行下去,在执行这些指令的时候又觉察不到已经被虚拟86管理程序做了手脚。MS-DOS应用程序在Windows 操作系统中就是这样工作的。

SerComm DOS串口工具:实模式下直控UART寄存器的嵌入式调试利器 串口通信是嵌入式系统最基础的硬件交互方式,其底层依赖UART芯片(如16550A)的寄存器级控制。在DOS实模式环境下,标准系统调用无法访问线路状态寄存器(LSR)、中断使能寄存器(IER)等关键硬件资源,导致Bootloader调试、BIOS开发、老旧工控设备维护等场景面临通信断层。SerComm正是为突破这一限制而生——它以纯汇编+Turbo C实现零依赖的I/O端口直写,绕过操作系统抽象层,将波特率设置、RS-485方向切换、中断服务例程注入等能力完全开放给开发者。该工具虽运行于MS-DOS/PC-D 阅读详情

相关推荐

UltraEdit APDL语法高亮配置指南:.uew文件原理与工程实践

语法高亮是代码可读性与调试效率的基础技术,其本质是词法分析器对关键字、分隔符、运算符和注释规则的静态匹配。UltraEdit 采用专有的 .uew 配置文件驱动高亮引擎,区别于 VS Code 的 tmLanguage 或 Notepad++ 的 XML 格式,具备轻量、低资源占用、毫秒级响应等优势,特别适配老旧工作站环境下的 CAE 工程场景。APDL 作为 ANSYS 多物理场仿真的核心脚本语言,语法混合 Fortran 命令、C 类宏控制与参数缩写,依赖精准的 .uew 定义实现语义分层着色——如 *

weixin_34174322的博客 428

开题篇 - Win32汇编语言001

开题篇 让编程改变世界 Change the world by program 鱼C自创的 “ODT” 学习理念: 小甲鱼希望这个学习班能够打破传统的教育体制 -- 不再以一师一说的形式学习,因为小甲鱼觉得这样的教学会束缚大家的思维。(Open) 鱼C 学习班将尝试以 “引导 - 异议 - 讨论 - 提升” 的形式来开展我们这次学习计划。(Discuss) 学习主要以小组...

weixin_34290000的博客 145

win32汇编教程

win32汇编教程。汇编基础。 本帮助文件由yyc个人整理后出版,内容全摘自网络。版权归实际作者所有。 为了让网友们能更好的学习Win32汇编编程,于是我为大家将网上的资料整理成一个帮助文件。 本帮助文件包括:Iczelion的Win32汇编教程、Iczelion 的 ODBC 教程、Iczelion 的 VxD 教程共三部分

Win32汇编基础知识入门

汇编语言是所有程序设计语言中最古老的,它与计算机机器语言最为接近,通过汇编语言可以直接访问计算机的硬件,能够直接与CPU对话,可以说汇编语言是所有编程语言中语法格式最自由的,但自由的代价就是需要了解计算机体系结构和操作系统的大量细节,每编写一段程序都需要考虑各种硬件的状态,从而导致使用汇编写程序效率非常低.

微软技术分享 7572

WIN32汇编语言程序设计——API和动态链接

最后有一个最重要的概念一定要牢记:动态链接库是被映射到其他应用程序的地址空间中执行的,它和应用程序可以看成是“一体”的,动态链接库可以使用应用程序的资源,它所拥有的资源也可以被应用程序使用,它的任何操作都是代表应用程序进行的,当动态链接库进行打开文件、分配内存和创建窗口等操作后,这些文件、内存和窗口都是为应用程序所拥有的。1. 在程序中声明函数。当PE文件被执行的时候,Windows装载器将文件装入内存并将导入表中登记的DLL文件一并装入,再根据DLL文件中的函数导出信息对被执行文件的IAT表进行修正。

evagenius的博客 1253

Win32汇编】学习Win32汇编

本文主要是梳理了一下Win32基础知识。因为有的内容和16位汇编基本一样,就没有详细说明,可以参考之前的汇编语言的博客。

Arcus 5167

使用MASM01 - Win32汇编语言009

使用MASM01 让编程改变世界 Change the world by program 使用MASM 经过上一的准备工作,相信大家已经搭建好了 Win32 汇编工作环境,并已经知道编译、链接一个程序的过程和原理了。 现在,我们让例子回归到经典: [codesyntax lang="c"] #include <stdio.h> int main(void)...

weixin_33766168的博客 391

Windows编程-001

Windows编程就是在Windows平台上开发,并且运行于Windows平台上的程序,当然,开发的时候运用的东西是Windows API或者封装之后的Windows API。

不定期更新,欢迎查阅 298

win32汇编初步探索及Onllydbg的使用

实验项目 win32汇编 综合性实验 2020年11月25日 一、实验综述 1.实验目的及要求 (1)掌握C语言定义全局变量的基本原理 (2)掌握Ollydbg分析工具的使用 (3)在C语言源代码中添加MessageBox代码来定位全局变量赋值语句 (4)分析OD中反汇编窗口及堆栈窗口代码,寻找反汇编代码中的赋值语句 2.实验仪器、设备或软件 Ollydbg Visual Studio 2015 3.实验原理 (1)Ollydbg简介 Ollydbg是汇编级的调试器,我们使用的VS是...

fencecat的博客 950

Win32汇编 数据类型

题目1: 定义结构体商品,含编号、品名、单价、数量,输入一个商品信息求其金额并输出(按“%g”格式输出)。 若运行后输入:S001 小刀 4.5 2 则运行结果输出:编号:S001,品名:小刀,单价:4.5,数量:2,金额:9 .386 .model flat, stdcall option casemap :none include kernel32.inc includelib kern...

yky__xukai的博客 857

WIN32汇编-汇编

 学好WIN32汇编,平时需要多阅读编译器生成的汇编代码,因为编译器生成的代码是最规范和最优化的,从中可以学到汇编编程和语句优化的技巧。     如何得到一个程序的反汇编代码呢?使用反汇编软件,不是使用DOS的DEBUG,WINIODWS平台上已经有多反汇编软件,读者可以从下面的地址中下载反汇编软件 http://www.pediy.com/tools/Disassemblers/W32Das...

深未来技术 629

汇编语言实现R进制无符号数的输入/输出

  我认为,学习一门计算机编程语言第一件事是要掌握如何输入和输出;汇编语言也不例外。通过编制“R进制无符号数的输入/输出”程序,能练习汇编语言中的“INT 12H”中断的1、2、9、1AH号功能,ADD/SUB/MUL/DIV等算术运算指令,以及各种跳转指令的运用,这对汇编语言的快速入门有很大帮助。   “R进制无符号数的输入/输出”程序将实现这么一个功能:用户输入R进制数(R=2、...

weixin_30549657的博客 452

x264中的汇编:x86inc.asm——001

http://blog.csdn.net/xiaoyi247/article/details/7904906 版权声明:本文为博主原创文章,未经博主允许不得转载。      龙哥以前说过,不懂汇编,就别说自己懂264,确实汇编在视频编解码中的作用太大了。在非opencl等显卡并行优化的平台上,SIMD就成了算法并行处理的唯一渠道。整个X264的代码的精华都在

STN_LCD的专栏 1276

汇编学习总结

                                                           汇编学习总结 因快期末考啦。。。下面是我个人对汇编学习的复习 大家可以忽略。。。。。。         汇编大多是指汇编语言汇编程序。把汇编语言翻译成机器语言过程称为汇编。在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地...

代码敌敌畏的博客 1185

多进程编程

Linux下一个进程在内存里有三部份的数据,就是“数据段”,“堆栈段”和“代码段”,其实学过汇编语言的人一定知道,一般的CPU象I386,都有上述三种段寄存器,以方便操作系统的运行。“代码段”,顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一   个代码段。    堆栈段存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。而数据段则存放

535

【OpenSSL】VC编译OpenSSL

选择其中一个编译方式,进入控制台,比如选择。为例,可以选择多种编译方式,入下图。路径,检验标标准就是。

maoye的博客 974
上一篇: 小甲鱼PE详解之基址重定位详解(PE详解10)
fish_c
博客等级 码龄16年 51粉丝 11原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值