280 likes | 489 Views
工作原理 1: 取指令. 机器指令的一般格式:. 26h 0C7h 06h 04h20h 34h12h MOV ES:WORD PTR [2004H],1234H MOV AX,2001H 0B8h 01h 20h MOV BX, 2003H 0BBh 03h 20h. 0. 1. 地址总线 CS:EIP. 38005H. CPU. CS,DS,ES,EIP….
E N D
工作原理1: 取指令 机器指令的一般格式: 26h 0C7h 06h 04h20h 34h12h MOV ES:WORD PTR [2004H],1234H MOV AX,2001H 0B8h 01h 20h MOV BX, 2003H 0BBh 03h 20h
0 1 地址总线 CS:EIP 38005H CPU CS,DS,ES,EIP… 指令存储单元 01:EAX 02:EBX 03:ECX 04:EDX … 地址计算、控制 ES:2004H 数据存储单元 执行机构 数据总线 0FFFF0H 0FFF FFFFFH
中断处理程序的设计 中断处理程序的设计主要包括: 为尚未分配功能的中断号设计一个中断处理程序(新增); 修改已有的中断处理程序以扩充其功能。 下面以实方式为例进行介绍。 1.新增一个中断处理程序的步骤 ① 根据功能编制中断处理程序。 编制方法与子程序的编制方法类似,远过程, IRET。 ②为软中断找到一个空闲的中断号m;或根据硬件确定中断号。 ③ 将新编制的中断处理程序装入内存,将其入口地址送入中断矢量表4*m~4*m+3的四个字节中。 使用方法:INT m / 硬件中断 / CPU异常。
2.修改(接管)已有中断处理程序以扩充其功能2.修改(接管)已有中断处理程序以扩充其功能 ① 根据扩充功能的要求编制程序段。 ② 将新编制的程序段装入内存,把待扩充功能的已有中断处理程序的入口地址复制到新编制的程序段中,用新编制程序段的入口地址取代中断矢量表中已有中断处理程序的入口地址。 有两种切换方法如下:
两种切换方法 中断响应 =》 新中断矢量 完成新增功能 方法2 方法1 PUSHF CALL DWORD PTR OLD_INT JMP DWORD PTR OLD_INT 进入已有中断处理程序,完成原有功能(最后执行IRET返回到新增程序段) 进入已有中断处理程序,完成原有功能 (最后执行IRET退出中断处理程序) IRET(真正退出中断处理程序)
例:请通过修改ROM BIOS提供的磁盘驱动程序 (软中断“INT 13H”)实现对磁盘的写保护。 解:在“INT 13H”的入口参数中,AH用来指定功能号,当(AH)=3或0BH时,通过软中断“INT 13H”可将主存中的内容写到指定磁盘的扇区中。 接管“INT 13H”的新源程序如下: CODE SEGMENT ASSUME CS:CODE,SS:STACK OLD_INT DW ?,? ;存放老中断向量
;新中断处理程序(“INT 13H”)的代码 NEW13H: CMP AH,3 ; 判断是否调用第一种磁盘写功能 JE QUIT CMP AH,0BH ; 判断是否调用第二种磁盘写功能 JE QUIT JMP DWORD PTR CS:OLD_INT ;允许则继续执行 原中断处理程序功能 QUIT: PUSH BP MOV BP,SP OR WORD PTR [BP]+6,01H ;1→CF,表示出错。 修改了中断返回后的标志寄存器内容 POP BP MOV AH,3 ; 错误号为写保护 IRET ; 弹出的标志寄存器的CF值已 被修改为1
;初始化(安装新中断向量并常驻内存)程序 START: XOR AX,AX MOV DS, AX ;0→DS MOV AX, DS:[13H*4] ; 取原“INT 13H”的中 断矢量的偏移部分 MOV CS:OLD_INT, AX ;将偏移部分保存 MOV AX, DS:[13H*4+2] ;取原“INT 13H”的中断矢量 的段值 MOV CS:OLD_INT+2, AX ;将段值保存 CLI ;修改中断矢量表时必须关中断, 防止中途被外部中断打断而导致出错 MOV WORD PTR DS:[13H*4], OFFSET NEW13H ;将新的偏移值送到中断矢量表 MOV DS:[13H*4+2], CS ;将新的段值送到中断矢量表 STI ;开中断 MOV DX, OFFSET START+15 ;计算中断处理程序占用 的字节数,+15是为了在计算的时候能 向上取整。 MOV CL, 4
SHR DX, CL ;把字节数换算成节数(每节代表16个字节) ADD DX, 10H ;驻留的长度还需包括程序段前缀的内容 (100H个字节) MOV AL, 0 ;退出码为0 MOV AH, 31H ;退出时,将(DX)节的主存单元驻留(不释放) INT 21H CODE ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS END START
中断矢量表 中断矢量 说明: (1)中断矢量的获取与设置方法有两种。 (2)驻留与恢复中断矢量如下图所示。 ┇ 操作系统为用户程序分配的程序段前缀(PSP),共100H个字节 用户程序若在中断处理程序前定义了其他段(如数据段、堆栈段等),则在此占用空间 用户编制的中断处理程序占用的空间 用户程序其他部分占用的空间 ┇ 需要驻留的空间 用户程序占用的空间 (3)中断处理程序一般使用主程序的堆栈段。
80x86的三种工作方式 1. 实方式(实际地址) 操作相当于一个可进行32位快速运算的8086(内部32位、外部总线16位数据、20位地址) 2. 保护方式(虚地址) 是80386设计目标全部达到的工作方式,通过对程序使用的存储区采用分段、分页的存储管理机制,达到分级使用互不干扰的保护目的。能为每个任务提供一台虚拟处理器,使每个任务单独执行,快速切换。 3. 虚拟8086方式 保护方式下所提供的同时模拟多个8086处理器。
存储器物理地址的形成 问题的由来 8086的限制,20位地址总线,16位寄存器(SP,BP,SI,DI)。 问题:如何通过16位寄存器访问1MB的内存 解决:将1M字节主存分段,每段最多64K字节
存储器物理地址的形成 实模式 PA = 段寄存器 保存的16位二进制 数后补4个0 + EA
分段的实际作用 分段的实际作用: (1) 实现了16位表示20位的地址; (2) 当程序和数据的大小<64KB时,编制的程序可只关心EA,而不用管它的起始地址在哪(便于程序在主存中任何位置运行) (3) 便于不同目的的程序或数据分开存放,使程序各部分的含义更加明确。
存储器物理地址的形成 保护模式 保护什么: 分清不同程序使用的存储区域,不允许随便使用别人的数据和代码。 必要条件: (1)要标记每段存储区的所有者或被使用的权限级别。 (2)要标记使用者是谁(权限级别)。 (3)中间环节:CPU要去判断此次访问是否合法。
(1) 如何标记存储区 操作系统每次将某块存储区分给某程序使用时,用8个字节的描述符描述这段存储区的特征。
标记程序的信息记录在段寄存器中 程序的权限由程序所在的段决定,由当前程序正在使用的段寄存器内的段选择符反映。
(3)中间执行环节:CPU去判断 例如,执行:MOV AL,DS:[100H] 设: (CS)= 0000000000001 1 11 B, (DS)= 0000000000002 0 01 B, (a)程序权限与被访问数据段的权限的关系; (b)(DS)指向的描述表中寻找描述符;01改11 (c)对应描述符描述的段是否可以被访问;(类别、权限) (d)从描述符2中提取段的首地址(32位); (e)段的首地址(32位)+32位EA(100H)= 线性地址,不分页时即为PA (f)送出PA,选中存储单元,将内容读入AL中。
存储器物理地址的形成 保护方式的实际含义: 程序知道的“段首址”实际上是一个代号,是一个虚拟的起始地址,CPU通过查表转换才能获得真正的段首地址。 在这个由CPU完成的查表转换过程中,实现了访问权限的判断,达到了保护的目的。
问题 问: 给定一个段寄存器的值,它与描述符表中对应的描述符的取值之间是否存在约束关系? (权限有,应该一致) 对于32位CPU而言,给定的段寄存器的值所对应的内存块的位置可能有多少个? (4G个)
特别的一些训练(创新思维) 有下列指令想到的 : LEA EAX,[EBX*8+ECX+21H]
程序多样化实现 将以BUF1为首址的字节存储区的10个字节传送到以BUF2为首址的字节存储区中去。 MOV SI,0 MOV CX,10 LOOPA: MOV AL,BUF1[SI] MOV BUF2[SI],AL INC SI DEC CX JNZ LOOPA
MOV BX,10 LOOPA:DECBX MOV AL,BUF1[BX] MOV BUF2[BX],AL JNZ LOOPA
综合分析 问1: 执行后屏幕上出现乱码,查原因. .386 DATA SEGMENT USE16 STR1 DB ‘How are you!’ DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATA START: MOV DX,OFFSET STR1 MOV AH,9 INT 21H MOV AH,4CH INT 21H CODE ENDS END START
综合分析 问: 执行后现象分析 . .386 DATA SEGMENT USE16 STR1 DB ‘How are you!$’ DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV DI,OFFSET STR1 MOV AH,9 INT 21 MOV AH,4CH INT 21H CODE ENDS END START .