Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

[SASM] Je bloque sur les interruptions


Sujet :

x86 16-bits Assembleur

  1. #1
    Nouveau Candidat au Club
    [SASM] Je bloque sur les interruptions
    Bonjour à tous,

    Pour un travail d'étudiant, je dois réaliser un petit programme avec SASM.
    Le problème étant que je n'arrive pas à faire fonctionner les interruptions et malgré mais recherches je ne trouve pas de solutions..
    En espérant que vous pourrez m'aider !

    Voici le code:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    %include "io.inc"
     
    section .text
    global CMAIN
    CMAIN: 
        mov ah, 00h
        INT 16h
            cmp al, 's'
                JE Test
        ret
     
    Test:
        PRINT_STRING 's'
        ret


    Le programme bloque vraiment à l'interruption, il refuse de le passer.
    Et ça bloque aussi pour les INT10 et 21.
    (J'ai raccourci le code complet pour aller à l'endroit qui ne marchait pas)

  2. #2
    Expert éminent
    Ben déjà il faut savoir quel plateforme tu vise , tu met ton topic pour la section x86 32/64 bits.

    Mais ton code et ton explication laisse suggérer que c'est du x86 16 bits pour MD-DOS non ?
    Voilà un Hello world simple qui compile avec NASM :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    org 0x0100
     
    mov dx, msg1
    mov ah, 0x9
    int 21h
    ret
     
    msg1: db "Hello World", 10, 13, '$'


    Et voici pour les commande pour le compiler et l’exécuter sur Linux :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    nasm test.asm -o test.com
    dosbox test.com


    PS: inutile de nous préciser ton IDE , tu pourrais utiliser Geany , Notepad++ ou autre que ça serait pareil niveau code.

  3. #3
    Nouveau Candidat au Club
    En effet, c'est du 16 bits, je me suis trompé désolé ^^'.
    Ensuite merci de ta réponse mais je ne demande pas comment faire un "Hello World!" mais bien comment régler un soucis que je rencontre avec les interruptions (INT10, 16 et 21).
    En clair pour résumer, je dois faire une sorte de space invaders donc j'ai besoin de pouvoir déplacer un curseur dans la console malgré que je pense avoir compris la logique, mon code s'arrête tout simplement à l'interruption.
    J'ai repris mon code pour juste tester si c'était l'ensemble de mon code qui avais un problème ou juste au niveau de l'int 16h, et cela donne le code que j'ai partagé.
    Je ne suis pas le seul de ma classe à rencontrer ce problème et c'est pourquoi je me tourne vers un forum, je n'y suis pas forcément habitué d'où le fait que je me sois trompé de section (Encore désolé).
    En espérant avoir un peu mieux expliquer le problème
    (J'ai actuellement moins de 8 heures d'assembleur à mon actif donc veuillez excuser mes lacunes)

  4. #4
    Expert éminent
    Justement je ne vois pas où est le problème , vu que je test ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    org 0x0100
     
    mov ah, 00h
    int 16h
    cmp al, 's'
    jne Test
     
    mov dx, msg1
    mov ah, 0x9
    int 21h
    Test:
    ret
     
    msg1: db "Hello World", 10, 13, '$'

    et j'attends bien une touche et si j’appuie sur S alors le message s'affiche.

    mon code s'arrête tout simplement à l'interruption
    Int 16h avec l'argument ah = 0 attend un événement clavier donc c'est normal.
    peut être que ah = 1 est ce que tu recherche ?

  5. #5
    Membre chevronné
    salut,

    ce programme est utilisé sur une machine virtuelle ? un émulateur ?

  6. #6
    Nouveau Candidat au Club
    @Kannagi :
    Justement, l'interruption clavier se produit si j'appuie sur une touche donc avec un 00h, je récupère la valeur de la touche que j'ai pressé dans le registre AL, non ?
    Je viens de testé avec 01h et ça ne marche pas non plus, il bloque vraiment sur l'int.
    Même en faisant du copier/coller de ton code le problème subsiste..

    @Forthman :
    Non je l'utilise sur ma machine directement, tu penses que cela à un impact et qu'il vaudrait mieux que j'utilise une vm ?

  7. #7
    Expert éminent
    Mon code marche ,je l'ai testé
    Ben sinon tu dois utiliser DosBox pour l’exécuter...

  8. #8
    Membre chevronné
    Sur un os moderne ton code ne peut pas fonctionner.
    Comme le dis Kannagi, tu devrais utiliser dosbox (le plus simple à mon avis) ou un émulateur avec un DOS (pour l'int 21h)