Aktív témák
-
OddMan
őstag
Na sikerült a kivételkezelés is. :DD Most egy TSS-t szeretnék létrehozni, ami nem a 0-ás privilégium szinten futna. A másik dolog, amin most gondolkodom, hogy szeretném az egész progit átírni C-be. Szal az is tele lenne asm betétekkel, de lennének függvények meg struktúrák, használhatnék ciklusokat feltételeket stb.
A kérdésem, hogy szerinted ezt, mibe lehetne megcsinálni? Eddig a Mingw-t és a DJGPP fejlesztő környezeteket nézegettem. Ezekkel lehetne a.out, COFF, ELF formátumú fájlokat készíteni, amiket a GRUB loader képes betölteni. Ennek az lenne az előnye, hogy a GRUB már maga védett módba kapcsolja gépet, és egy csomó információt átadhat az induló kernelnek. Egyébként azt néztem, hogy a GRUB az 1MB fölé teszi a kernelt, tehát fixen be lehetne írni a GDT-be a báziscímeket is. Nem kell számolgatni, hogy éppen hol van a kernel. Aztán C-ben már könnyedén lehetne írni saját függvényeket, amelyek kezelnék a képernyőt, billentyűt, időzítőt stb. :U Nem akarok C könyvtári függvényeket használni, csak magát a C-t, és így egy tényleg szép strukturált kódot lehetne írni, ami tele van assembly-vel, de mégis strukturált ás átlátható. :t -
OddMan
őstag
''Hogyan futtatod? Ugye nem debuggerben?'' :B De, azért nem ment!
A Turbo debugger-ben akartam futtatni azért fagyott le az egész.
Találtam a neten egy teljesen ingyenes dos emulátort a neve DOSBox-0.61 és abban teljesen tökéletesen működik. Egyébként rendes MS-DOS alatt is működik. Létezik egyáltalán olyan debugger, amit lehetne használni? :F
Írtam védett módban egy olyan kiíró rutint, amivel az összes regiszter értékét hexában ki tudom írni a képernyőre. A kérdésem, hogy hogyan kell beállítani az IDT, hogy ha kivétel történik, akkor fusson le ez a kis rutin, hogy lássam hol száll el a program, ha már debuggolni nem tudok. :U -
OddMan
őstag
Nagyon köszi, hogy segítesz.
''Ne tedd 0f0000h-ra a programod, mert ott a BIOS van...''
Szereztem egy valós modú memória térképet, és most már tudom, hogy hova lehet töltögetni.
''A jmp far-t heggeszteni kell:
db 0eah ;ez a jmp far abszolut címre kódja
dw uj_ip,uj_cs
Értelemszerűen, az IP legyen 32 bites, ha 32 bites kód fut.''
Na a nasm-ban a ''jmp dword cs:ip'' 32bit-es és ''jmp word cs:ip'' 16bit-es far ugrás.
Megnéztem az exe-t hexa editorral és úgy néz ki, hogy a nasm jól fordítja le ezeket az utasításokat. Te próbáltad már a nasm-ot? Mert ha mégsem fordítja jól, akkor az álltalad írt gépikód formát fogom használni. Meg gondolom bizonyos esetekben kell a 66h prefix, amikor a szegmens 16bit-es az utasítás meg 32bit-es.
Más:
Azt értem, hogy az lgdt utasításnak fizikai cím kell, de azt már nem, hogyan kell azt megkapni.
mov eax, ds
shl eax, 4 ;ezt nem értem, hogyha 4-el balra léptetem a biteket, akkor mitől lesz az a fizikai címe a DS-nek? :F
add [GDT_ptr+2], eax
lgdt [GDT_ptr] ;Load the GDT
GDT_addr:
;;0. descriptor
NULL_SEL equ $-GDT_addr
dw 0
dw 0
db 0
db 0
db 0
db 0
;;1. descriptor (code segment 1MB 0-nál kezdődik)
CODE16_SEL equ $-GDT_addr
dw 0FFFFh ;a szegmens hosszának alsó wordja (határ)
dw 0 ;a báziscím alsó wordje
db 0 ;a báziscím felső wordjének alsó bájtja
db 10011010b ;P=1, DPL=00, S=1, C/D=1, C/E=0, R/W=1, A=0
db 00001111b ;G=0, D/B=0, AVL=0, reserved=0, határ=1111
db 0 ;a báziscím felső wordjének felső bájtja
;;2. descriptor (data segment 1MB 0-nál kezdődik)
DATA16_SEL equ $-GDT_addr
dw 0FFFFh ;a szegmens hosszának alsó wordja (határ)
dw 0 ;a báziscím alsó wordje
db 0 ;a báziscím felső wordjének alsó bájtja
db 10010010b ;P=1, DPL=00, S=1, C/D=0, C/E=0, R/W=1, A=0
db 00001111b ;G=0, D/B=1, AVL=0, reserved=0, határ=1111
db 0 ;a báziscím felső wordjének felső bájtja
;;3. descriptor (code segment 1MB 0-nál kezdődik)
CODE32_SEL equ $-GDT_addr
dw 0FFFFh ;a szegmens hosszának alsó wordja (határ)
dw 0 ;a báziscím alsó wordje
db 0 ;a báziscím felső wordjének alsó bájtja
db 10011010b ;P=1, DPL=00, S=1, C/D=1, C/E=0, R/W=1, A=0
db 01001111b ;G=0, D/B=1, AVL=0, reserved=0, határ=1111
db 0 ;a báziscím felső wordjének felső bájtja
;;4. descriptor (data segment 1MB 0-nál kezdődik)
DATA32_SEL equ $-GDT_addr
dw 0FFFFh ;a szegmens hosszának alsó wordja (határ)
dw 0 ;a báziscím alsó wordje
db 0 ;a báziscím felső wordjének alsó bájtja
db 10010010b ;P=1, DPL=00, S=1, C/D=0, C/E=0, R/W=1, A=0
db 01001111b ;G=0, D/B=1, AVL=0, reserved=0, határ=1111
db 0 ;a báziscím felső wordjének felső bájtja
;;5. deszkriptor (stack segment 8Kb 200000h-nál kezdődik)
STACK_SEL equ $-GDT_addr
dw 02000h ;a szegmens hosszának alsó wordja (határ)
dw 0 ;a báziscím alsó wordje
db 20h ;a báziscím felső wordjének alsó bájtja
db 10010010b ;P=1, DPL=00, S=1, C/D=0, C/E=0, R/W=1, A=0
db 01000000b ;G=0, D/B=1, AVL=0, reserved=0, határ=0000
db 0 ;a báziscím felső wordjének felső bájtja
;;6. deszkriptor (screen segment 16Kb 0B8000h-nál kezdődik)
SCREEN_SEL equ $-GDT_addr
dw 04000h ;a szegmens hosszának alsó wordja (határ)
dw 08000h ;a báziscím alsó wordje
db 0Bh ;a báziscím felső wordjének alsó bájtja
db 10010010b ;P=1, DPL=00, S=1, C/D=0, C/E=0, R/W=1, A=0
db 01000000b ;G=0, D/B=1, AVL=0, reserved=0, határ=0000
db 0 ;a báziscím felső wordjének felső bájtja
GDT_end:
GDT_ptr:
dw GDT_end-GDT_addr ;GDT mérete
dd GDT_addr ;GDT címe
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
A segmenseim határai csak 1MB, mert úgysem kell egyelőre több.
Egyébként én most kezdetnek egy olyan progit írok, amely dos alatt átkapcsol védett módba majd vissza. Amíg ez nem megy, addig nem megyek tovább.
Előre is köszi a válaszokat. :U
Aktív témák
- Netflix
- Formula-1
- Kertészet, mezőgazdaság topik
- Építő/felújító topik
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- Folyószámla, bankszámla, bankváltás, külföldi kártyahasználat
- Macrodroid
- Arc Raiders
- Gumi és felni topik
- Akciófigyelő: Ajándékokkal érkeztek meg az új Dreame porszívók
- További aktív témák...
- LG 45GS95QX - 45" Ívelt OLED / 2K WQHD / 240Hz 0.03ms / NVIDIA G-Sync / FreeSync Premium / HDMI 2.1
- Lenovo ThinkPad T14 Gen 4 Ryzen 5 PRO 7540U 14" FHD+ 32GB 512GB Lenovo gar: 2028.01.07!
- AKCIÓ! LENOVO ThinkPad P15 Gen2 munkaállomás - i7 11800H 64GB DDR4 1TB SSD RTX A2000 4GB W
- Samsung Galaxy Watch 4 Classic 42mm, GPS, 1 Év Garanciával
- BESZÁMÍTÁS! ASRock A520M R5 4500 8GB DDR4 512GB SSD GTX 1050 Ti 4GB Zalman T3 Plus DeepCool 400W
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
