【原创】DOS下TSR程序的汇编演示代码1--自动按键程序

简介: 【原创】DOS下TSR程序的汇编演示代码1--自动按键程序

喜欢在DOS下用QE.EXE来阅读文本文件,自已按键手痛。于是写了个自动向键盘缓冲区放UP

和DOWN键值的程序。

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

; 文件名: AutoKey.asm

; 功  能: 自动向键盘缓冲区填充RIGHT 或 DOWN 键值 来移动光标

;           Ctrl + Tab         停止填充

;           Ctrl + →         填充RIGHT 键值

;           Ctrl + ↓         填充DOWN  键值

;           Ctrl + ↑          提高填充速度

;           Ctrl + ←         降低填充速度

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

;         2. 适用于QE.EXE 和 TC.EXE, 不适于 EDIT.COM

;         3. 改进方向:

;              A 在屏幕右上角显示当前速度

;              B 填充RIGHT 键值时能自动换行

; 开发环境: IBM PC 486, MSDOS7.0(mswin95), MASM生成

; Log

; -----------------------------------------------------------------------

; 2003.02.24    Created, but the result is exception!

; 2003.02.25    

OK!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
cseg segment
;==============================
org 100h
assume es: cseg, ss: cseg
assume cs: cseg, ds: cseg
UP      EQU     48h
Left    EQU     4bh
RIGHT   EQU     4dh
DOWN    EQU     50h
Ctrl    EQU     04h
Alt     EQU     08h
EndKey  EQU     4fh
Tab     EQU     0Fh
AddKey  EQU     0dh
DecKey  EQU     0ch
RightDelay    equ     10
DownDelay     equ     100
;-----------------------------
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
       FillKey   db    0
       time      dw    0
       AutoKey   label   word
                 db      00
       KeyCode   db      RIGHT
       VarLen    equ   $ - Old1cAddr
;---------------
new09h  proc    far
       sti
       push    ax
       push    bx
       push    ds
       mov     ax, 0040h
       mov     ds, ax
       mov     bh, ds:[017h]
       push    cs
       pop     ds
       test    bh, Ctrl
       jz      @old09
       in      al, 60h
       cmp     al, Tab ;EndKey
       jne     @right
       mov     FillKey, 0
       mov     KeyCode, 0
       jmp     @Old09
@right:
       cmp     al, RIGHT
       jnz     @down
       mov     byte ptr KeyCode, RIGHT
       mov     time, RightDelay
       jmp     @AutoON
@down:
       cmp     al, DOWN
       jnz     @up
       mov     byte ptr KeyCode, DOWN
       mov     time, DownDelay
       jmp     @AutoON
@up:
       cmp     al, UP
       jnz     @left
       cmp     word ptr time, 1
       je      @Old09
       dec     time
       jmp     @ClrCount  ;jmp     @Old09
@left:
       cmp     al, LEFT
       jnz     @Old09
       cmp     word ptr time, 0ffffh
       je      @Old09
       inc     time
       ;jmp     @ClrCount
@AutoON:
       mov     FillKey, 1
@ClrCount:
       mov     count, 0
@Old09:
       pop     ds
       pop     bx
       pop     ax
       jmp     cs:Old09Addr
new09h  endp
new1ch  proc    far
       cmp     byte ptr cs:FillKey, 1
       jne     @Old1c
       push    ds
       push    cs
       pop     ds
       inc     count
       mov     ax, time
       cmp     ax, count
       jne     n1c
       mov     count, 0
       push    ax
       push    bx
       mov     ax, 0040h
       mov     ds, ax
       cli
       mov     bx, word ptr ds:[001ch]
       mov     ax, cs: AutoKey
       mov     [bx], ax
       inc     bx
       inc     bx
       cmp     bx, 003eh
       jnz     @NoTail
       mov     bx, 001eh
@NoTail:
       mov     ax, bx
       mov     bx, 001ch
       mov     [bx], ax
       sti
       pop     bx
       pop     ax
n1c:
       pop     ds
@Old1c:
       jmp cs:Old1cAddr
new1ch  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, "AutoKey installed!$"
       strMsgUninstall db 07h, "AutoKey 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 架构下实现高效的加法函数,展示了如何运用这些技巧编写出既高效又可靠的汇编代码,充分展现了汇编语言的独特魅力及其在现代软件开发中的价值。
40 0
|
2月前
|
Windows
【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序
【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序
|
3月前
|
NoSQL 前端开发 程序员
【震撼揭秘!】程序员绝不会告诉你的秘密:掌握汇编语言调试,轻松从软件故障中全身而退——透视代码底层,成为Bug猎人!
【8月更文挑战第31天】《调试的艺术:如何利用汇编语言追踪和解决软件问题》探讨了使用汇编语言进行高效调试的方法。无论是初学者还是资深开发者,面对棘手的 bug 时,高级语言的信息往往不足。文章通过具体示例展示如何通过汇编代码定位问题,如 C 语言中数组求和函数的崩溃问题。借助 `gcc -S` 生成的汇编代码和 GDB 调试器,可以深入理解程序行为,从而更准确地解决问题。掌握这一技能,将使你在复杂问题面前更加从容。
40 2
|
3月前
|
C语言
51单片机汇编语言流水灯代码
51单片机汇编语言流水灯代码
|
3月前
|
C# 开发者 图形学
Xamarin 竟在游戏开发领域大胆探索,跨平台优势与强大功能结合,开启游戏开发新潮流!
【8月更文挑战第31天】《Xamarin在游戏开发领域的探索》介绍了Xamarin作为跨平台开发框架,在移动游戏开发中的应用。它利用C#语言的优势,提供高效的开发体验,并结合各平台图形库实现高质量画面。本文还展示了Xamarin如何简化游戏逻辑处理、支持多线程编程及与Unity等工具集成,提升游戏质量和开发效率。此外,Xamarin还支持热更新和多平台发布,进一步优化游戏维护流程。
39 0
|
6月前
|
Java C++
如何在JAVA代码中嵌入汇编
如何在JAVA代码中嵌入汇编
94 1