crée une fonction sleep. [ASM 80x86] - ASM - Programmation
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
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
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?
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.
Marsh Posté le 25-04-2008 à 00:36:54
non,
voila mon code actuel :
Citation : STACK SEGMENT STACK |
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? |
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+,
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
Marsh Posté le 25-04-2008 à 01:16:20
pour info (bis), je n'est pas masm32.... ma version est imposer par notre professeur.
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?
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+,
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...
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 |
( 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 |
A+,
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 : |
Marsh Posté le 25-04-2008 à 09:26:39
Ca boucle a l'infini?
Citation : timer proc near |
Ca m'a pas l'air mauvais, il faudrait afficher dh apres chaque interruption, pour verifier que c'est bien gere par windows.
A+,
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 |
Et tu peux t'inspirer de ce type de code
Code :
|
A+,
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)
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+,
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
En fait Vista 32 semble encore avoir du support, Vista 64 non.
Marsh Posté le 25-04-2008 à 15:43:18
bjone a écrit :
|
Ils ont quand même fait un émulateur pour les appels BIOS : http://x86asm.net/articles/calling [...] index.html
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+,
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é.
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+,
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
Marsh Posté le 25-04-2008 à 22:19:05
bonjour, je peux aider ?
krays a écrit : non,
|
ah non, de l'assembleur 16 bits en mode réel.... merci et au revoir
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 : ;====================================================================== |
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...
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.
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