cs_ghuysmans99
Messages postés3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 2013
-
19 mars 2007 à 20:17
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 2014
-
30 mars 2007 à 03:44
bonjour à tous.
j'ai fait un petit prog en asm 32bits pour dos mais il ne fonctionne pas ... reste à savoir pourquoi !!
pourriez-vous m'aider ??
;Change Int19h (write 'Interrupt Disabled!!' on the screen)
Org 100h
Install:
Call Change19H
EndInstall:
Call GoTSR
Change19H:
Mov AH,25H
Mov AL,19H
; Push DX
Mov DX,NewInt19H
Int 21
; Pop DX
Ret
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 19 mars 2007 à 22:42
1-La Fonction 31h demande que DX contienne le nombre de paragraphe à reserver. Or ici DX=0, donc pas de TSR.
2-Lorsqu'elle est exécutée par int 21h, le retour au DOS est immédiat.( Ici l'instruction ret ne sera donc pas exécutée )
3-Dans "change 19h" il faut:
mov dx,offset newint19h. (ici DX contiendra le contenu de newint19h , c'est à dire le code de mov dx,msg).
4-De même il faut: mov dx,offset msg
5-En général, le code d'un TSR doit se disposer de la manière suivante
org 100h
Debut: jmp Install
Newint:
....
iret
Install:
(ici modifier l'interrupt et tout le code qui ne doit s'exécuter qu'au chargement du module)
tsr:
mov dx,offset install
mov cl, 4
shl dx,cl ; conversion en paragraphe,
mov ah,31h
int 21h
end DebutAmicalement<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
CheckInstalled Proc Near
Mov AH,19h
Mov AX,TstFnc
Int 19h
Cmp AH,TstFncR
Je CheckInstalled_OK
Jne CheckInstalled_ERR
Ret
CheckInstalled_OK:
Call DetourneInt
Call GoTSR
CheckInstalled_ERR:
Mov DX,Offset(AiMsg)
Call PrintStr
Int 20h
CheckInstalled EndP
DetourneInt Proc Near
;Détourne l'interrupt
Mov AH,25H
Mov AL,IntDet
Mov DX,Offset(NewInt)
Int 21h
Ret
DetourneInt EndP
GoTSR Proc Near
;Met le programme en TSR
Mov DX,Offset(DynVarsEnd)
Inc DX
Int 27h
Ret
GoTSR EndP
PrintChr Proc Near
;Affiche un chr. à l'écran avec l'int 10h (Al=chr, Bl=couleur, Cx=répet.)
Mov AH,09h
Mov BH,00h
Int 0h
PrintChr EndP
PrintStr Proc Near
;Affiche une chaine de caractères à l'écran (DS:DX)
Mov AH,09h
Int 21h
Ret
PrintStr EndP
;####################################################################
;########################### Entry Point ############################
Main Proc Near
;Entry Point
;Affiche le titre
Mov DX,Offset(CmdMsg)
Call PrintStr
;Call CheckInstalled ;Il va rebooter !!
Call DetourneInt
Call GoTSR
; Ret
Main EndP
;####################################################################
;########################### Dynamics Vars ############################
DynVars: ;Début des vars. dyn.
CmdMsg DB '+------------------------------------+',13,10
DB '¦ Anti-Reboot(AR) Protection ¦',13,10
DB '+------------------------------------+',13,10
DB '$'
AiMsg DB 'Program already installed !','$'
DynVarsEnd: ;Fin des vars dyn.
;####################################################################
;############################ Code Ends #############################
Code Ends
End Start
1A;
PS: j'utilise notepad++ comme éditeur ... il peut éditer n'importe quoi !!
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 28 mars 2007 à 23:36
salut,
je ne suis pas d'accord pour dire que nasm est orienté linux, c'est un des rares assembleur multi-platforme.
ce qui fonctionne avec TASM fonctionne bien evidemment avec NASM, le tout etant de comprendre la synthaxe des deux.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 30 mars 2007 à 03:44
salut,
il faut restorer tout les segments et registres (flags compris) modifiés puis effectuer un jmp far vers l'ancienne routine.
tu peux bien sur pusher segment puis offset de l'ancienne routine puis faire un retf mais je pense que le jmp far est plus efficace.
@++
Vous n’avez pas trouvé la réponse que vous recherchez ?
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 20 mars 2007 à 19:46
Salut
Je me suis mal exprimé : "ici " signifie "dans ton cas" c'est à dire pour mov dx,newint19h
Avec Nasm il faut utiliser: lea dx,newint19h . Lea = Load Effective address
L'allocation de mémoire sous msdos s'opére par paragraphes. Un paragraphe = 16 octets.
Erreur de ma part, il faut shr dx,cl et non pas shl . Shr dx,cl = Shift right dx cl fois. Ce qui revient à diviser dx par16 donc convertir la taille du TSR en paragraphes puisque cl=4.
Qui est-ce qui ne marche pas ? Pour tester ton programme il faut bien sûr exécuter int19h ( une interruption utilisée par le Bios à la fin du POST) Avant de le rendre résident , vérifie son fonctionement. Avec ceci par exemple:
org 100h
debut:
lea dx,newint19
mov al,19h
mov ah,25h
int 21h
int 19h ; exécute int 19h
mov ah,0
int 16h ; attend clavier
mov ah,4ch
int 21h ; exit
newint19:
lea dx,msg
mov ah,9
int 21h
iret
msg db 'succes$'
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 21 mars 2007 à 12:16
Le problème vient de mon ignorance de Nasm. Mille excuses.
En fait pour cet assembleur mov dx,nom charge effectivement dx avec l'offset de nom, pour charger le contenu de nom il faut écrire mov dx,[nom]
Quant à Lea il ne peut être utilisé que si l'adresse est complexe.
Avec Masm et Tasm il existe des directives pour définir le modèle utilisé ce qui n'est pas le cas avec Nasm .
Ton programme suppose que cs et ds sont identiques. Est-ce bien le cas? Sinon il suffit d'ajouter au début push cs , pop ds.
Je me demande si tu ne t'es pas inspiré d'un code rédigé pour Tasm ou Masm en model tiny. C'est ce que j'ai cru à première vue. Je vais télécharger Nasm : on apprend à tout age.
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 22 mars 2007 à 02:34
Nasm est asembleur orienté Linux, il y a quelques différences avec masm et tasm
En enregistrant le code suivant sous le nom int16.asm par exemple, la ligne de commande
nasm -f bin int16.asm -o int16.com
génère un com qui pourra te servir de modèle
bits 16
org 100h
debut:
jmp install
newint19:
push ds ; en principe une interruption doit restaurer tous les régistres utilisés
push cs ; ds= ds de l'appel
pop ds ; ds=cs
mov dx,message
mov ah,9
int 21h
mov ah,1
;
boucle:
int 16h
jz boucle
pop ds
iret
message db 'pressez une touche$'
install:
mov dx,newint19
mov ax,2519h
int 21h
mov dx,install
mov cl,3
shr dx,cl
mov ax,3100h
int 21h
pour le tester:
int19
debug
a
int 19
(ici un retour ligne pour quitter l'assembleur)
g
cs_ghuysmans99
Messages postés3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 29 mars 2007 à 19:20
encore une chose : quand on fait un TSR qui détourne une int. et qui fait du chaînage, comment fait-on avant le RetF ??
Doit-on d'abord empiler le segment ou l'offset ?