سؤال

وأنا أحاول لمعرفة المزيد حول كيفية أنظمة العمل حقا تحت كل الرسومات جميلة على القمة. لذلك أنا يلعب حاليا مع الذاكرة في 512bytes أن يحمل BIOS عند بدء التشغيل، لا يمكن أن تدعو حقا على محمل في الوقت الحالي أعتقد. على أي حال، أنا استبدال متجه المقاطعة ولكن وجود مشاكل معها. بعد استبدال 09h يقطع (لوحة المفاتيح) أنه يعمل بشكل صحيح، عند الضغط على المفتاح "ذاكرة العبث" وأنتج. ولكن بعد ذلك لا شيء. كل بضغطة بعد ذلك لا يفعل شيئا. أنا لا أعرف إذا كان النظام تحطمها أو إذا أنا في عداد المفقودين شيء من وجهة نظري معالج، وهنا رمز:

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
هل كانت مفيدة؟

المحلول

ولقد كانت فترة طويلة منذ أن عملت على التعامل مع المقاطعات لوحة المفاتيح، ولكن أعتقد أن ما كنت في عداد المفقودين هو في الواقع التعامل مع الأجهزة لوحة المفاتيح لذلك سوف مسح حالة المقاطعة وتكون على استعداد لتوليد يقاطع آخر.

وشيء من هذا القبيل:

         in     al, 60h     ; Read input buffer 

قد يكون كل ما يتطلبه الأمر.

إذا أحصل على فرصة سوف نرى ما اذا كان لديك أي ملاحظات أو رمز القديمة حول الكذب من طريق العودة عندما كتبت السائقين لوحة المفاتيح.

نصائح أخرى

وتخميني (لقد كتبت أبدا معالج لوحة المفاتيح المقاطعة) هو أن تحتاج أيضا لاجراء محادثات مع الأجهزة لوحة المفاتيح، لاسترداد المفاتيح (وإلا فإن لوحة المفاتيح لا يعرف متى لتوليد مقاطعة القادمة).

ولقد وجدت مشكلة أخرى. إذا وضعنا متجه المقاطعة جديد لISR مع اثنين منفصلة التحرك تعليمات، فمن الممكن أن بين هذا حد سواء تعليمات وسائل التحقق مقاطعة يحدث ومن ثم الحصول على عنوان من ناقلات كسر مع جزء واحد من الموقع القديم و جزء آخر من الموقع الجديد للISR. ولكن على هذا الموقع ليس هناك ISR، أي تعليمات لEND من المقاطعة، وكذلك أي تعليمات IRET.

لمنع مثل هذه الأحداث السيئة لدينا لوضع المبادرة القطرية والأمراض المنقولة جنسيا حول هذه التعليمات خطوة لوضع متجه المقاطعة الجديدة.

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

وديرك

وهذه ليست سوى تخمين البرية، ولكن ربما المشكلة هي أنك تدعو 10H كثافة من معالج الباحث 9H. محاولة الكتابة إلى ذاكرة الشاشة مباشرة (فقط زيادة البايت في 0b800h: 0 وتحقق لأعلى الطابع اليسار على الشاشة). إذا كان يحصل على زيادة لكل بضغطة، ثم لا يجب استدعاء الباحث 10H من 9H كثافة العمليات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top