2015-12-20 2 views
-2

J'apprends le langage d'assemblage dans masm. Je l'ai lu sur les interruptions et ont développé le code suivant pour la pratique:Le programme cesse de fonctionner en utilisant des interruptions

INCLUDE IRVINE32.INC 
    .data 
    plate byte "_" 
    counter dword 0 
    ppos byte 60 
    p byte 15 
    .code 
    main PROC 
    call clrscr 
    mov ecx,1000 
    mov al, plate 
    mov dl, 60 
    mov dh, 15 
    call gotoxy 
    call writechar 
    L1: 
     mov dh, 0 
     mov dl, 0 
     call gotoxy 
     inc counter 
     mov eax, counter 
     call writeint 
     mov dl, ppos 
     mov dh, p 
     call gotoxy 
     call updateplate 
     call writeplate 
     mov eax, 2000 
     call delay 
     loop L1 

    exit 
    main endp 
    writeplate PROC 
     mov al, plate 
     call writechar 
     ret 
    writeplate ENDP 

    updateplate proc 
     mov ah, 01h 
     int 16h 
     jz quit 
     mov ah, 00h 
     int 16h 
     pressed: 
      cmp al, 65 
      je left 
      cmp al, 97 
      je left 
      cmp al, 68 
      je right 
      cmp al, 100 
      je right 
      left: 
       dec ppos 
       jmp quit 
      right: 
       inc ppos 
       jmp quit 
     quit: 

     ret 
    updateplate endp 
    end main 

Mais le problème est à chaque fois que je lance le code de l'invite de commande indique que le programme a cessé de fonctionner avant que je puisse vérifier si les interruptions fonctionnent correctement . Quelqu'un peut-il aider s'il vous plaît?

+0

Quelle est la dernière instruction exécutée avant sa fermeture? – Jason

+0

Avez-vous un programme Windows 32 bits ("INCLUDE IRVINE32.INC") ou un programme BIOS 16 bits ("int 16h")? Vous ne pouvez pas mélanger les deux! Je suppose que vous utilisez un Windows 64 bits qui n'exécutent pas un programme 16 bits ou ne permettent pas un accès d'interruption ("int 16"). – rkhb

+0

La dernière instruction est int 16h à partir de la procédure updateplate –

Répondre

0

Attendez une touche juste avant de quitter. Cela vous donne une chance de voir l'écran de sortie.

loop L1 

    mov ah, 00h 
    int 16h 

exit 
main endp