【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序

简介: 【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序

windows提供了屏幕保护程序,当我们在规定的时间内没有对电脑进行操作时,系统会自动运行我们事先指定的屏幕保护程序。

下面我们在DOS实现一个简单的黑屏保护程序。

注意:

1。如果你运行了明伦五笔高手速成,那么本程序将不起作用,可能的原因是明伦五笔高手速成修改了有关的DOS中断,而没有回调。

2。如果想在window 95/98的MS-DOS方式下使用,应将MS-DOS方式窗口设为全屏。

3。win 2000/xp未作测试。

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; 文件名: SafeScr.asm

; 功  能: 在指定时间内未使用键盘则关闭屏幕显示(黑屏)

; 说  明:

;          1. 第一次运行时常驻内存,再次运行则撤出内存

;          2.如果你运行了明伦五笔高手速成,那么本程序将不起作用,

;             可能的原因是明伦五笔高手速成修改了;有关的DOS中断,而没有回调。

2。如果想在window 95/98的MS-DOS方式下使用,应将MS-DOS方式窗口设为全屏。

3。win 2000/xp未作测试。; Log

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

;Name     : 

;Function : ;Author   : Purple Endurer

;Reference: Computer paper 1996U243, Software 1993 P114

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


cseg    segment

        assume cs: cseg,  ds: cseg

        org 100h

start:  jmp @Init

        ;====================

        Old1cAddr label dword

        Old1cOff  dw    ?

        Old1cSeg  dw    ?

        Old09Addr label dword

        Old09Off  dw    ?

        Old09Seg  dw    ?

        mcb_evb   dw    ?       ; mcb: Memmory Control Block

        mcb_psp   dw    ?

        show      dw    1

        count     dw    0

        VarLen    equ   $ - Old1cAddr

        time      equ   1000


;///

 new1ch proc far

;///

        ;sti

        push ax

        push bx

        inc cs:[count]

        ;mov ax, cs: [time]

        cmp cs:[count], time

        jne @New1chEnd

        mov bl, 36h

        mov ax, 1201h

        int 10h

        mov cs:[count], 0

        mov cs:[show],  0

@New1chEnd:

        pop bx

        pop ax

        jmp cs:Old1cAddr

new1ch endp


;///

new09h proc far

        ;sti

        push ax

        push bx

        cmp cs:[show], 1h

        je  @New09hEnd

        mov cs:[show], 0h

        mov bl, 36h

        mov ax, 1200h

        int 10h

@New09hEnd:

        mov cs:[count], 0

        pop bx

        pop ax

        jmp cs:Old09Addr

new09h endp

;///


@Init:

        mov ax, 3509h           ; Get current 1ch interrupt vector

        int 21h


        cmp bx, offset new09h   ; Has been Intalled?

        jnz @install            ; No install


        mov  dx, offset strMsgUninstall

        mov  ah, 09h

        int  21h


        mov  bx, 1ch * 04h      ; Restore old 1ch interrupt vector

        xor  ax, ax             ; to System interrupt vector talbe

        mov  ds, ax

        mov  ax, es:[Old1cOff]

        mov  ds:[bx], ax

        mov  ax, es:[Old1cSeg]

        mov  ds:[bx+2], ax


        mov  bx, 09h * 04h      ; Restore old 09h interrupt vector

        mov  ax, es:[Old09Off]  ; to System interrupt vector talbe

        ;xor  ax, ax            

        ;mov  ds, ax            ; ds must equal 0

        mov  ds:[bx], ax        

        mov  ax, es:[Old09Seg]

        mov  ds:[bx+2], ax


        mov  bx, 1              ; Release evirenment parameter block

        mov  ax, es:[mcb_evb]

        mov  ds, ax

        mov  word ptr ds:[bx], 0


        mov  ax, es:[mcb_psp]    ; Release TSR

        mov  ds, ax

        mov  word ptr ds:[bx], 0

        mov  ax, 4c00h

        int  21h


@install:

        ;mov  ax, 3509h         ; Get current 1ch interrupt vector

        ;int  21h

        mov  Old09Seg, es       ; Store current 09h interrupt vector

        mov  Old09Off, bx


        mov  dx, offset new09h  ; Set new 09h interrupt vector

        mov  ax, 2509h

        int  21h


        mov  ax, 351ch          ; Get current 1ch interrupt vector

        int  21h

        mov  Old1cSeg, es       ; Store current 1ch interrupt vector

        mov  Old1cOff, bx


        mov  dx, offset new1ch  ; Set new 1ch interrupt vector

        mov  ax, 251ch

        int  21h


        mov  dx, offset strMsgInstall

        mov  ah, 09h

        int  21h


        ; Store the address of evirenment parameter block

        mov  ax, cs

        dec  ax

        mov  [mcb_psp], ax      ;mov  cs:[mcb_psp], ax

        mov  bx, 2ch

        mov  ax, [bx]           ;mov  ax, cs:[bx]

        dec  ax

        mov  cs:[mcb_evb], ax


        mov dx, offset @Init

        add dx, VarLen + 2

        mov cl, 04h

        shr dx, cl

        mov ax, 3100h

        int 21h

        ;====================

        strMsgInstall   db 07h, "Screensafer installed!$"

        strMsgUninstall db 07h, "Screensafer uninstalled!$"

cseg ends

        end start


相关文章
|
6月前
|
IDE Java 开发工具
在DOS环境下调试Java程序
在DOS环境下调试Java程序
64 1
|
11月前
|
编译器 Linux C语言
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)(上)
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)
|
2月前
|
网络协议 C++
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
|
3月前
|
存储 算法 程序员
神秘代码世界惊现高效秘籍!究竟是什么让汇编语言编程如此强大?快来一探究竟!
【8月更文挑战第31天】《代码之美:探索高效汇编语言编程的最佳实践》介绍了汇编语言在系统内核、嵌入式系统及高性能应用中的不可替代作用。书中强调了深入理解处理器架构、提升代码可读性、优化算法与数据结构及有效利用寄存器等最佳实践的重要性。通过具体示例,如在 x86 架构下实现高效的加法函数,展示了如何运用这些技巧编写出既高效又可靠的汇编代码,充分展现了汇编语言的独特魅力及其在现代软件开发中的价值。
45 0
【原创】DOS下TSR程序的汇编演示代码1--自动按键程序
【原创】DOS下TSR程序的汇编演示代码1--自动按键程序
|
3月前
|
NoSQL 前端开发 程序员
【震撼揭秘!】程序员绝不会告诉你的秘密:掌握汇编语言调试,轻松从软件故障中全身而退——透视代码底层,成为Bug猎人!
【8月更文挑战第31天】《调试的艺术:如何利用汇编语言追踪和解决软件问题》探讨了使用汇编语言进行高效调试的方法。无论是初学者还是资深开发者,面对棘手的 bug 时,高级语言的信息往往不足。文章通过具体示例展示如何通过汇编代码定位问题,如 C 语言中数组求和函数的崩溃问题。借助 `gcc -S` 生成的汇编代码和 GDB 调试器,可以深入理解程序行为,从而更准确地解决问题。掌握这一技能,将使你在复杂问题面前更加从容。
41 2
|
3月前
|
C语言
51单片机汇编语言流水灯代码
51单片机汇编语言流水灯代码
|
3月前
|
C# 开发者 图形学
Xamarin 竟在游戏开发领域大胆探索,跨平台优势与强大功能结合,开启游戏开发新潮流!
【8月更文挑战第31天】《Xamarin在游戏开发领域的探索》介绍了Xamarin作为跨平台开发框架,在移动游戏开发中的应用。它利用C#语言的优势,提供高效的开发体验,并结合各平台图形库实现高质量画面。本文还展示了Xamarin如何简化游戏逻辑处理、支持多线程编程及与Unity等工具集成,提升游戏质量和开发效率。此外,Xamarin还支持热更新和多平台发布,进一步优化游戏维护流程。
41 0
|
6月前
|
Java C++
如何在JAVA代码中嵌入汇编
如何在JAVA代码中嵌入汇编
97 1