Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1331 connectés 

  FORUM HardWare.fr
  Programmation
  ASM

  [ASM 80x86] crée une fonction sleep.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ASM 80x86] crée une fonction sleep.

n°1723758
krays
Posté le 24-04-2008 à 15:23:02  profilanswer
 

Bonjour à tous!
Je suis étudiants en informatique, et j'apprends actuellement le langage ASM 80x86, j'aurais aimer avoir votre avis sur la manière de coder une fonction "sleep"... qui me permettrait d'attendre "x" seconde avant de continuer la suite de mon programme.
 
Savez-vous comment je peux faire ça? je n'y arrive vraiment pas, j'ai chercher sur Google pas mal de temps, et je reste bloquer.
 
Merci par avance!
Krays

mood
Publicité
Posté le 24-04-2008 à 15:23:02  profilanswer
 

n°1724021
bjone
Insert booze to continue
Posté le 24-04-2008 à 21:48:16  profilanswer
 

contexte/os/finalité ?

n°1724076
krays
Posté le 24-04-2008 à 23:52:25  profilanswer
 

l'os est windows(XP/Vista), je code sous MASM, et le but est de crée un affichage "animé" (les lettres apparaisse au fur et a mesure sur l'ecran).
 
Merci par avance :)

n°1724084
bjone
Insert booze to continue
Posté le 25-04-2008 à 00:11:30  profilanswer
 

donc il faut utiliser le sleep de l'os:
 
http://msdn2.microsoft.com/en-us/l [...] S.85).aspx

n°1724086
krays
Posté le 25-04-2008 à 00:13:41  profilanswer
 

heu je suis dsl, mais je ne sais pas trés bien comment integrer ça a mon projet?
 
peux tu me dire comment ça marche? et comment faire pour l'integrer dans mon code masm ?  je copie colle la fonction, et je l'appelle via un call? ou dois-je inclure une librairie annexe lors de la compil et faire un call far ptr?

n°1724091
bjone
Insert booze to continue
Posté le 25-04-2008 à 00:30:19  profilanswer
 

tu fais bien un binaire win32 ? (et pas DOS parceque sous vista ça tranchera).
 
il a bien une tête de ce genre ton code ?
http://asmzone.ifrance.com/asmzone [...] urs/c1.htm
 
bon bin tu inclus le .inc et .lib qui va bien et tu call le sleep.


Message édité par bjone le 25-04-2008 à 00:32:22
n°1724094
krays
Posté le 25-04-2008 à 00:36:54  profilanswer
 

non,
 
voila mon code actuel :  
 
 
 

Citation :

STACK SEGMENT STACK
   DW 256 DUP(0)
base:
STACK ENDS  
 
DATA SEGMENT  
 
    ; ici on déclare les variable
    Reponse DB "L'heur actuelle est : $"
    Heure DB ?
    Minutes DB ?
    Seconde DB ?
    DixiemeSeconde DB ?
  VARIABLE DB 0
DATA ENDS
 
CODE SEGMENT
   ASSUME CS:CODE, DS:DATA, SS:STACK
 
   ; ici on declare les fonctions externes
   extrn prbyte : far
 
   ; ici on declare les fonctions locales
   ; on precise à l'aide d'un commantaire  
   ; son nom, ses entrees et ses sorties
   
   ; Procedure: name
   ; Entree: ...
   ; Sortie: ...
 
debut:
   MOV AX, DATA
   MOV DS, AX
 
   MOV AX, STACK
   MOV SS, AX  
   MOV SP, base  
   
   ;on affiche le message "l'heur actuelle est : "
    MOV DX,Offset Reponse    
    MOV AH,09    
    INT 21H
   ;on appelle l'interuption pour recuperer l'heur  
   mov AH,2Ch
   int 21h
   
   mov Heure,CH
   mov Minutes,CL
   mov Seconde,DH
   mov DixiemeSeconde,DL
   
   ;on convertie l'heur et on l'affiche
  mov AL,Heure
  call conversion
  call far ptr prbyte
  ;on affiche le caracte "h"
    MOV DL,'h'    
    MOV AH,02    
    INT 21H
  call Timer
 ;on convertie les minutes et on l'affiche
  mov AL,Minutes
  call conversion
  call far ptr prbyte
  ;on affiche le caracte "m"
    MOV DL,'m'    
    MOV AH,02    
    INT 21H
 ;on convertie les secondes et on l'affiche
  mov AL,Seconde
  call conversion
  call far ptr prbyte
  ;on affiche le caracte "s"
    MOV DL,'s'    
    MOV AH,02    
    INT 21H
 ;on convertie les dixieme de seconde et on l'affiche
  mov AL,DixiemeSeconde
  call conversion
  call far ptr prbyte
fin:          
   MOV AH, 4CH  
   INT 21H  
   
conversion proc near
mov bh,al ; on sauvegarde le parametre A dans bh
mov bl,10 ;on initialise bl a 10
Mov dl,bh ;on met le parametre A dans dl
mov ah,0;on met ah a 0
div bl ;on divise A par 10
mov ah,0;on met ah a 0
mov bl,6; on met 6 dans bl
mul bl ; on multiplie le quotient(al) par 6
add al,bh ;on aditionne le resultat a A
 
RET
conversion endp
 
 
CODE ENDS
END debut

Message cité 1 fois
Message édité par krays le 25-04-2008 à 00:37:29
n°1724097
gilou
Modérateur
Modzilla
Posté le 25-04-2008 à 01:07:15  profilanswer
 

krays a écrit :

heu je suis dsl, mais je ne sais pas trés bien comment integrer ça a mon projet?
 
peux tu me dire comment ça marche? et comment faire pour l'integrer dans mon code masm ?  je copie colle la fonction, et je l'appelle via un call? ou [#e2001c]dois-je inclure une librairie annexe lors de la compil et faire un call far ptr?

oui, ca passe par un call, du type:
push 5000  
call Sleep  
pour une attente de 5 secs.
 
Pour les includes, ca doit être gere par la ligne avec masm32rt.inc qui devrait figurer en debut de ton code, non? Ou alors tu fais tout explicitement:
 
    .486                                    ; create 32 bit code  
    .model flat, stdcall                    ; 32 bit memory model  
    option casemap :none                    ; case sensitive  
   
    include \masm32\include\windows.inc     ; always first  
    include \masm32\macros\macros.asm       ; MASM support macros  
 
  ; -----------------------------------------------------------------  
  ; include files that have MASM format prototypes for function calls  
  ; -----------------------------------------------------------------  
    include \masm32\include\masm32.inc  
    include \masm32\include\gdi32.inc  
    include \masm32\include\user32.inc  
    include \masm32\include\kernel32.inc  
 
  ; ------------------------------------------------  
  ; Library files that have definitions for function  
  ; exports and tested reliable prebuilt code.  
  ; ------------------------------------------------  
    includelib \masm32\lib\masm32.lib  
    includelib \masm32\lib\gdi32.lib  
    includelib \masm32\lib\user32.lib  
    includelib \masm32\lib\kernel32.lib  
 
(virer les includes et libs inutiles)
 
 
EDIT: je viens de voit ton code, c'est de l'assembleur tout ce qu'il y a de basique, mais c'est du DOS (appels a int 21h), donc sans garantie de fonctionnement sans problemes sous windows.
A+,


Message édité par gilou le 25-04-2008 à 01:17:57

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1724098
krays
Posté le 25-04-2008 à 01:15:06  profilanswer
 

pour info j'utilise la Version 6.11 de masm, je compile sous DOS, et tu as dans mon poste ci dessu l'integralité du code que j'utilise...
sous dos je tape :
 
masm monfichier.asm
link monfichier baseio     (baseio etant un obj que j'utilise dans mon code)
 
c'est tous... je n'est fais aucun include (dailleur mon dossier masm ne contient pas de masm32rt.inc)
 
Merci par avance pour vos réponse

n°1724099
krays
Posté le 25-04-2008 à 01:16:20  profilanswer
 

pour info (bis), je n'est pas masm32.... ma version est imposer par notre professeur.

mood
Publicité
Posté le 25-04-2008 à 01:16:20  profilanswer
 

n°1724100
krays
Posté le 25-04-2008 à 01:18:33  profilanswer
 

n'est t'il pas possible avec les instruction de base de l'assembleur 80x86 de  crée une fonction qui me permette de temporiser une action ? n'y en as t'il pas de pré-existante?

n°1724101
gilou
Modérateur
Modzilla
Posté le 25-04-2008 à 01:20:56  profilanswer
 

Masm 6.11, ca me rappelle des choses, ca doit dater de Windows 3.1, au pire de win 95, non?
Donc en fait, tu es sous un archaique DOS comme environnement, ou bien dans une console DOS de windows? et en ce cas, quelle version de windows?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1724102
krays
Posté le 25-04-2008 à 01:22:52  profilanswer
 

bha ecoute, la je tourne sous windows vista... mon programme compile parfaitement... j'utilise la commande cmd pour afficher la console... aprés je compile et j'execute parfaitement... donc bon...

n°1724104
gilou
Modérateur
Modzilla
Posté le 25-04-2008 à 01:37:32  profilanswer
 

Ca veut pas dire que tout ce qui marchait en dos est garanti de fonctionner.
Autrefois, en DOS, pour ce type de pb, on aurait utilise ceci:

Citation :

INT 4A - RTC Alarm Handler Vector
 
 
 - not a true interrupt, but a pointer to an alarm handler routine
 - called by  INT 70  and enabled by INT 1A,6
 - routine must exit via IRET

( http://heim.ifi.uio.no/~stanisls/helppc/int_table.html )
Je me souviens l'avoir fait, il y a longtemps.
Mais rien ne garantit que Windows supporte encore ce type de choses.
Si les int 21 que tu fais marchent encore, c'est parce que les ingés de windows ont fait en sorte que ca reste a peu pres encore utilisable, bien que tout soit émulé.  
 
Si ca colle pas, au pire, tu fais une boucle bloquante en appellant DOS Get Time (une int 21), et tu testes que une seconde s'est ecoulée.

Citation :

INT 21,2C - Get Time
 
 
 AH = 2C
 
 
 on return:
 CH = hour (0-23)
 CL = minutes (0-59)
 DH = seconds (0-59)
 DL = hundredths (0-99)
 
 
 - retrieves DOS maintained clock time


 
A+,


Message édité par gilou le 25-04-2008 à 01:43:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1724107
krays
Posté le 25-04-2008 à 02:08:43  profilanswer
 

j'ai esseyer de coder ça, sa compile, mais sa fait une boucle infinie apparament, tu aurais une solution ?  

Citation :


timer proc near
;on calcul l'heur
Mov ah,2Ch
int 21
;on stoque les seconde dans al
mov al,Dh
Boucle:
;on recalcul l'heur
mov ah,2ch
int 21
;on stoque les nouvelle seconde dans ah
mov ah,dh
;on compare, si ah = al on boucle
cmp al,ah
JE Boucle
RET
timer endp


Message édité par krays le 25-04-2008 à 02:15:19
n°1724157
gilou
Modérateur
Modzilla
Posté le 25-04-2008 à 09:26:39  profilanswer
 


Ca boucle a l'infini?

Citation :

timer proc near  
mov ah,2Ch ;on recupere l'heure  
int 21  
mov bl,dh ;on stoque les seconde dans bl  
Boucle: mov ah,2Ch ;on recupere l'heure  
int 21  
mov bh,dh ;on stoque les nouvelle seconde dans bh  
cmp bl,bh ;on compare, si bh = bl on boucle  
je Boucle  
ret  
timer endp


Ca m'a pas l'air mauvais, il faudrait afficher dh apres chaque interruption, pour verifier que c'est bien gere par windows.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1724196
gilou
Modérateur
Modzilla
Posté le 25-04-2008 à 10:07:11  profilanswer
 

Sinon, tu as l'interruption 15, mais est elle elle aussi correctement geree par windows maintenant, c'est a tester.

Citation :

INT 15,83 - Event Wait
 
 
 AH = 83h
 AL = 0 set interval
    = 1 cancel interval (PS/2)
 CX,DX = number of microseconds to wait (976 æs resolution)
 ES:BX = pointer to memory flag (bit 7 is set
  when interval expires)
         (granularity is 976 microseconds)
 
 
 on return:
 CF = 1 if function already busy
 AH = 80h for PC
    = 86h for XT & AT
 
 
 - available on the AT (BIOS after 1/10/84) and PS/2's except 30
 - designed for use in simple multitasking


 
Et tu peux t'inspirer de ce type de code

Code :
  1. push  ds
  2. pop   es ; on veut es = ds pour acceder aux données du data segment
  3. mov   bx,offset Flag ; Flag doit etre une donnee de type BYTE definie dans le data segment
  4. mov   ax,8300h ; (AH) Service 83h, --  (AL)=0 pour demarrer le timer, 1 pour arreter le timer
  5. mov   cx,000Fh ; 1 sec, soit 1000000 micro secondes, 000F4240 a ranger dans cx,dx
  6. mov   dx,4240h ; cx = octets de poids fort, dx = octets de poids faible
  7.                 ; cx:dx = combien de micro secondes a attendre avant le positionnement du flag
  8. int   15h
  9. LoopIt:
  10. mov   al,Flag  ; on verifie si le flag a ete positionne (80h ou 40h selon les docs)
  11. or    al,al
  12. jnz   TimerUp   
  13. jmp   short LoopIt
  14. TimerUp:  ; un arret du timer si on n'en a plus besoin n'est pas inutile ici


A+,


Message édité par gilou le 25-04-2008 à 10:18:09

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1724207
bjone
Insert booze to continue
Posté le 25-04-2008 à 10:17:38  profilanswer
 

y'a plus de DOS sous Vista, donc tu peux rayer Vista de ta liste d'os supportés.
 
(sinon dans l'espace d'adressage du bios, il y a des tables normalisées où tu dois trouver un entier qui est incrémenté tous les 1/18.2ième de seconde, qui peut donc juste être atteint par un mov)


Message édité par bjone le 25-04-2008 à 10:20:41
n°1724211
gilou
Modérateur
Modzilla
Posté le 25-04-2008 à 10:23:33  profilanswer
 

Comme il a mis ca:

Citation :

bha ecoute, la je tourne sous windows vista... mon programme compile parfaitement... j'utilise la commande cmd pour afficher la console... aprés je compile et j'execute parfaitement... donc bon...


il y a apparement encore du support, mais je suppose que tout ne marche pas. Apparement, l'interruption 21 donnant l'heure marche (il a l'air d'afficher au moins une fois l'heure) c'est pourquoi a la base, je pensais qu'une boucle testant l'heure collerait, et je suis perplexe sur le fait que ca lui fait une boucle infinie.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1724238
bjone
Insert booze to continue
Posté le 25-04-2008 à 11:01:45  profilanswer
 

après réflexion c'est le support WIN16 qui est tombé. donc peut-être qu'il y a effectivement un peu de support DOS :jap:
 
En fait Vista 32 semble encore avoir du support, Vista 64 non.

Message cité 1 fois
Message édité par bjone le 25-04-2008 à 11:03:17
n°1724526
dap++
Script kiddie
Posté le 25-04-2008 à 15:43:18  profilanswer
 

bjone a écrit :

après réflexion c'est le support WIN16 qui est tombé. donc peut-être qu'il y a effectivement un peu de support DOS :jap:
 
En fait Vista 32 semble encore avoir du support, Vista 64 non.


Ils ont quand même fait un émulateur pour les appels BIOS : http://x86asm.net/articles/calling [...] index.html


---------------
dap.developpez.com
n°1724641
gilou
Modérateur
Modzilla
Posté le 25-04-2008 à 17:31:30  profilanswer
 

Le MASM 6.11, c'est du 16 bits plein pots (6.11d est la derniere version de MASM a le faire d'ailleurs)  donc son support sur des WinXXX est loin d'être garanti.
A+,


Message édité par gilou le 25-04-2008 à 17:31:56

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1724649
olivthill
Posté le 25-04-2008 à 17:58:35  profilanswer
 

Sous Windows 3.1 jusqu'à Windows XP, il y a 3 formats d'exécutable, communément nommés : MZ, NE, PE.
Sous Windows Vista 64, c'est le NE qui passe à la trappe.
Les programmes DOS (mode console) sont au format MZ, qui continue d'exister sous Windows 64.
Edit : D'ailleurs, les programmes PE ont habituellement un stub (sorte de header) qui est au format MZ. Donc ce n'est pas demain la veille que le MZ sera abandonné.


Message édité par olivthill le 25-04-2008 à 18:06:34
n°1724697
gilou
Modérateur
Modzilla
Posté le 25-04-2008 à 19:27:43  profilanswer
 

Certes, mais c'est le support des diverses interruptions datant de l'époque du DOS sur lesquelles je ne parierais pas, en particulier la 4A.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1724706
bjone
Insert booze to continue
Posté le 25-04-2008 à 20:42:42  profilanswer
 

bah les PE qui ont un stub MZ, c'est justement pour dire que l'exe peut pas marcher sous dos.
 
et comme dit gilou, le format de l'éxécutable ne fait pas le larron :D

n°1724754
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 25-04-2008 à 22:19:05  profilanswer
 

bonjour, je peux aider ? :hello:
 

krays a écrit :

non,
 
voila mon code actuel :  
 
 
 

Citation :

STACK SEGMENT STACK
   DW 256 DUP(0)
base:
STACK ENDS  
 
DATA SEGMENT  
 
    ; ici on déclare les variable
    Reponse DB "L'heur actuelle est : $"
    Heure DB ?
    Minutes DB ?
    Seconde DB ?
    DixiemeSeconde DB ?
  VARIABLE DB 0
DATA ENDS
 
CODE SEGMENT
   ASSUME CS:CODE, DS:DATA, SS:STACK
 
   ; ici on declare les fonctions externes
   extrn prbyte : far
 
   ; ici on declare les fonctions locales
   ; on precise à l'aide d'un commantaire  
   ; son nom, ses entrees et ses sorties
   
   ; Procedure: name
   ; Entree: ...
   ; Sortie: ...
 
debut:
   MOV AX, DATA
   MOV DS, AX
 
   MOV AX, STACK
   MOV SS, AX  
   MOV SP, base  
   
   ;on affiche le message "l'heur actuelle est : "
    MOV DX,Offset Reponse    
    MOV AH,09    
    INT 21H
   ;on appelle l'interuption pour recuperer l'heur  
   mov AH,2Ch
   int 21h
   
   mov Heure,CH
   mov Minutes,CL
   mov Seconde,DH
   mov DixiemeSeconde,DL
   
   ;on convertie l'heur et on l'affiche
  mov AL,Heure
  call conversion
  call far ptr prbyte
  ;on affiche le caracte "h"
    MOV DL,'h'    
    MOV AH,02    
    INT 21H
  call Timer
 ;on convertie les minutes et on l'affiche
  mov AL,Minutes
  call conversion
  call far ptr prbyte
  ;on affiche le caracte "m"
    MOV DL,'m'    
    MOV AH,02    
    INT 21H
 ;on convertie les secondes et on l'affiche
  mov AL,Seconde
  call conversion
  call far ptr prbyte
  ;on affiche le caracte "s"
    MOV DL,'s'    
    MOV AH,02    
    INT 21H
 ;on convertie les dixieme de seconde et on l'affiche
  mov AL,DixiemeSeconde
  call conversion
  call far ptr prbyte
fin:          
   MOV AH, 4CH  
   INT 21H  
   
conversion proc near
mov bh,al ; on sauvegarde le parametre A dans bh
mov bl,10 ;on initialise bl a 10
Mov dl,bh ;on met le parametre A dans dl
mov ah,0;on met ah a 0
div bl ;on divise A par 10
mov ah,0;on met ah a 0
mov bl,6; on met 6 dans bl
mul bl ; on multiplie le quotient(al) par 6
add al,bh ;on aditionne le resultat a A
 
RET
conversion endp
 
 
CODE ENDS
END debut



 
ah non, de l'assembleur 16 bits en mode réel.... merci et au revoir :pfff:

n°1724777
bjone
Insert booze to continue
Posté le 26-04-2008 à 00:09:05  profilanswer
 

:D

n°1725282
krays
Posté le 27-04-2008 à 22:22:44  profilanswer
 

Voila j'ai trouver une solution pour crée un timer en 80x86, merci a tous d'avoir participer a cette discutions :

Citation :

;======================================================================
 ;==== | timer - Attend 1 seconde
 ;======================================================================
 
timer PROC NEAR
  PUSH AX
  PUSH BX
  PUSH CX
  PUSH DX
  PUSH SI
   MOV AX,0
   MOV BX,0
   MOV CX,0
   MOV DX,0
   MOV SI,0
   mov AH,2Dh
   int 21h
   mov AL,DH
   
   
 
   
   boucletime:
   mov AH,2Ch
   int 21h
   
 
   CMP DH,AL
   JE boucletime
  POP SI
  POP DX
  POP CX
  POP BX
  POP AX
 RET
 timer ENDP


Message édité par krays le 27-04-2008 à 22:23:31
n°1727477
Yike
Posté le 02-05-2008 à 04:20:19  profilanswer
 

au pire, fais lui perdre du temps
 
call Pause
 
Pause    movlw 0xff
            movwf compte1
 
dec  decfsz compte1,1
       goto dec
 
       return
 
c un decompte de 255 à 0, et le temps de cette pause va varié en fonction de la vitesse du processeur, au pire calcule ca vitesse et mets le nombre de pause que tu a de besoin     ex:  2Ghz ->  (2exp9)exp-1 = 5pico sec  par decompte complet (500exp-12). Alors pour 1 sec d'attente -> 1/ 5exp-12 = 200 milliard de fois.
 
Tk c le code asm basé sur les pic de la serie 16f8x de microchip... remarque c surment pas evident d'utiliser cette technique en informatique, après tout les pic roule en moyen en 4 et 20 Mhz seulement...

n°1729298
db__
spécialiste de l'à peu près
Posté le 07-05-2008 à 07:21:48  profilanswer
 

apprendre à programmer en ASM 16 bits de nos jours est pratiquement aussi utile que d'apprendre le latin.


---------------
je suis né fatigué et fait pour me reposer
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

  [ASM 80x86] crée une fonction sleep.

 

Sujets relatifs
changement d'etat cellule en fonction de la dateAide sur fonction PHP
[Resolu]comment crée un fichier.jar?[ASM] Conduite à adopter en cas de crash...
[Résolu] Fonction count en PHPProblème en C : ma fonction recupere un '\n'
fonction window de turbo C/C++passage d'un tableau dans une fonction
Fonction qui teste un lien htmlMailing : fonction mail() ou autre ??
Plus de sujets relatifs à : [ASM 80x86] crée une fonction sleep.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR