vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
31 août 2005 à 15:10
cs_Nasman -
5 sept. 2005 à 09:39
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 ?
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 3 sept. 2005 à 14:02
[BITS 16]
[ORG 0x100]
main: ; cs ds es = ss
mov word [compteur],0
mov ax,3508h
int 21h
mov dx,es
mov [pfOldTimer], bx
mov [pfOldTimer+2], dx
lea dx,[myTimer]
mov ax,2508h
int 21h
.1
mov ah, 1
int 21h
cmp al,'q'
je .1
cmp al,'Q'
jne .1
mov ah, 4Ch
int 21h
pfOldTimer:
dw 0
dw myTimer
compteur:
dw 0
myTimer:
pusha
push ds
push es
mov ax,cs
mov ds,ax
mov es,ax
inc word [compteur]
cmp word [compteur],18
jne .1
mov word [compteur],0
mov ah,2
mov dl,'.'
int 21h
.1
pushf
push cs
push .ip_
jmp far [pfOldTimer]
.ip_
pop es
pop ds
popa
iret
; nasmw -f bin hookint.asm -o hookint.com
; bizarrement, windows XP signale parfois une erreur ?
; j'ai été obligé de mettre la touche 'Q' en particulier car a l'appel de la fonction 2
; provoquait l'arret du programme.
; d'ailleur la fonction 2 devait modifier un registre non sauvegardé ( d'ou pusha )
; j'ai modifier le changement de vecteur par des appels DOS mais le tien doit
; etre bon
;@++
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 31 août 2005 à 19:08
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_
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 1 sept. 2005 à 11:36
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.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 1 sept. 2005 à 12:12
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?
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 1 sept. 2005 à 12:39
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 )
http://www.geocities.com/SiliconValley/2072/asm.htm
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 1 sept. 2005 à 13:01
j'ai regardé le source cpp et c'est a mon avis une mauvaise idée.
pour avoir l'heure/minute/seconde, il faut lire les registres CMOS et pas compter 18 appels pour 1 seconde car la valeur exacte et 18,2 ce qui donne une horloge fausse.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 2 sept. 2005 à 10:51
Visiblement ca ne change rien de mettre cs: devant DataSegment (il me sort le même executable)
Pour _ip je savais pas si on mettait avant ou après, de toutes facons ca foire dans les 2 cas
Merci quand même
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 2 sept. 2005 à 11:25
ça foirera tant que tu n'auras pas réglé tout les bugs.
peut etre que l'assembleur a déjà spécifié cs vu que dans .code
le _ip doit etre derriere.
au fait, le .stack, faut pas lui reserver un peu de place ?
.stack
dw 100h dup(?)
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 2 sept. 2005 à 11:51
Je veux bien régler mes bugs, seulement j'arrive pas à les trouver! Si tu en vois tu peux me dire :)
Pour la pile j'ai jamais réservé de cette facon, et j'ai jamais eu de problème
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 2 sept. 2005 à 13:08
ah? Je connais pas, il me manque quelques notions on dirait. Mais oldTimerOffset qu'est ce qu'on en fait? C'est important quand même, il faut pas qu'il saute au début du segment...