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

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

Marsh Posté le 24-04-2008 à 15:23:02    

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

Reply

Marsh Posté le 24-04-2008 à 15:23:02   

Reply

Marsh Posté le 24-04-2008 à 21:48:16    

contexte/os/finalité ?

Reply

Marsh Posté le 24-04-2008 à 23:52:25    

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 :)

Reply

Marsh Posté le 25-04-2008 à 00:11:30    

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

Reply

Marsh Posté le 25-04-2008 à 00:13:41    

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?

Reply

Marsh Posté le 25-04-2008 à 00:30:19    

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
Reply

Marsh Posté le 25-04-2008 à 00:36:54    

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
Reply

Marsh Posté le 25-04-2008 à 01:07:15    

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é!  --
Reply

Marsh Posté le 25-04-2008 à 01:15:06    

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

Reply

Marsh Posté le 25-04-2008 à 01:16:20    

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

Reply

Marsh Posté le 25-04-2008 à 01:16:20   

Reply

Marsh Posté le 25-04-2008 à 01:18:33    

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?

Reply

Marsh Posté le 25-04-2008 à 01:20:56    

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é!  --
Reply

Marsh Posté le 25-04-2008 à 01:22:52    

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...

Reply

Marsh Posté le 25-04-2008 à 01:37:32    

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é!  --
Reply

Marsh Posté le 25-04-2008 à 02:08:43    

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
Reply

Marsh Posté le 25-04-2008 à 09:26:39    


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é!  --
Reply

Marsh Posté le 25-04-2008 à 10:07:11    

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é!  --
Reply

Marsh Posté le 25-04-2008 à 10:17:38    

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
Reply

Marsh Posté le 25-04-2008 à 10:23:33    

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é!  --
Reply

Marsh Posté le 25-04-2008 à 11:01:45    

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
Reply

Marsh Posté le 25-04-2008 à 15:43:18    

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
Reply

Marsh Posté le 25-04-2008 à 17:31:30    

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é!  --
Reply

Marsh Posté le 25-04-2008 à 17:58:35    

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
Reply

Marsh Posté le 25-04-2008 à 19:27:43    

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é!  --
Reply

Marsh Posté le 25-04-2008 à 20:42:42    

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

Reply

Marsh Posté le 25-04-2008 à 22:19:05    

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:

Reply

Marsh Posté le 26-04-2008 à 00:09:05    

:D

Reply

Marsh Posté le 27-04-2008 à 22:22:44    

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
Reply

Marsh Posté le 02-05-2008 à 04:20:19    

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...

Reply

Marsh Posté le 07-05-2008 à 07:21:48    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed