Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

(ASM) Замена клавиши Esc на Клавишу Enter

30K
26 ноября 2007 года
Dashuta
8 / / 26.11.2007
Пожалуйста помогите написать програмку по Assembler. Написать программу, заменяющую нажатие клавиши Esc на нажатие клавиши Enter, а нажатие клавиши Enter на нажатие клавиши Esc. Очень надо а в Assembler я не шарю плз, заранее благодарна =)
274
26 ноября 2007 года
Lone Wolf
1.3K / / 26.11.2006
А как нужно демонстрировать, что происхолдит замена? или это должен быть резидент?
Если резидент, то вот.
Переделывал со своей лабы на скорую руку. так, что не исключены баги, но вроде работает. Программа резидентная. предусмотрены исключение повторной загрузки, выгрузка....
Код:
.model tiny
        .386
        .code
        org     80h
cmd_len db      ?
cmd_ln  db      ?
     org     100h


start:
      jmp      begin


_entr    db      0dh,1ch
_esc    db     1bh, 01h

hw_reset9:
        retf

hand_int09h  proc    far
        jmp     short act09h
old_int09h      dd      ?
                dw      424bh
                db      00h
        jmp     short hw_reset9
                dd      7 dup (0)
act09h:
        pusha                  
        push    es              
        push    ds              
        in      al,60h
        push    ax
        cmp     al,1ch
        je      common
        cmp     al,01h
        je      common
old:
        pop     ax
        pop     ds
        pop     es
        popa
        jmp     dword ptr cs:old_int09h

common:
        in      al,61h
        push    ax              
        or      al,80h
        out     61h,al
        pop     ax              
        out     61h,al
        push    40h            
        pop     es      
        push    cs
        pop     ds
        pop     ax
        mov     word ptr es:1ah,1eh
        mov     di,1eh
        cmp     al,1ch
        je      mesc
        cmp     al,01h
        je      entr
mesc:
        mov     si,offset _esc
        mov     cx,1
        mov     word ptr es:1ch,20h
        jmp     inpt
entr:
        mov     si,offset _entr
        mov     cx,1
        mov     word ptr es:1ch,20h
        jmp     inpt
inpt:
        movsw    
        loop    inpt
ex_int09h:
        mov     al,20h
        out     20h,al
        pop     ds
        pop     es
        popa
        iret
hand_int09h   endp


hw_reset2d:
        retf
hand_int2dh   proc   far
        jmp     short act_int2dh
old_int2dh      dd      ?
                dw      424dh
                db      00h
        jmp     short hw_reset2d
                db      7 dup (0)
act_int2dh:
        db      80h,0fch
mux_id  db      ?
        je      its_us
        jmp     dword ptr cs:old_int2dh
its_us:
        cmp     al,05
        jae     int2d_no
        cmp     al,03
        je      int2d_no
        cbw
        mov     di,ax
        shl     di,1
        jmp     word ptr cs:jumptable[di]
jumptable       dw      offset int2d_00,offset int2d_no
                dw      offset int2d_02,offset int2d_no
                dw      offset int2d_04,offset int2d_05
int2d_00:
        mov     al,0ffh
        mov     cx,0100h
        push    cs
        pop     dx
        mov     di,offset amis_sign
        iret
int2d_no:
        mov     al,00
        iret
cnt_unld:
        mov     al,1
        iret
int2d_02:
        cli
        push    0
        pop     ds
        mov     ax,cs
        cmp     ax,word ptr ds:[2dh*4+2]
        jne     cnt_unld
        cmp     ax,word ptr ds:[09h*4+2]
        jne     cnt_unld
        push    bx
        push    dx
        mov     ax,2509h
        lds     dx,dword ptr cs:old_int09h
        int     21h
        mov     ax,252dh
        lds     dx,dword ptr cs:old_int2dh
        int     21h

        mov     ah,51h
        int     21h
        mov     word ptr cs:[16h],bx
        pop     dx
        pop     bx
        mov     word ptr cs:[0ch],dx
        mov     word ptr cs:[0ah],bx
        push    cs
        pop     bx
        mov     ah,50h
        int     21h
        mov     ax,4cffh
        int     21h
       
int2d_04:
        mov     dx,cs
        mov     bx,offset hooklist
        iret
int2d_05:
        mov     dx,cs
        mov     bx,offset hotkeys
        iret
hand_int2dh     endp  

amis_sign       db      '_Vadymus'
                db      'Htkey&tm'
                db      'Resident Hotkey caller',0

hooklist        db      09h
                dw      offset  hand_int09h
                db      2dh
                dw      offset  hand_int2dh

hotkeys         db      1
                db      1
                db      20h
                dw      08h
                dw      0
                db      1



begin   proc
                jmp     short beg
prnthlp:
;       mov     byte ptr cmd_ln[2],0
        mov     ah,9
        mov     dx,offset hlpmsg
        int     21h
        ret
dounld:
        inc     ah
        mov     al,2
        mov     dx,cs
        mov     bx,offset ext_pnt
        int     2dh
        push    cs
        pop     ds
        mov     dx,offset otherhook
        mov     ah,9
        int     21h
        ret
ext_pnt:
        push    cs
        pop     ds
        mov     dx,offset succ
        push    0
        mov     ah,9
        int     21h
        ret
err2:
        mov     ah,9
        mov     dx,offset noload
        int     21h
        ret
beg:
        cld
        cmp     byte ptr cmd_len,0h
        je      intal
        cmp     byte ptr cmd_ln[1],'/'
        jne     intal
;       mov     byte ptr cmd_ln[1],0
        cmp     byte ptr cmd_ln[2],'u'
        jne     trhlp
;       mov     byte ptr cmd_ln[2],0
        mov     byte ptr unload,1
        jmp     intal
trhlp:
        cmp     byte ptr cmd_ln[2],'?'
        je      prnthlp

intal:
        mov     ah,9
        mov     dx,offset usmes
        int     21h

        mov     ah,0ffh
_srch:
        mov     al,00h
        int     2dh
        cmp     al,00h
        jne     not_free
        mov     byte ptr mux_ID,ah
        jmp     next
not_free:
        mov     es,dx
        push    cs
        pop     ds
        mov     si,offset amis_sign
        mov     cx,10h
        repe    cmpsb
        jcxz    alrd_ld
next:
        dec     ah
        jnz     _srch
fr_fnd:
        cmp     unload,1
        je      err2
        cmp     mux_ID,0
        je      no_more
        jmp     load    
alrd_ld:
        cmp     unload,1
        je      dounld
        lea     dx,LOADED
        mov     ah,09h
        int     21h
        ret
no_more:
        lea     dx,NOMR
        mov     ah,09h
        int     21h
        ret
load:
        mov     ax,352dh
        int     21h
        mov     word ptr old_int2dh,bx
        mov     word ptr old_int2dh+2,es
        mov     ax,3509h
        int     21h
        mov     word ptr old_int09h,bx
        mov     word ptr old_int09h+2,es
;       mov     byte ptr en_ds,1
        mov     ax,2509h
        mov     dx,offset hand_int09h
        int     21h
        mov     ax,252dh
        mov     dx,offset hand_int2dh
        int     21h
        mov     ah,9
        mov     dx,offset install
        int     21h
        mov     ah,27h
        mov     dx,offset begin
        int     27h
begin  endp

usmes           db      'Resident keys changer for DOS. Ver. 1.0',0dh,0ah
                db      'Run program with /u to uninstall or with /? to see help',0dh,0ah
                db      0dh,0ah
                db      'WARNING: THIS ONLY AN EXPEREMENTAL VERTION',0dh,0ah
                db      'THE AUTHOR GIVES NO GUARANTIES',0dh,0ah
                db      'USE ON YOUR OWN RISK',0dh,0ah
                db      0dh,0ah,'$'

succ            db      'Program has been unloaded successfully',0dh,0ah,'$'

install         db      'Program has been installed successfully',0dh,0ah,'$'

loaded          db      'ERROR: Program is already loaded',0dh,0ah,'$'

otherhook       db      'ERROR: Our interupts have been hooked by another program.',0dh,0ah
                db      'Unload failed',0dh,0ah,'$'

noload          db      'ERROR: Program is not loaded.',0dh,0ah
                db      'Unload failed',0dh,0ah,'$'

nomr            db      'ERROR: Too many residents in memory',0dh,0ah,'$'

hlpmsg          db      'Resident keys changer for DOS. Ver. 1.0',0dh,0ah
                db      'All rights reserved',0dh,0ah
                db      0dh,0ah
                db      'Options:',0dh,0ah
                db      '        /u == uninstall',0dh,0ah
                db      '        /? == this message',0dh,0ah
                db      'WARNING: THIS ONLY AN EXPEREMENTAL VERTION',0dh,0ah
                db      'THE AUTHOR GIVES NO GUARANTIES',0dh,0ah
                db      'USE ON YOUR OWN RISK',0dh,0ah,'$'

unload          db      ?

end start
30K
26 ноября 2007 года
Dashuta
8 / / 26.11.2007
большое спасибо =) Очень помог =) просто надо курсач сдавать 12 декабря а я не знала как прогу написать =(
30K
06 декабря 2007 года
Dashuta
8 / / 26.11.2007
Закомпилировала программу, но при запуске выводится сообщение соглашения, после в cmd при нажатии любой клавиши выводит ошибку "Процессор NTVDM обнаружил недопустимую инструкцию". Клавиши не меняются.

Компилировала так:
tasm.exe /zi Code.asm
tlink.exe /v Code.obj
Может неправильно?
274
06 декабря 2007 года
Lone Wolf
1.3K / / 26.11.2006
угу не правильно. это .com программа. лучше делать так:
tasm code.asm
tlink /t code.obj

если в тасме ключь /zi можно еще и поставить. то в tlink ключь /t - обязателен!!
30K
07 декабря 2007 года
Dashuta
8 / / 26.11.2007
Пасибки всё работает =) буду отчётку писать =)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог