Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Modifer le vecteur d'interruptions [ Archives / Forum general 80xxx ] (vecchio56)

mercredi 31 août 2005 à 15:10:05 | Modifer le vecteur d'interruptions

vecchio56

Administrateur CodeS-SourceS
Bonjour
J'essaie de refaire la source http://www.cppfrance.com/code.aspx?ID=33558 en assembleur (ca consiste à modifier la routine de l'interruption 08h). Le problème est que programme se termine aussitôt après avoir été lancé.
Voici mon code:

.model small
.stack

.data
oldTimerSegment   DW     ?
oldTimerOffset    DW     ?

.code

; place la valeur de ds dans le code pour pouvoir le récupérer
; dans myTimer
DataSegment       DW     ?

myTimer:
  push  ax bx dx

  mov   ah, 2
  mov   dl, '.'
  int   21h

  mov   ax, DataSegment
  mov   es, ax
  mov   ax, es:oldTimerSegment
  mov   bx, es:oldTimerOffset

  mov   es, ax
  call  es:[bx]
  pop   dx bx ax
  iret

main:
  mov   ax, @data
  mov   ds, ax
  mov   DataSegment, ax

  ; Modification du vecteur d'interruptions
  xor   ax, ax
  mov   es, ax
  mov   bx, 20h    ; 8*4=20h

  ; premier mot: offset de la procédure
  mov   ax, es:[bx]
  mov   oldTimerOffset, ax
  mov   ax, offset myTimer
  mov   es:[bx], ax

  ; deuxième mot: valeur de segment de code
  mov   dx, es:[bx+2]
  mov   oldTimerSegment, dx
  mov   ax, cs
  mov   es:[bx+2], ax

  ; attend l'appui d'un touche
  mov   ah, 1
  int   21h

  mov   ah, 4Ch
  int   21h

  end main

mercredi 31 août 2005 à 19:08:20 | Re : Modifer le vecteur d'interruptions

vecchio56

Administrateur CodeS-SourceS
J'ai modifié plusieurs choses mais j'y arrive toujours pas. Mon programme se comporte différemment: des fois il plante, des fois il affiche des pointes puis il s'arrête, des fois il se termine tout de suite...

.model small
.stack

.data
oldTimerSegment   DW     ?
oldTimerOffset    DW     ?

.code

; place la valeur de ds dans le code pour pouvoir le récupérer
; dans myTimer
DataSegment       DW     ?
compteur          DW     0

myTimer:
  push  ax ds es

  ; simule un int: empile flags, cs et ip
  pushf
  push  cs
  push  offset ip_

  mov   ds, DataSegment
  inc   compteur
  cmp   compteur, 18
  jne   noReset
  mov   compteur, 0
  mov   ah, 2
  mov   dl, '.'
  int   21h
noReset:

  mov   ax, oldTimerSegment
  mov   es, ax

ip_:
  jmp   es:oldTimerOffset      ; appel de la routine par défaut

  pop   es ds ax
  iret


main:
  mov   ax, @data
  mov   ds, ax
  mov   DataSegment, ax

  ; Modification du vecteur d'interruptions
  xor   ax, ax
  mov   es, ax
  mov   bx, 20h    ; 8*4=20h


  mov   ax, es:[bx]
  mov   oldTimerOffset, ax
  mov   dx, es:[bx+2]
  mov   oldTimerSegment, dx


  mov   ax, offset myTimer
  mov   dx, cs
  cli
  mov   es:[bx], ax
  mov   es:[bx+2], dx
  sti

  mov   ah, 1
  int   21h

  mov   ah, 4Ch
  int   21h

  end main

jeudi 1 septembre 2005 à 10:42:11 | Re : Modifer le vecteur d'interruptions

patatalo

Membre Club Administrateur CodeS-SourceS
salut,

il faut que ton programme reste resident

@++

jeudi 1 septembre 2005 à 11:17:12 | Re : Modifer le vecteur d'interruptions
jeudi 1 septembre 2005 à 11:36:15 | Re : Modifer le vecteur d'interruptions

patatalo

Membre Club Administrateur CodeS-SourceS

re,

quand tu finis un programme avec la fonction 4C de l'int 21h, cela veut dire que ton programme doit etre déchargé de la memoire. La memoire ainsi libérée est utilisée pour un autre programme.

tu dois rendre ton programme résident ( il doit rester en mémoire ) je crois que c'est l'int 27h qui fait ça ( dx prends le nombres de paragraphes ).

lors du déchargement de ton programme, n'oublie pas de remettre le vecteur d'interruption vers la bonne addresse.

@++


jeudi 1 septembre 2005 à 11:42:23 | Re : Modifer le vecteur d'interruptions

vecchio56

Administrateur CodeS-SourceS
mov   ah, 1
int   21h

Ca attend l'appui d'une touche sur le clavier, donc normalement mon programme va rester résident. Il y a donc un problème ailleurs

A quoi ca sert de remettre la bonne adresse à la fin, puisque mon programme se termine?

jeudi 1 septembre 2005 à 12:08:39 | Re : Modifer le vecteur d'interruptions

patatalo

Membre Club Administrateur CodeS-SourceS
re,

je serais toi, je mettrais plutot une boucle infinie pour test.

qui prouve que le le programme ne chope pas un caractere qui traine dans STDIN dès l'execution ? ( fait un flush du buffer avant la demande )

@++

jeudi 1 septembre 2005 à 12:12:24 | Re : Modifer le vecteur d'interruptions

vecchio56

Administrateur CodeS-SourceS
Une boucle infinie ca prend un peu trop de cpu a mon gout. Quand je change pas l'interruption, le programme attend toujours l'appui... Tu sais comment on fait un flush en asm?
Au fait je suis sous XP, donc en mode virtuel et pas en mode réel, donc la table d'interruption n'appartient qu'a mon programme, non?

jeudi 1 septembre 2005 à 12:39:33 | Re : Modifer le vecteur d'interruptions

patatalo

Membre Club Administrateur CodeS-SourceS

c'est pas le genre de truc que je ferais tourner sous XP.
le code myTimer me parait aussi louche ( simule int ? )
voilà un exemple de TSR ( le 16 bits, ça fait longtemps que j'en fais plus que pour les secteurs de boot )
[ Lien ]


jeudi 1 septembre 2005 à 12:51:43 | Re : Modifer le vecteur d'interruptions

vecchio56

Administrateur CodeS-SourceS
J'appelle une routine d'interruption, mais comme elle va dépiler cs, il faut que je l'empile avant
Merci pour le lien et pour ton aide


1 2 3 4

Cette discussion est classé dans : code, mov, ax, bx, dx


Répondre à ce message

Sujets en rapport avec ce message

rs232 [ par TRAX44 ] salut,tout premièrement je sais qu'il ya des exemples sur le site!mais mon problème est autre je tiens à comprendre pourquoi mon code ne fonctionne pa pb int 21h ah=0ah [ par mat74 ] salut a ts ,voila j'ai fais un programme qui est censé lire une chaine entré par l'utilisateur et ensuite la reafficher . Il me demande bien d'entré u petit probleme de debutant [ par freekc ] j'essaie de faire un ptit prog que lorsque l'on rentre son nom prenom etc . Il y est un recapitulatif qui se mette en dessous ms lorsque que le recapi Ennoncés à corriger svp :-) [ par did2604 ] Bonjour à tous,Mon professeur m'a demandé de convertir les énoncés (en langage C) suivants en assembleur, quelqu'un aurait-il la gentilesse de me les loader problème de code [ par TRAX44 ] salut tout le monde !!g essayer de faire un loader (petit prog qui charge un autre prog) mais c un desartre je comprend pas très bien ce qui ne marche pb affichage console [ par mat74 ] voila je cherche a faire un prog qui affiche 0 ou 1 en fonction de la valeur de ax . et le teste est ds une procedure . mais il y a un pb le prog n'af Multiplication de deux nombres compris entre 0 et 99 en assembleur [ par petitspirou ] salut, j'ai un programme a faire mais je suis nul en assembleur, voici ce que j'ai fais mais ca ne fonctionne pas.Quelqun peut'il me le corriger et me Conversion hexa vers ascii [ par Cygace ] Bonjour voici un code asm qui convertit un nombre binaire vers de l'ascii. Mais je dois modifiier ce code pour qu'il convertisse de l'hexadecimal vers Affichage [ par AMENO ] Cher amis aidez moi, c'est une partie de mon examen de noel. et je suis bloquerenfin il 'sagit d'un programme que l'on doit entrer jsuqu a 32 caracter


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,328 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.