1.代码清单 ;代码清单9-1 ;文件名:c09_1.asm ;文件说明:用户程序 ;创建日期:2011-4-16 22:03 ;=============================================================================== SECTION header vstart= ;定义用户程序头部段 program_length dd program_end ;程序总长度[0x00] ;用户程序入口点 code_entry dw start…
上次我们说了代码,这次我们说说怎样看到实验结果. 首先编译源文件(我的源文件就在当前路径下,a盘和c盘在上一级目录下): nasm -f bin c08_mbr.asm -o c08_mbr.bin nasm -f bin c09_1.asm -o c0901.bin 然后将bin文件写入a盘和c盘 dd if=c08_mbr.bin of=../a.img dd if=c0901.bin of=../c.img bs=512 seek=100 conv=notrunc 注意:也许你需要根据自身…
1.BIOS中断 我们可以为所有中断类型自定义中断处理过程,包括内部中断.硬件中断和软中断. BIOS中断,又称BIOS功能调用,主要是为了方便地使用最基本的硬件访问功能.通常,为了区分针对同一硬件的不同功能,使用寄存器AH来指定具体的功能编号. 比如说,以下的指令用于从键盘读取一个按键: mov ah,0x00 ;0功能号对应从键盘读字符 int 0x16 ;键盘服务, int 0x16 ; 中断返回时,字符的ASCII在AL中 需要说明的是,BIOS可能会为一些简单地外围设备提供初始化代码和…
一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 (3)虚拟8086模式:这种方式可以使用户在保护模式下运行8086程序(比如cmd打开的console窗口,就是工作在虚拟8086模式) 有几点需要特别说明: (1)保护模式可分为16位和32位的,由段描述符中的D标志指明.对于32位代码段和数据段,这个标志总是设为1:对于16位代码和数据段,这个标…
(十)保护模式下的栈 ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 mov cx,00000000000_11_000B ;加载堆栈段选择子 mov ss,cx mov esp,0x7c00 第77~79行用来初始保护模式下的栈.栈段描述符是GDT中第3个(从0开始数)描述符,这个描述符的线性基地址是0x0000_0000,段界限是0x0000_7a00,粒度是字节,B=1,属于可读可写.向下扩展的数据段. 我在博文数据段描述符和代码段描述符(一)--<x86汇编语言:从实模式到保护模…
首先来段题外话:之前我发现我贴出的代码都没有行号,给讲解带来不便.所以从现在起,我要给代码加上行号.我写博客用的这个插入代码的插件,确实不支持自动插入行号.我真的没有找到什么好方法,无奈之下,只能按照网友的说法,在VIM中给每行代码加上行号,然后再贴出来. 在VIM中每一行都添加上行号的方法是: :%s/^/\=line(".")/ 对,只要执行这个命令就可以了.至于为什么这样写,可以参考我的另一篇博文 <在VIM中添加行号的方法>http://blog.csdn.net/…
本文是<x86汇编语言:从实模式到保护模式>(电子工业出版社)的读书实验笔记. 这篇文章我们先不分析代码,而是说一下在Bochs环境下如何看到实验结果. 需要的源码文件 第一个文件是加载程序 ;代码清单8-1 ;文件名:c08_mbr.asm ;文件说明:硬盘主引导扇区代码(加载程序) ;创建日期:2011-5-5 18:17 app_lba_start equ 100 ;声明常数(用户程序起始逻辑扇区号) ;常数的声明不会占用汇编地址 SECTION mbr align=16 vstart=…
★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存器被命名为EAX,EBX,ECX,EDX,ESI,EDI,ESP和EBP,同样的,操作的时候必须要和寄存器的长匹配,比如下面的操作就是错的. 32位通用寄存器的高16位不可以单独使用,但是他们的低16位依然可以按照8086的使用方法一样使用.处理器在32位保护模式下可以使用全部的32条地址线,访问4…
存储器的保护(三) 修改本章代码清单,使之可以检测1MB以上的内存空间(从地址0x0010_0000开始,不考虑高速缓存的影响).要求:对内存的读写按双字的长度进行,并在检测的同时显示已检测的内存数量.建议对每个双字单元用两个花码0x55AA55AA和0xAA55AA55进行检测. 上面的文字选自原书第12章的习题1. 这篇博文就讨论一下这道题.由于是初学,我不对自己做太高的要求,只要实现功能即可. 代码清单 ;文件说明:第12章习题-1 ;创建日期:2016-3-7 ;--------- eq…
本文是原书第12章的学习笔记. 说句题外话,这篇博文是补写的,因为让我误删了,可恶的是CSDN的回收站里找不到! 好吧,那就再写一遍,我有坚强的意志.司马迁曰:“文王拘而演<周易>:仲尼厄而作<春秋>:屈原放逐,乃赋<离骚>:左丘失明,厥有<国语>:孙子膑脚,<兵法>修列:不韦迁蜀,世传<吕览>……”好了,不煽情了,进入正题. 第12章的代码如下. 1 ;代码清单12-1 2 ;文件名:c12_mbr.asm 3 ;文件说明:硬盘主引…
有幸结识了<X86汇编语言:从实模式到保护模式>一书.我觉得这本书非常好,语言活泼,通俗易懂,源码丰富,受益匪浅.读罢一遍,意犹未尽.于是打算再读一遍,并把自己的读书所学总结成笔记,一来给自己留个纪念,二来供各位访客参考.初出茅庐,牛刀小试,如有错误,实属必然.还请广大博友批评指正,不吝赐教.   在此也向本书的作者--李忠.王晓波(我联想到了作家王小波,其实他曾经也是程序员).余洁表示敬意.希望他们能出更多的好书.   关于本书的配书文件和源代码,我已经上传到 http://download…
程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都是在命令行输入命令进行编译和写入.源文件少的时候还不认为麻烦,当源文件多了,就会认为特别麻烦.有没有简单的方法呢? 当然有,就是用make工具. 1.1.什么是make工具 make是一个命令工具,它解释Makefile中的指令.在Makefile文件里描写叙述了整个project全部文件的编译顺序.编译规则…
★PART1:进入保护模式 1. 全局描述符表(Global Descriptor Table,GDT)        32位保护模式下,如果要使用一个段,必须先登记,登记的信息包括段的起始地址,段的界限和各种访问属性,如果偏移地址超过了段的界限,就会引发异常中断.和一个段有关的信息需要8个字节来描述,这被称为段的描述符(Segement Descriptor),每个段都需要一个描述符,为了存放描述符,需要在内存中开辟一段空间.这些描述符集中存放,构成了一个描述符表. 为了跟踪全局描述符表,处理…
一.80286的工作模式 80286首次提出了实模式和保护模式的概念. 实模式:和8086的工作方式相同: 保护模式:提供了存储器管理机制和保护机制,支持多任务. 二.80286的寄存器 (一)通用寄存器 80286的通用寄存器和8086一样,有AX,BX,CX,DX,BP,SP,SI,DI: (二)IP 80286的指令指针寄存器也和8086一样,没有什么特别的. (三)标志寄存器 80286的标志寄存器同8086相比,增加了IOPL(特权级)和NT(子任务嵌套),这两个字段只在保护模式中使用…
之前已经做了一些理论上的铺垫,这次我们就可以看代码了. 一.代码清单 ;代码清单11-1 ;文件名:c11_mbr.asm ;文件说明:硬盘主引导扇区代码 ;创建日期:2011-5-16 19:54 ;设置堆栈段和栈指针 mov ax,cs mov ss,ax mov sp,0x7c00 ;计算GDT所在的逻辑段地址 mov ax,[cs:gdt_base+0x7c00] ;低16位 mov dx,[cs:gdt_base+0x7c00+0x02] ;高16位 div bx mov ds,ax…
在说正题之前,我们先看2个概念. 1.指令集架构(ISA) ISA 的全称是 instruction set architecture,中文就是指令集架构,是指对程序员实际"可见"的指令集,包含了程序员编写一个能正确运行的二进制机器语言程序的所有信息,涉及到指令. I/O 设备等.例如 Intel 的 IA-32.Intel 64.ARM 的 ARMv7.ARMv8 等等. 2.微架构 微架构(Microarchitecture)又称为微体系结构/微处理器体系结构.是将一种给定的指令集…
x86实模式到保护模式  李忠 王晓波 第3到4章 各个进制间的转换省略 实验环境 编译器  nasm 虚拟机 virtual box 小程序  hexview   观察编译后的机器代码 fixvhdwr 向虚拟硬盘写入数据 计算机启动简介 cpu的引脚  reset    接受复位信号   电平由低变高时    cpu进行硬件的初始化   cs的内容为0xffff     其余寄存器为0 内存   dram  随机访问存储器 rom  只读存储器    例如bios系统需要无电存储 8086…
详细的过程说明参考:(1)  https://www.cnblogs.com/Philip-Tell-Truth/p/5211248.html    (2)x86汇编:从实模式到保护模式 这里简化一下说说要点: 1. 生成并加载GDT表 实模式下任何进程可以无限制读写任何内存,甚至os的内存,毫无安全性可言:需要对用户进程读写内存的地址做严格限制,衍生出了保护模式:保护模式将内存分成不同的段,段基址.limit.各种属性存放在GDT表:用户程序读写段内存时需要先通过段寄存器的selector在G…
本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22309359 作者:jadeshu   邮箱: jadeshu@qq.com    欢迎邮件交流 X86实模式下 在实模式下,寻址一个内存地址主要是使用段和偏移值,段值被存放在段寄存器中(如ds),并且段的长度被固定为64KB.段内偏移地址存放在任意一个可用于寻址的寄存器中(如si).因此,根据段寄存器和偏移寄存器中的值,就可以算出实际指向的内存地址  X…
中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫NMI和INTR.处理器正在运行的时候会收到各种各样的中断,有些中断必须被处理,这就叫非屏蔽中断:有一些中断的处理优先级没有那么高,并且可以屏蔽,这就叫可屏蔽中断 1. 非屏蔽中断(Non Maskable Interrupt,NMI) 一旦处理器接受到NMI,说明处理器遇到了严重事件,这个时候必须无…
一.STM32F1 RTC介绍 1.1 RTC简介 STM32 的实时时钟( RTC)是一个独立的定时器. STM32 的 RTC 模 块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的 功能.修改计数器的值可以重新设置系统当前的时间和日期. RTC模块和时钟配置是在后备区域,无论器件状态如何(运行模式. 低功耗模式或处于复位状态),只要保证后备区域供电正常,RTC便不会 停止工作,所以通常会在后备区域供电端加一个纽扣电池,即使主电源 停止供电,后备电源也会启动供电,从而保证RTC时…
    第八章是一个非常重要的章节,讲述的是实模式下对硬件的访问(这一节主要讲的是硬盘),还有用户程序重定位的问题.现在整理出来刚好能和保护模式下的用户程序定位作一个对比. ★PART1:用户程序的重定位,硬盘的访问 1. 分段.段的汇编地址和段内汇编地址 NASM编译器使用汇编指令“SECTION”或者“SEGMENT”来定义段.他的一般格式是SECTION 段名称或者SEGMENT段名称(段名称不能重复),另外NASM对段没有数量的限制,一个程序可以有很多的代码段和数据段.Intel处理器要…
★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259A和I/O APIC这样的中断寄存器手机,并发送给处理器.硬件中断完全是随机产生的,与处理器的执行并不同步.当中断发生的时候,处理器要先执行完当前的指令(指的是正在执行的指令),然后才能对中断进行处理. 软中断是由int n指令引发的中断处理器,n是中断号(类型码). 2. 异常(Exception…
第16章讲的是分页机制和动态页面分配的问题,说实话这个一开始接触是会把人绕晕的,但是这个的确太重要了,有了分页机制内存管理就变得很简单,而且能直接实现平坦模式. ★PART1:Intel X86基础分页机制 1. 页目录.页表和页 首先先要明白分页是怎么来的,简单来讲,分页其实就是内存块的映射管理.在我们之前的章节中,我们都是使用的分段管理模式,处理器中负责分段的部件是段部件,段管理机制是Intel处理器最基本的处理机制,在任何时候都是无法关闭的.而当开启了分页管理之后,处理器会把4GB的内存分…
15章其实应该是和14章相辅相成的(感觉应该是作者觉得14章内容太多了然后切出来了一点).任务切换和14章的某些概念是分不开的. ★PART1:任务门与任务切换的方法 1. 任务管理程序 14章的时候我们说过,一个程序他可以有很多个任务,特权级指的是任务的不同部分的特权级,一个任务可以有两个空间,一个全局空间,一个局部空间.在一个任务内,全局空间和局部空间具有不同的特权级别,使用门,可以在任务内将控制从3特权级的局部空间转移到0特权级的全局空间,以使用内核或者操作系统提供的服务. 任务切换时以任…
★PART1:32位保护模式下任务的隔离和特权级保护  这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重讲TSS如何进行任务切换). 1. 任务,任务的LDT和TSS 程序是记录在载体上的指令和数据,其正在执行的一个副本,叫做任务(Task).如果一个程序有多个副本正在内存中运行,那么他对应多个任务,每一个副本都是一个任务.为了有效地在任务之间进行隔离,处理器建议每个任务都应该具有他自己的描述符表,称…
实验指导书及代码包下载: http://pan.baidu.com/s/1jHuZcnc iCore3 购买链接: https://item.taobao.com/item.htm?id=524229438677…
实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; ; /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the F…
实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ RTC_DateTypeDef sDate; RTC_TimeTypeDef sTime; uint8_t second_tmp = ; /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all periphera…
80X86中断系统 能够处理256个中断 用中断向量号0-255区别 可屏蔽中断还需要借助专用中断控制器Intel 8259A实现优先权管理 1.中断的分类 中断可以分为内部中断和外部中断. (1)内部中断 除法错中断 指令中断 溢出中断 单步中断 断点中断 (2)外部中断 非屏蔽中断 可屏蔽中断 如果觉得上面的分类太抽象,那么下面的图会给你直观的印象. 通过这张图,我们可以明白,内部中断是在处理器内部产生.外部中断是通过两个信号线(NMI和INTR)引入处理器内部的. 2.内部中断 (1)除法…