- 浏览: 2060545 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (1409)
- asp/asp.net学习 (241)
- oracle (10)
- delphi (295)
- java (27)
- pb (1)
- 每日点滴 (49)
- 学习方法 (40)
- 思想方面 (104)
- C语言 (5)
- C++ (1)
- 代码重构经验 (5)
- 软件工程 (3)
- 数据库 (99)
- 英语学习 (3)
- mysql (1)
- 该关注的网站或者网页 (42)
- 总结 (7)
- 要去做的事情 (33)
- 算法 (1)
- 网络方面 (29)
- 随感 (96)
- 操作系统 (36)
- UML (12)
- 常用工具的使用 (55)
- 脚本 (7)
- 汇编 (62)
- 数据结构 (2)
- 财务 (38)
- 语文作文 (16)
- 法律 (1)
- 股票 (88)
最新评论
-
devwang_com:
可以,学习了~~
列出文件夹下所有文件夹的树形结构--Dos命令 tree的使用 -
hvang1988:
不管用啊 frxrprt1.PreviewForm.Pare ...
fastReport预览时嵌入到别的窗体 -
00915132:
我也有这个疑问,非常 感 谢
left join加上where条件的困惑 --SQL优化 -
zhuyoulong:
学习了,高效读书
软件架构师要读的书 -
nTalgar:
非常感谢分享!
Application.ProcessMessages用法:
转自:http://www.x86asm.com/DisplayArticle.asp?BoardID=5&ArticleID=10
绪言
0.1 内存驻留与中断
内存驻留程序英文叫Terminate and Stay Resident Program,缩写为TSR.这些程序加载进内存,执行完后,就驻留在内存里,当满足条件时,调到前台来执行。
内存驻留程序的常用形式有:
>诸如Borland 的SideKick弹出式实用程序
>日历系统
>网络服务器
>通讯程序
>本地的DOS扩展(如CCDOS,UCDOS等中文系统都属于这个范畴)
>一些可恶的人利用TSR技术制作很多可恶的病毒程序,几乎所有的病毒程序都是TSR程序.
就象多任务系统调度一个进程有一个调度程序一样,在PC中从前台程序进入到一个TSR,也要有一个调度者,只是PC操作系统的调度不称为调度程序,而只称为触发机制.触发机制调度TSR执行在PC机上党称为激活一个TSR.触发机制主要有以下几种:
>硬件中断:党用的是键盘中断INT 9H,时钟中断INT 8H,通讯中断INT 14H,磁盘中断INT 13H等等.
>软件中断:党用的是键盘中断INT 16H,时钟中断INT 1CH,DOS中断INT 21H,等等.
>以上各种的结合.
从以上的触发机制可以看出,TSR和PC机的中断系统有着密切的关系.每种激活方式实际上都是与中断有关的.常用特殊的击键序列的识别码是通过截获INT 9H和INT 16H来实现.实际上不管TSR程序的哪一个环节,都与中断有着密切的关系.因此在具体进行TSR和程序设计之前,先介绍PC中断系统.在此只作简单说明.
在PC机内存的最低端(0000H开始)的1K字节中,存放着256个指针即常说的中为向量或中断矢量(Interrupt vertor),每个中断向量都指向一个子程序,该程序称为中断处理程序(Interrup handler).一个中断向量由四个字节组成,有一个字是中断处理程序的偏移量值,后一个字是中断处理程序的段值.256中断向量一起称为中断向量表.
手式计算中断向量的首址,可通过以下的公式来求得:
X号中断向量的首址=0000H:X*4
当产生一个中断时,处理器都按顺序执行以下步骤:
>在堆栈上压入处理器的标志(相当于指令PUSHF).
>在堆栈上压入当前CS和IP值(相当于指令PUSH CS和PUSH IP).
>关闭中断(CLI)
>从中断向量加载的CS和IP,执行中断处理程序.
当执行完中断处理程序后,一般用IRET返回,它的作用是:
>从堆栈上取出保存的IP和CS(相当于指令POP CS和PUSH CS).
>同时恢复中断前的处理器标志(相当于指令POPF).
中断有多种分类,由触发的原因和实现的性质来分,可分为硬件中断和软件中断,从操作系统分层实现来说,可以分成BIOS中断,BOS中断和用户中断.
一方面,BIOS和DOS通过中断系统向用户提供一个操作系统功能界面.也就是说用户(一般来说是前台程序)的功能主要是通过调用DOS和BIOS的中断服务来实现的,具体来说就是通过INT指令来实现的.另一方面,BIOS和DOS由中断系统所构成,BIOS对硬件成为高层的功能,并通过中断的形式向用户提供.
如果在当前程序执行的同时,能将一块代码放在内存,把中断向量指向代码中的子程序,那么在当前程序执行中产生中断时,就有可能执行不属于当前程序和操作系统的代码,产生的中断可能是当前程序产生的软件中断,也可能是由硬件产生的硬件中断.这就是单任务的PC操作系统可能执行多于一个进程的简单说明.
在PC中断系统中有几个中断具有周期性,即INT 8H,INT 1CH和INT 28H.它们或者周期性被执行用于时间计时,或者周期性产生用于等待.它们是在实现TSR时进行轮询触发的基础.键盘中断(INT 9H和INT 16H)当用户击键时发生,利用它们是进行热键处理的基础.串行口通讯也是触发的一个重要机制.此外众多的软件中断也是触发的媒介.
0.2 DOS的可重入性分析
一个多任务操作系统之所以能使多个进行并存,是因为操作系统的大部分代码是可以了重的,对于临界资源有相应的PV操作,使得当调度一个新的进程时,能完整地保存前一个里程的现场,当再一次调度被挂起的进程时能象没有被中断一样继续执行.
对于PC机来说,代码的重入性比较弱,对临界资源没有PC操作.当我们用中断程序启动用户的TSR时,如果只保存标志和寄存器,以及当前进程一些信息,那么只保存了当前程序的一部分现场,DOS的临界资源不会自动保存.在进行TSR设计时,一定要了解PC操作系统的重入性和临界资源.
重入性总是体现在代码上,所谓可重入代码的指这样的代码,即该代码被执行时还没有从中退出,由于某种原因又一次或者多次进入相同的代码,该代码每次的执行结果都是正确的,就说该代码是可重入的.相反,如果结果不正确,那么就就该代码是不可重入的.下面是一个可重入的子程序的例子:
Add proc near
cmp DS:word ptr [si],0
je DonotAddTheValue
add ax,DS:word ptr [si]
DonotAddTheValue:
ret
Add endp
上面的例子不管在其中任何一处再一次执行该子程序,执行结果不变.为了说明,只举多种可能性中的一种.
mov ds,0100h ;ds=0100h
mov si,0010h ;si=0010h
mov ax,0001h ;ax,=0001h
call Add
cmp 0100h:word ptr [0010h],0 ;Call Add subroutine
push ds ;Interrupted
push si
push ax
mov ds,0200h ;ds=0200h
mov si,0200h ;si=0020h
mov ax,0003h ;ax=0003h
call Add
cmp 0200h:word ptr [0020h],0 ;0200:0020h=0004h
jne
add ax,0200h:word ptr [0020h] ;ax=0007h
ret ;Return
pop ax ;ax=0001h
pop si ;si=0010h
pop ds ;ds=0100h
iret ;Return to Add subroutine
jne
add ax,0100h:word ptr [0100h] ;ax= 0001h
;0100h:0010h= 0002h
;----------------------------------------
;ax = 0003h
ret
mov bx,ax
而下面的子程序是不可重入的:
Add proc near
mov Temp,ax
mov ax,DS:word ptr [si]
cmp ax,0
je DonotTheValue
add ax,Temp
DonotTheValue:
ret
Temp:
dw 0
Add endp
可以利用检查可重入子程序的方法检查这个子程序的不可重入性,尝试一下在" mov ax,DS:word ptr [si]"指令后再次执行该子程序,那么就会出第一次调用返回的结果不对.
mov ds,0100h ;ds=0100h
mov si,0010h ;si=0010h
mov ax,0001h ;ax,=0001h
call Add
mov Temp,ax ;Call Add subroutine
;Temp=0001h
mov ax,0100h:word ptr [0010h] ;0100h:0010h=0002h
;ax=2
push ds ;Interrupted
push si
push ax
mov ds,0200h ;ds=0200h
mov si,0020h ;si=0020h
mov ax,0003h ;ax=0003h
call Add
mov Temp,ax ;Temp=0003h
mov ax,0200h:word ptr [0020h] ;0200h:0020h=0004h
cmp ax,0 ;ax=0004h
jne ;Not equal ,add
add ax,Temp ;ax=0007h
ret ;Return to the interrupted point
pop ax ;ax=0002h
pop si ;si=0010h
pop ds ;ds=0100h
iret ;Return to Add subroutine
cmp ax,0 ;ax=2
jne ;No equal,add
add ax,Temp ;ax =0002h
;0100h:0010h =0003h
;----------------------------------------
;ax =0005h
ret
mov bx,ax
上面执行的结果是AX=5,实上正确的结果应该是AX=3,这是由于当Add子程序从中断子程序再一次被调用时,修改了Temp的值,当从中断返回时不能正确恢复其值.
解决的方法是把Temp放在堆栈中,当每次Add子程序被调用时Temp的地址都不一样,因此原调用的Temp值不会被第二次在中断中调用的Add所破坏.
Add proc near
push bp ;Store BP
sub sp,2 ;distribute a byte space in the stack
mov bp,sp ;SS:BP point to the stack head
temp equ SS:word ptr [BP+0] ;Explain the pointer to SS:BP
mov Temp,ax
mov ax,DS:word ptr [si]
cmp ax,0
je DonotAddTheValue
add ax,Temp
DonotAddTheValue:
add sp,2 ;Release the dsitributed space in the stack
pop bp ;Restore BP
ret
Add endp
对于DOS来说,DOS的内存数据就象Temp变量,它被分配在数据区,而不在堆栈上,因此DOS从总体上是不可重入的.从最后的一个例子看来.重入性跟堆栈有很大的关系.可重入代码允许在任何时候被中断,其所有的变量都存放在该代码的私有堆栈中.DOS是一个单任务的操作系统,在执行INT 21H的代码时是不允许中断DOS,并再次调用INT 21H的.每个时该最多有一个进程在调用DOS的代码.
对DOS的重入性,以及相应所作的处理总结如下:
>当通过INT 21H调用DOS时,DOS会使三个内部栈之一:I/O栈,磁盘栈和辅助栈.功能00H到处0CH使用I/O栈,除了不致命错误处理程 序以外使用磁盘栈,致命错误处理程序使用辅助栈.在这种栈切换模式下,如果前台处在INT 22H中,而TSR调用了使用相同栈的DOS功能, 就会使前台程序保存栈中的数据被TSR的数据覆盖掉;但如果调用不同栈的DOS功能,那将是安全的.INT 21H中的几个功能调即33H,50H, 51H,62H,和64H由于非常简单,使用用户栈,因此在任何情况下都是可重入的.避免这种不可重入的简单方法是当前台程序正处在INT 21H 中时,不要调用INT 21H.或者如果前台程序正在处理INT 21H时,只允许调用不同栈的INT 21H功能.
>DOS数据区中有一个InDOS标志,也探源为DOS安全标志,表示当前访问DOS功能是来否安全.由于DOS不可重入,它指示当前是 否处于DOS中,激活TSR和代码可检查该标志(34H),如果DOS忙,则不能激活使用INT 21H 调用的TSR.
>当前台程序执行能设置错误状态的DOS功能时,DOS会把扩展错误信息存放起来,正常情况下,前台程序可以读取扩展错误信息; 如果在前台程序读取信息之前激活TSR,且TSR也执行能报告错误信息的DOS功能,则后来的错误信息会覆盖原来的错误信息,前台程序就 会得不到正确的错误信息.因此必须在激活TSR之前保存(59H)这些错误信息,并在退出以前把它们恢复(5D0AH)成原来的值.
>大多硬件中断如INT 13H,INT 0BH和INT 0CH等都是不可重往返.如果设置一引起寄存器,而在此时被TSR打断,执行类似的设置 ,就会出现非常情况,端口是不会自动保持值的.在进入这些中断时设置一个进入的标志,如果TSR检查到标志已置,则不调用相应的中断.
>最好也不要重入INT 10H,INT 25H,和INT 26H中断.在进入这些中断时设置一个进入的标志,如果TSR检查到标志已置,则不调用 相应的中断.
>最好能接管INT 1BH,INT 23H和INT 24H中断.
>保存DOS的数据交换区(SDA)可以安全地使用的DOS的功能.SDA保存了DOS几乎所有内部数据,如果保存(5D06H)和恢复(5D0BH)SDA ,DOS就变成在任何时候都可以重入的了.当DOS处在关键区中时,调用INT 2AH.一旦处在关键区中,就不能改变SDA.在关键区的结束处会 调用INT21H的81H和82H功能.
0.3 内存驻留程序设计一般过程
驻留程序分成两个部分,即暂驻部分和驻留部分.驻留程序要完成安装检测,激活和删除等过程.
基本上可抽象成以下几个过程:
>取中断向量
>保存旧的中断向量
>设置或恢复中断向量
>中断处理程序的链接
>检测是来呀已驻留
>执行终止并驻留
>TSR的删除
删除TSR比较复杂,必须按下列步骤进行:
>检查中断向量是否已经被替换.如果没有替换,就恢复所有的中断向量;如果某个中断向量被替换,则跳过下面各步,不能删除该 TSR.
>TSR的PSP中偏移量16H存放着父进程的PSP.把这个值改为当前进程的地址.
>把当前PSP设为TSR的PSP
>执行INT 21H的4CH功能,释放TSR占用的内存,关闭所有文件,并使用PSP中存放的父进程地址和终止地址.
>这里控制返回到初始进程中,当前PSP也指向初始进程,所有寄存器值包括SS和SP都不确定.
在执行完上述步骤后,要恢复寄存器.
如果要无条件地删除TSR,必须监控每个TSR对中断向量表,内存控制块和设备驱动程序链的修改.
0.5 缩写语表
ASCIZ: 以零结束的ASCII字符串.
BPD: "BIOS Parameter Block (BIOS 参数块)"的缩写.含有对驱动器的低级参数的说明.
CDS: "Current Directory Structure(当前目录结构)"的缩写,含有某个逻辑驱动器的当前目录,类型和其它信息.
DPB: "DOS Drive Parameter Block(DOS驱动器参数块)"的缩写,含有某个逻辑驱动器的介质说明及一些内部信息.
DPL: "DOS Parameter List (DOS参数表)"的缩写,该数据结构用来传递参数给SHARE和网络功能调用.
DTA: "Disk Transfer Address(磁盘传输地址)"的缩写,指示对磁盘进行数据读写的功能调用不必显式地给出缓冲区地址.
FAT: "File Allocation Table(文件分配表)"的缩写,磁盘的文件分配表记录了所使用的簇信息.
FCB: "File Control Block(文件控制块)"的缩写,在DOS的1.X版本中,用FCB来记录文件打开的状态..
IFS: "Installable File System(可安装的文件系统)"的缩写,它允许一个非DOS格式的介质被DOS所使用. 大多数情况下IFS 与网络驱动器非常相似,尽管IFS最典型的情况是一个本地驱动器而不是一个远程驱动器.
JFT: "Job File Table(工作文件表)或Open File Table(打开文件表)"的缩写,程序PSP中的JFT可用来将文件句柄转换成SFT值.
NCB: "Network control Block(网络控制块)"的缩写.NCB可用传递对NETBIOS的请求和接受来自NETBIOS处理程序的状态信息.
PSP: "Porgram Segment Prefix(程序段前缀)"的缩写.当程序被装入时,PSP为一个预留的256字节的数据区它包含了程序调用时 的命令行内容和一些DOS的内部信息.
SDA: "DOS Swappable Data Area (DOS对换数据区)"的缩写.SDA中包含有DOS内部使用的记录某个正在处理的功能调用状态的 所有变量.
SFT: "System File Table(系统文件表)"的缩写,SFT是一个DOS内部数据结构,在DOS 2+版本的句柄功能调用中用于管理某个已打 开文件的状态,这就和在DOS1.X中,FCB管理已打开文件状态一样.
发表评论
-
用汇编写的病毒代码
2010-05-29 08:04 1898转自:http://www.programfan.com ... -
堆和栈(堆栈)的区别
2010-05-20 16:47 866转自:http://www.360doc.com/sho ... -
OllyDBG 入门系列(三)-函数参考
2010-05-06 14:07 1390转自:http://bbs.pediy.com/s ... -
OllyDBG 入门系列(二)-字串参考
2010-05-05 19:02 1142转自:http://bbs.pediy.com/s ... -
用汇编编写DOS下的内存驻留程序(5)
2010-05-05 11:05 1022转自:http://www.x86asm.com/Dis ... -
用汇编编写DOS下的内存驻留程序(4)
2010-05-05 11:04 1169转自:http://www.x86asm.com/Displa ... -
用汇编编写DOS下的内存驻留程序(3)
2010-05-05 11:03 896转自:http://www.x86asm. ... -
用汇编编写DOS下的内存驻留程序(2)
2010-05-05 11:02 767转自:http://www.x86asm. ... -
补码 左移与右移 32位系统
2010-05-02 11:04 2796QQ:797801 计算机中 ... -
c语言控制语句对应的汇编语句代码
2010-04-29 18:15 2253转:http://blog.csdn.net/ ... -
调试windows程序
2010-03-21 10:11 814debug 只能支持1M的寻址 如果需要调 ... -
ds:[bp+2]
2009-11-28 13:22 907mov ax,0 mov ds ... -
程序的起始地址的段地址
2009-11-26 09:38 1325生成EXE之后用Debug加载后,查看寄存器内容如下: ... -
将内存FFFF:0--FFFF:b单元中的数据复制到0:200--0:20b单元中
2009-10-25 21:13 1677该程序的功能: 将内存FFFF:0--FF ... -
标志寄存器
2009-10-25 18:46 999方便记忆 OF 溢出(是/否) ... -
安全的一段内存空间 0:2000~0:02FF
2009-10-25 18:20 950看到120页了 我们要向内存里写东西 ... -
显示红心的汇编代码
2009-10-25 18:05 923assume cs:code code segment ... -
debug时 遇到loop 指令
2009-10-25 17:35 901debug时 遇到loop 指令 用 p指 ... -
Loop的使用
2009-10-23 21:06 1216看到107页了 王爽汇编第五章 Loop的使用 ... -
王爽汇编的第四章的一个小例子--待验证
2009-10-20 21:02 1171第四章的一些总结: 1. DOS系统是单任 ...
相关推荐
### 汇编语言下DOS内存驻留程序设计概览 #### 1. 内存驻留程序(TSR)概念解析 内存驻留程序,全称“Terminate and Stay Resident Program”(TSR),是一种在计算机系统中加载至内存、执行完毕后并不释放其占用的内存...
文件"用汇编编写DOS下的内存驻留程序.doc"可能会提供更具体的技术实现和示例代码,这对于深入理解这个主题非常有帮助。 总之,用汇编编写DOS下的内存驻留程序是一个对系统级编程有深入了解的过程。它涉及到汇编语言...
在这个模块中,我们使用dos下的中断函数和内存驻留函数来设置中断和内存驻留程序。 三、程序流程图 下面是屏保程序的流程图: 1. 初始化程序 2. 图形录入 3. 动画绘制 4. 非工作状态计时 5. 检测键盘输入 6. 中断...
通过这些文件,我们可以了解到这是一套使用汇编语言编写的内存驻留程序,可能涉及到键盘输入处理、中断服务以及程序自身的管理和激活机制。学习这些源代码可以帮助理解如何在DOS环境下有效地利用有限的内存资源,...
本文将深入探讨一个用汇编语言实现的常驻内存时钟程序,这个程序可以在计算机运行时持续显示当前时间,无需用户交互。 首先,让我们了解汇编语言的基础。汇编语言中的每条指令都对应于计算机硬件的特定机器码,...
本篇文章将深入探讨一个由汇编语言编写的时钟小程序,这个程序巧妙地利用了DOS中断,并且具有彩色显示功能,是作者为期末作业精心创作的作品。 首先,我们来理解汇编语言。汇编语言是一种符号化的机器语言,每个...
本课程设计报告的主要目的是设计和实现一个DOS下屏保程序,使用汇编语言编写该程序。该程序的主要功能是绘制屏保图形、计时、检测键盘输入和设置中断等。 汇编语言课程设计 汇编语言是一种低级编程语言,它直接...
标题中的“TSR程序作出DOS下的屏幕保护程序”指的是在DOS操作系统环境下,通过创建一个常驻系统内存(Terminable and Stay Resident, TSR)程序来实现屏幕保护功能的技术。这种程序可以在用户离开计算机或者一段时间...
在DOS环境中,开发者通常会使用汇编语言编写这样的程序,因为它们对内存管理和中断处理有更精细的控制。 **TSR程序的实现步骤** 1. **初始化**:TSR程序首先会进行一些基本的初始化工作,如分配内存、设置中断向量...
1. **用“*”画菱形框测量任意程序的运行时间**:这个任务要求学生利用汇编语言在屏幕上绘制菱形框,并同时测量程序的运行时间。菱形框需具备特定颜色和尺寸,由用户输入。这需要学生掌握屏幕输出控制、循环结构和...
第一部分是基础部分,以8086/8088为背景,以DOS和PC兼容机为软硬件平台,以MASM和TASM为汇编器,介绍汇编语言的有关概念,讲解汇编语言程序设计技术。第二部分是提高部分,以80386为背景,以新一代微处理器Pentium为...
用汇编语言(8086/DOS)实现一个显示系统时间的程序,运行时,在屏幕的右上角将显示本机系统的日期及时间,可以应用到其它适用环境中,实现其日期、时间自动更新显示功能。 知识点6:程序设计的步骤 设计的步骤包括...
`PLAY.ASM`可能是该程序的源代码,用汇编语言编写,这种低级语言直接对应机器指令,对于理解程序的工作原理非常有用。 在使用该音乐播放器时,有以下几个关键步骤: 1. **运行驻留内存的PLAY**:首先,用户需要在...
### DOS功能调用符与Debug程序调试详解 在学习计算机编程的过程中,特别是针对早期操作系统如DOS的理解,掌握DOS功能调用符...对于汇编语言学习者而言,熟练掌握这两方面知识对于理解和编写DOS下的应用程序至关重要。
- **简介**:本章介绍了如何使用汇编语言编写名为MACLIST的程序,该程序主要用于增强现有应用程序的功能。 - **功能介绍**: - 从键盘获取输入。 - 定位磁盘上的目录和文件。 - 对内存中的文件进行排序。 - 将...
实现这一步骤的必要性在于:一旦中断服务程序驻留内存后,一般程序员使用这一新增的中断调用就如同调用DOS或BIOS的中断子程序一样,只要了解其入口要求和返回参数就可调用。程序驻留在内存后,它占用的存储区就不会...
这个程序需要驻留在内存中,并在屏幕上固定位置(如右上角)显示时钟,同时不影响其他程序运行。利用INT 1CH中断服务程序,每0.05秒更新一次时间显示,获取系统实时钟信息。 5. **画网格线**: 程序需根据用户...
6. 内存管理:DOS在有限的内存资源下进行了有效的管理,如使用分配器(ALLOC.S)来分配内存,释放器(FREE.S)来回收内存。同时,通过扩展内存管理器(EMS和XMS)来利用扩展内存。 7. 多任务和并发:尽管DOS本身并...