vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
31 août 2005 à 15:10
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 2008
-
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 à 10:44
jmp seg:[address] fait un jmp de la valeur near contenue dans seg:[address]
jmp far seg:[address] fait un jmp de la valeur far (seg:offset) contenue dans seg:[address]
en c, tu déclare:
void* address = pFunc;
jmp [address] ira vers pFunc et pas vers address.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 3 sept. 2005 à 11:57
Donc quand on fait jmp far, il prend en opérande l'offset et le segment d'un coup?
Merci pour ta patience, mais ca ne marche toujours pas, je vais abandonner je pense
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 3 sept. 2005 à 16:26
;Apparement les appels BIOS sont plus fiables:
[BITS 16]
[ORG 0x100]
main: ; cs ds es = ss
mov ax,3508h ; recupere le vecteur de l'int 8
int 21h
mov dx,es
mov [pfOldTimer],bx
mov [pfOldTimer+2],dx
lea dx,[myTimer]
mov ax,2508h ; remplace le vecteur de l'int 8
int 21h
xor ax,ax
int 16h
mov ah,4Ch
int 21h
pfOldTimer:
dw myTimer
dw 0
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,0Eh ; teletype output
mov al,'.'
xor bx,bx
int 10h
.1
pushf
push cs
push .ip_
jmp far [pfOldTimer]
.ip_
pop es
pop ds
popa
iret
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 3 sept. 2005 à 16:37
Tu utilise -f bin, c'est pour le model flat. C'est pour cette raison que cs=ds=es=ss?
J'essaie de compiler avec tasm, et il ne connait pas .model flat
Tu sais ce qu'il faut mettre?
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 3 sept. 2005 à 16:53
encore mieux, on remet l'ancien vecteur avant de quitter.
main: ; cs ds es = ss
mov ax,3508h
int 21h
mov dx,es
mov [pfOldTimer],bx
mov [pfOldTimer+2],dx
lea dx,[myTimer]
mov ax,2508h
int 21h
xor ax,ax
int 16h
push ds ; remettre l'ancien vecteur en place
mov ax,[pfOldTimer+2]
mov dx,[pfOldTimer]
mov ds,ax
mov ax,2508h
int 21h
pop ds
mov ah,4Ch
int 21h
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 3 sept. 2005 à 17:33
Le mien ne prend pas flat c'est pour ca que je demande...
Tu utilise une interruption pour modifier le contenu de la table d'interruption? On peut pas faire comme je faisais au début?
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 3 sept. 2005 à 17:50
le -f est juste pour specifier le format de sortie ( ici bin donc binaire )
le model flat doit correspondre plutot au 32bits.
c'est juste pour sortir un .com DOS et ça correspond au model tiny.
tu peux faire comme tu faisait au depart sans probleme, le model tiny impose qu'au depart du programme cs ds es = ss mais apres t'en fait ce que tu veux de ses segments.