| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 视频教程 | 素材下载 | 程序代码下载 | JS代码 | 论坛 | 
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
用汇编编写DOS下的内存驻留程序(1)
作者:未知    文章来源:网络    点击数:    更新时间:2006-7-19
  nbsp; ;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功能, 就会使前台

上一页  [1] [2] [3] [4] [5] 下一页


相关文章