2009-05-09 16 views
6

Sistemlerin gerçekten en güzel grafiklerin altında nasıl çalıştığı hakkında daha fazla bilgi almaya çalışıyorum. Bu yüzden şu anda, BIOS'un başlangıçta yüklediği 512baytlık bellekle oynuyorum, tahmin ettiğim anda gerçekten bir bootloader olarak adlandırılamıyorum. Her neyse, bir kesinti vektörünü değiştiriyorum ama onunla ilgili sorunlar yaşıyorum. 09h (klavye) geçişini değiştirdikten sonra, tuşa basıldığında 'Memory messing' tuşuna basılır. Ama sonra hiçbir şey. Her tuş basışından sonra hiçbir şey yapmaz. Benim işleyicisinden şey eksik sistem çökmesini veya eğer bilmiyorum, burada kod:Gerçek Mod, Kesintisiz vektör değiştirme Çöküntüsü

jmp start 
times 100 db 0 ; Cleared space for stack 

start: 
xor ax, ax 
mov ax, start 
sub ax, 80 
mov sp, ax 

mov al, 0x09 ; Interupt number 
mov bl, 4 
mul bl 
mov bx, ax 
xor ax, ax 
mov es, ax 
mov [es:bx], word prints ; My interupt handler 
add bx, 2 
mov [es:bx], word 0x00 

bloader: 
    jmp bloader 

prints: 
    cli 
    push ax 
    push bx 
    push si 
    mov si, msg  ; Message to print 
    mov bl, 0x07 
    mov bh, 0x00 
    printnb: 
     lodsb  ; Grab byte from message 
     cmp al, 0 ; End of message 
     je printf 
     mov ah, 0x0E 
     int 0x10 ; Print byte 
     jmp printnb 
    printf: 
     mov al, 0x20 
     out 0x20, al ; Inform interupt controller interupt has been handled 
     pop si 
     pop bx 
     pop ax 
     sti 
     iret ; Interupt return 

msg db "Memory messing",0 

times 510 - ($ - $$) db 0 
dw 0xAA55 

cevap

6

Klavye kesmeleriyle uğraştığım zamandan beri uzun bir zaman geçti, ama sanırım eksik olan şey klavye donanımını kullanmaktır, böylece kesme koşullarını temizler ve başka bir kesilme oluşturmaya hazır olur. gibi

şey:

  in  al, 60h  ; Read input buffer 

hepsini alır olabilir.

Bir şansım olursa, klavye sürücülerini yazdığımda eski bir notum veya kodun ters çevrilmiş olup olmadığını göreceğim.

+0

cli mov [es:bx], word prints ; My interupt handler mov [es:bx+2], word 0x00 sti 

Bu düzelttim. Bir yük teşekkürler. – Dave

0

Bu yalnızca bir tahmin olmakla birlikte, belki sorun int 10h çağırarak olmasıdır int 9h işleyicisinden. Belleği doğrudan ekrana yazmayı deneyin (sadece 0b800h'de 0 baytını artırın: 0 ve ekranın sol üst karakterini kontrol edin). Her bir tuşa basma için artırılırsa, int 9h'yi int 9h'den çağırmamalısınız.

1

Tahminimce (hiç bir klavye kesme işleyicisi yazmamıştım), tuş vuruşu almak için klavye donanımıyla da konuşmanız gerekir (aksi halde klavye, bir sonraki kesme ne zaman üretileceğini bilmez).

1

Başka bir sorun buldum. İki ayrı hareket komutunu içeren bir ISR için yeni bir kesinti vektörünü ayarlarsak, bu hem mov-komutları arasında bir kesintinin meydana gelmesi ve daha sonra eski konumun bir parçası olan bir kopuk vektörden gelen adresin alınması mümkündür. ISR'nin yeni yerinin diğer kısmı. Ancak bu lokasyonda ISR yoktur, bir interrupt için bir talimat yoktur ve aynı zamanda iret talimatı yoktur.

Böylesine kötü olayları önlemek için, yeni bir kesme vektörünü ayarlamak için bu hareket yönergelerinin etrafına bir kısaltma yerleştirmelisiniz. Dirk