Assembler - Rezidentny program

Programovacie jazyky, rady, poradňa...
Anti
Expert
Expert
Príspevky: 187
Registrovaný: 16 feb 2006, 18:04

Assembler - Rezidentny program

Príspevok od používateľa Anti »

Snazim sa napisat rezidentny program, ktory obsadi INT 5 (PrtScr) ale nefunguje to.. mam v tom trosku zmazok.. mohol by sa na to niekto prosim pozriet?

Kód: Vybrať všetko

bits 16
org 0x0100

[SEGMENT .text]

; ---------------------
; |  REZIDENTNA CAST   |
; ---------------------

  jmp START                     

NOVA_OBSLUHA:
  push ax
  push dx
  push cx
  mov ah, $2b                                     
  mov cx, 1999
  mov dh, 1
  mov dl, 1     
  int 21h                                         ; zmenime cas 
  pop cx
  pop dx
  pop ax
  jmp far [cs:int_x05_offset]                     ; a predame riadenie povodnej obsluhe
;END NOVA_OBSLUHA

; -----------------------
; |  NEREZIDENTNA CAST   |
; -----------------------

START:
  call SETUP                                      ; nastavime premenne a vektory
  mov ah, 31h                                     ; fcia 31h - stay resident
  mov dx, START                                   ; offset konca rezidentnej casti
  shr dx, 4                                       ; delime 16 - rozdelime na paragrafy
  inc dx                                          ; pre istotu pripocitame jednotku
  int 21h                                         ; ukonci program a ostan rezidentny     
;END START

SETUP:
  cli
  xor ax, ax
  mov es, ax                                      ; segment tabulky vektorov je 0 
  mov ax, [es:0x5*4]                              ; 
  mov word [int_x05_offset], ax                   ; offsetova adresa stareho perusenia
  mov ax, [es:(0x5*4)+2]                          ;
  mov word [int_x05_segment], ax                  ; segmentova adresa stareho prerusenia
  
  mov ax, NOVA_OBSLUHA                            ; offsetova adresa novej obsluhy prerusenia
  mov [es:int_x05_offset], ax                     ; 
  mov ax, cs                                      ; segmentova adresa novej obsluhy prerusenia
  mov [es:int_x05_segment], ax                    ;
  sti
  ret  
;END SETUP

[SEGMENT .data]
     
int_x05_offset        dw    ''
int_x05_segment       dw    ''
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Nie je chyba v tomto?

Kód: Vybrať všetko

  mov ax, NOVA_OBSLUHA                            ; offsetova adresa novej obsluhy prerusenia
  mov [es:0x5*4], ax                     ;
  mov ax, cs                                      ; segmentova adresa novej obsluhy prerusenia
  mov [es:(0x5*4)+2], ax                    ;
Anti
Expert
Expert
Príspevky: 187
Registrovaný: 16 feb 2006, 18:04

Príspevok od používateľa Anti »

skusal som aj bez tych premennych, ale stale to nejde..
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Tá chyba, čo som ti písal ja spôsobovala to, že si neprepísal odkaz na tvoju obsluhu prerušenia (len si prepísal uložené hodnoty) a teda sa tá tvoja obsluha ani nevolala.
Anti
Expert
Expert
Príspevky: 187
Registrovaný: 16 feb 2006, 18:04

Príspevok od používateľa Anti »

este raz sa pozri na moj zdrojak v prvom prispevku :) asi si prehliadol es
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Myslíš si, že es:int_x05_offset je správna adresa? (v pamäti prepisuješ úplne náhodné miesto)
Anti
Expert
Expert
Príspevky: 187
Registrovaný: 16 feb 2006, 18:04

Príspevok od používateľa Anti »

preco nahodne? ved do premennej si predsa ulozim vypocitany offset 05h*4 a spolu s es=0 to ukazuje presne na offsetovu adresu INT 5
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

es:int_x05_offset znamená, že sa použije segment ES a ako offset sa použije offset toho int_x05_offset (nepoužije sa obsah premennej, použije sa adresa). mov [es:0x5*4], ax robí to, čo sa robiť má.
Napísať odpoveď