Nowe posty

xx Problem z Linux Lite po instalacji (1)
Dzisiaj o 15:19:31
xx Dystrybucja pod HP Omen (7)
Dzisiaj o 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: Przerwanie - segmentation fault  (Przeczytany 4863 razy)

  • Gość
Przerwanie - segmentation fault
« dnia: 2010-02-13, 15:44:10 »
Hmm... ponieważ przerwanie systemowe w miare znam, postanowiłem spróbować nauczyć się obsługiwać przerwania sprzętowe.
Program miał  w zamierzaniu podać czy był naciśnięty klawisz czy nie

Na podstawie danych z ralf'a brown:

--------B-1601-------------------------------

INT 16 - KEYBOARD - CHECK FOR KEYSTROKE

   AH = 01h

Return: ZF set if no keystroke available

   ZF clear if keystroke available

       AH = BIOS scan code

       AL = ASCII character

Note:   if a keystroke is present, it is not removed from the keyboard buffer;

     however, any extended keystrokes which are not compatible with 83/84-

     key keyboards are removed by IBM and most fully-compatible BIOSes in

     the process of checking whether a non-extended keystroke is available

   some (older) clone BIOSes do not discard extended keystrokes and manage

     function AH=00h and AH=10h the same

   the K3PLUS v6.00+ INT 16 BIOS replacement doesn't discard extended

     keystrokes (same as with functions 10h and 20h), but will always

     translate prefix E0h to 00h. This allows old programs to use extended

     keystrokes and should not cause compatibility problems

SeeAlso: AH=00h,AH=11h,AH=21h,INT 18/AH=01h,INT 09,INT 15/AH=4Fh
napisałem taki program niestety wysypuje się... na instrukcji int 16h

section .text

global _start

_start:

mov ah, 01h
int 16h

pushfd
pop eax

shr eax, 6
and eax, 0x00000001
cmp eax, 0
je nie_ma

jmp short _end

_end:

mov eax, 1
xor ebx, ebx
int 80h

nie_ma:
pushad
mov eax, 4
mov ebx, 1
mov ecx, nie
mov edx, nie_dl
int 80h
popad
ret

section .data
tak db "Jest klawisz w buforze",10,0
tak_dl equ $-tak
nie db "Nie ma klawisza w buforze", 10, 0
nie_dl equ $-nie

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Przerwanie - segmentation fault
« Odpowiedź #1 dnia: 2010-02-13, 20:13:39 »
Pomijając fakt, że Ci się systemy operacyjne hm... pozajączkowały, to BIOS jako żywo nie pracuje w chronionym trybie 32/64 bitowym, tylko w rzeczywistym 16-bitowym... I jako mający dostęp do sprzętu nie może działać w żadnym trybie chronionym natywnie - ewentualnie w jakimś trybie emulacji, typu VM86 z nadzorcą udającym dostęp do sprzętu...

Zresztą pomyśl - po to się chłopaki pałują z atrybutami ochrony/zabezpieczenia plików, użytkownikami, grupami, żeby się jakiś łoś przez INT 13h od d*py strony do dysku dobrał? Albo BIOS albo kernel, wybór należy do Ciebie.

Dostęp do sprzętu masz możliwy z poziomu modułów jądra - popatrz na kod źródłowy modułu dostępu do klawiatury PS/2, tam jest to, co potrzebujesz.

PS. Tak, wiem, że są thunki i trampoliny do wywołania kodu x bitowego z kodu y bitowego, ale nie o to chodzi.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy