;===================affichage du message "appuyer sur Entree"=======================
GOTOXY 30, 20 ; le curseur se rend au coordonnees 30,20
jmp start
msg: db "Appuyez sur Entree", 0Dh,0Ah, 24h
start:
mov dx, msg ; charge l'offset du message dans dx
mov ah, 09h ; fonction d'affichage 9.
int 21h ; on utilise l'interruption 21h pour afficher les
; caractere a l'ecran
GOTOXY 30, 20 ; le curseur se rend au coordonnees 30,20
jmp effStart
effmsg : db " ", 0Dh,0Ah, 24h
effStart:
mov dx, effmsg ; charge l'offset du message dans dx
mov ah, 09h ; fonction d'affichage 9.
int 21h ; on utilise l'interruption 21h pour afficher les
; caractere a l'ecran
recup :
mov ah, 01h ; permet de recupere une frappe clavier
int 16h ; attente de la touche
cmp al, 13 ; on compare la valeur de al a celle de la touche
; entrer qui correspond au caractere ASCii 13
je finProg ; si egal fin du programme
jmp boucle ; boucle sur la fonction boucle
ENDP
finProg: ; fin du programme
en meme temps que celui-ci :
;initialisation de la memoire video
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 24 sept. 2010 à 09:18
salut,
Du multiprocesseur en mode réel, chaud bouillant. Les 2 codes ne pourront s'executer que simultanément en donnant seulement l'impression de tourner en même temps.
J'ai déjà vu des codes sur le net pour faire du multitâche en mode réel sous DOS. Par contre, je ne suis pas du tout sûr que l'on puisse utiliser plusieurs processeurs.
HirOinEvOl
Messages postés15Date d'inscriptionjeudi 3 juillet 2008StatutMembreDernière intervention13 octobre 2010 24 sept. 2010 à 09:25
arf c'est chiant. Jdois faire une animation en asm alors si je peut pas exécuter plusieurs actions en même temps, je peut faire comment pour afficher plusieurs choses différentes à l'écran ?
(c'est un programme de rattrapage pour des 1ère année de Supinfo hein...) si c'est chaud comme ca et beh.*
Mais chez moi j'ai un quad-core alors peut etre que ca passe mais bon jdois l'uploader sur une platforme supinfo donc eux si ils ont des bécanes pourries ca sert a rien.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 24 sept. 2010 à 09:26
re,
Oups, j'avais mal lu. Utilise le Timer 0 (interruption 8 ou 1Ch des vecteurs du mode réel) en le surchargeant. Par defaut, le temps entre chaque interruption est de 18 ms en gros.
A chaque interruption, tu sauvegardes les registres d'execution courant et tu restaures ceux de l'execution suivante. Tu retournes sur le code a executer avec un iret, retf ou jmp far, suivant ton implémentation.
HirOinEvOl
Messages postés15Date d'inscriptionjeudi 3 juillet 2008StatutMembreDernière intervention13 octobre 2010 24 sept. 2010 à 10:03
j'ai trouvé ca sur le net
IT 8 : tic horloge (timer) appelé toutes les 55 ms (18,2 fois/s.). Elle sert par exemple à arrêter
le moteur de l'unité de disquette lorsque aucun accès à la disquette n'est exécuté. Cette interruption
08H, après avoir lancé le programme correspondant, appelle l'interruption 1CH. Cette dernière ne
contient qu'un retour IRET afin de permettre aux programmeurs d'implanter leurs propres
programmes d'interruption (objectifs : programmation concurrente, multitâche,....)
je le code comme ca en gros : non ?
org 100h
; 1er prog ici non ??
mov ah, 08h
iret mon prog ; la je met mon 2eme prog ??
ret
Hook_int8:
; quand une interruption survient, les registres cs:ip et flags se retrouvent dans la pile.
pop Save_context[Current_context].ip
pop Save_context[Current_context].cs
pop Save_context[Current_context].flags
mov Save_context[Current_context].ax,ax
...
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 24 sept. 2010 à 18:40
re,
chaque thread devra avoir obligatoirement sa propre pile. Il faudra la mettre a jour avant de pusher les nouvelles valeurs dans le hook de l'interruption 8.
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 27 sept. 2010 à 23:46
Salut
Il me semble qu'il y a une solution plus simple qu'utiliser les interruptions. Les procédures sont tout indiquées pour ce genre de problème.
Mais ce que tu appelles procédure n'en est pas : il manque l'instruction ret
Il suffit d'écrire, par exemple :
Rebond1:
Call clavier
?
;ici ton code pour déplacer le curseur
?
jmp rebond1
proc clavier
; afficher un message
; a-t-on pressé une touche ?
; si oui exécuter le code prévu
; sinon :
HirOinEvOl
Messages postés15Date d'inscriptionjeudi 3 juillet 2008StatutMembreDernière intervention13 octobre 2010 13 oct. 2010 à 13:16
Bonjour,
je n'arrive pas a faire fonctionner ton code... comment doit-on déclarer la pile stack_code2 car lors de la compilation il m'indique que cela est un mauvais paramètre.
include "emu8086.inc" ; on inclu la bibliotheque pour pouvoir utiliser
; des fonctions deja pretes.
org 100h
Old_int8:
dw 0,0 ; cs:ip vers ancien vecteur.
Current_context:
dw 0 ; bascule code 0, code 1
reg_sp:
dw 0, 0 ; sp1, sp2
Hook_int8:
; quand une interruption survient, les registres cs:ip et flags se retrouvent dans la pile.
pusha
mov reg_sp[Current_context & 1],sp
;Current_context += 1 <======= Il me retourne une erreur arrivé ici. Je pense que c'est à cause du +=
mov sp,reg_sp[Current_context & 1]
popa
jmp far [Old_int8]
;la pile du code2 devra être initialisée pour simuler une interruption précedente
ASSUME SS:segment_pile < == ======== j'ai déclaré la pile de cette façon mais cela ne fonctionne pas
MOV AX, segment_pile
MOV SS, AX ; initialise le segment de pile
MOV SP, base_pile ; copie l'adresse de la base de la pile dans SP
mov sp, segment_pile < ========cela bloque également ici mais je ne sais pourquoi pushf
push cs
push offset Code2
pusha
mov reg_sp[1], sp
mov sp, stack_code1
mov reg_sp[0], sp
call HookInt8