Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : delphi vers asm [ Archives / Aide a la programmation Windows ] (cricri_b34)

mardi 10 janvier 2006 à 03:30:45 | delphi vers asm

cricri_b34

salut , J'ai un code en delphi que j'aimerais traduire en assembleur (masm32) :

var
KeyTable: array [0..255] of boolean

[....]

procedure CheckState;
var
  I: integer;
begin
  for I := 0 to 255 do
  begin
    if KeyTable[I]<>(GetAsyncKeyState(I)<>0) then
    begin
      if (I=1) then
      begin
        // souris gauche
        if not KeyTable[1] then
        begin
          OnMouseDown()
        end;
      end
      else
      begin
        // clavier
        if not KeyTable[I] then
        begin
          OnKeyDown(I);
        end;
      end;
      KeyTable[I] := GetAsyncKeyState(I)<>0;
    end;
  end;
end;

Cette procedure est executé a chaque millièmes de secondes et permet d'intercepter l'appui des touches du clavier et des boutons de la souris.
Donc j'aimerais m'en servir pour un programme en masm32. J'ai commecé a le traduire... voici le résultat :

 .data
 TableState db 255 dup(0)

[...]

CheckState Proc
 mov ecx, 256
 mov esi, offset TableState
Debut:
 invoke GetAsyncKeyState, ecx
 .if (eax!=0)
  cmp BYTE ptr[esi+ecx], 1
  je Suivant
  invoke MessageBox, 0, 0, 0, 0
  mov BYTE ptr[esi+ecx], 1
 .else
  cmp BYTE ptr[esi+ecx], 0
  je Suivant
  invoke MessageBox, 0, 0, 0, 0
  mov BYTE ptr[esi+ecx], 0 
 .endif
Suivant:
 loop Debut
 Ret
CheckState EndP

Un MsgBox devrait apparaitre a chaque appui d'une touche mais, évidemment, ca marche pas...
 Est-ce que quelqu'un pourrait m'aider?

mardi 10 janvier 2006 à 14:07:27 | Re : delphi vers asm

patatalo

Membre Club Administrateur CodeS-SourceS
salut,

un truc dans le genre:

TableState db 256 dup(0) ; 0 a 255 = 256 valeures byte

CheckState PROC USES ESI
mov esi,256
@1:
dec esi ; for esi = 255 to 0
jb @3
invoke GetAsynKeyState,esi ; ecx certainement detruit lors de cet appel.
test ax,ax
setne cl ; GetAsynKeyState <> 0
cmp TableState[esi],cl ;  <> TableState[I]
je @1
not TableState[esi] ; juste inversé la comparaison de I=0 et not TableState[I]
je @1
cmp esi,1
jne @2
invoke OnMouseDown
jmp @1
@2:
invoke OnKeyDown
jmp @1
@3:
ret
CheckState ENDP

@++

mercredi 11 janvier 2006 à 01:17:35 | Re : delphi vers asm

cricri_b34

ca ne marche pas...  :

CheckState Proc USES ESI
mov esi, 256
@1:
dec esi
jb @3
invoke GetAsyncKeyState,esi
test ax,ax
setne cl
cmp TableState[esi],cl
je @1
not TableState[esi]
je @1
cmp esi,1
jne @2
;invoke OnMouseDown
jmp @1
@2:
invoke MessageBox, 0, 0, 0, 0
jmp @1
@3:
ret
CheckState EndP

cette proc me bombarde de MessageBox

mercredi 11 janvier 2006 à 08:33:16 | Re : delphi vers asm

patatalo

Membre Club Administrateur CodeS-SourceS
re,

il te manque le "KeyTable[I] := GetAsyncKeyState(I)<>0" final

@++

mercredi 11 janvier 2006 à 22:17:21 | Re : delphi vers asm

cricri_b34

dsl, mais chui tout mêler dans ton code
jcomprend pas:
<<
   test ax,ax
   setne cl
   cmp TableState[esi],cl
>>

et pour remplacer : KeyTable[I] := GetAsyncKeyState(I)<>0

est cque jpeux faire :

GetAsyncKeyState, esi
cmp eax, 0
je Relache
mov TableState[esi], 1
jmp FinEnregistrementEtat
Relache:
mov TableState[esi], 0
FinEnregistrementEtat :
...




mercredi 11 janvier 2006 à 23:59:30 | Re : delphi vers asm

patatalo

Membre Club Administrateur CodeS-SourceS





CheckState PROC USES ESI
mov esi,256
@1:
dec esi ; for esi = 255 to 0
jb @3
invoke GetAsynKeyState,esi ; ecx certainement detruit lors de cet appel.
test ax,ax
setne cl ; GetAsynKeyState <> 0
cmp TableState[esi],cl ;  <> TableState[I]
je @1
not TableState[esi] ; juste inversé la comparaison de I=0 et not TableState[I]
je @1
mov TableState[esi],cl ; voila le KeyTable[I] := GetAsyncKeyState(I)<>0 manquant
cmp esi,1
je @2  ; on inverse le test: sautera 1 fois au lieu de 255 ;-)
invoke OnKeyDown
jmp @1
@2:
invoke OnMouseDown
jmp @1
@3:
ret
CheckState ENDP

@++

jeudi 12 janvier 2006 à 00:31:23 | Re : delphi vers asm

patatalo

Membre Club Administrateur CodeS-SourceS





je l'ai mal placé dans la boucle:
TableState db 257 dup(0) ; 0 a 255 = 256 valeures byte
CheckState PROC USES ESI
mov esi,256
@0:
mov TableState[esi],cl ; la premiere entrée ne compte pas d'ou TableState db 257
c'est juste pour eviter un "jmp @1" avant @0
@1:
dec esi ; for esi = 255 to 0
jb @3
invoke GetAsynKeyState,esi ; ecx certainement detruit lors de cet appel.
test ax,ax
setne cl ; GetAsynKeyState <> 0
cmp TableState[esi],cl ;  <> TableState[I]
je @1
not TableState[esi] ; juste inversé la comparaison de I=0 et not TableState[I]
je @0
cmp esi,1
je @2  ; on inverse le test: sautera 1 fois au lieu de 255 ;-)
invoke OnKeyDown
jmp @0
@2:
invoke OnMouseDown
jmp @0
@3:
ret
CheckState ENDP

là je pense que ça devrait etre pas mal ...

@++

jeudi 12 janvier 2006 à 00:36:27 | Re : delphi vers asm

patatalo

Membre Club Administrateur CodeS-SourceS
faudrait reflechir avant de poster mais bon ...




TableState db 256 dup(0) ; 0 a 255 = 256 valeures byte

CheckState PROC USES ESI
mov esi,256
@1:
dec esi ; for esi = 255 to 0
jb @3
invoke GetAsynKeyState,esi ; ecx certainement detruit lors de cet appel.
test ax,ax
setne cl ; GetAsynKeyState <> 0
cmp TableState[esi],cl ;  <> TableState[I]
je @1
not TableState[esi] ; juste inversé la comparaison de I=1 et not TableState[I]
mov TableState[esi],cl ; il a mieux sa place là tout simplement
je @1
cmp esi,1
je @2  ; on inverse le test: sautera 1 fois au lieu de 255 ;-)
invoke OnKeyDown
jmp @1
@2:
invoke OnMouseDown
jmp @1
@3:
ret
CheckState ENDP

il me semble que c'est ça mais je peux me gourrer avec tout ces begin / end.

vendredi 13 janvier 2006 à 19:16:10 | Re : delphi vers asm

cricri_b34

non... ca marche toujours pas :

CheckState PROC USES ESI
mov esi,256
@1:
dec esi ; for esi = 255 to 0
jb @3
invoke GetAsyncKeyState,esi ; ecx certainement detruit lors de cet appel.
test ax,ax
setne cl ; GetAsynKeyState <> 0
cmp TableState[esi],cl ;  <> TableState[I]
je @1
not TableState[esi] ; juste inversé la comparaison de I=1 et not TableState[I]
mov TableState[esi],cl ; il a mieux sa place là tout simplement
je @1
cmp esi,1
je @2  ; on inverse le test: sautera 1 fois au lieu de 255 ;-)
;invoke OnKeyDown
invoke MessageBox, 0, 0, 0, 0
jmp @1
@2:
;invoke OnMouseDown
jmp @1
@3:
ret
CheckState ENDP

si tu veux, j'ai le code aussi en vb :

(oups, je l'ai pas avec moi....)


vendredi 13 janvier 2006 à 19:34:02 | Re : delphi vers asm

cricri_b34

bon le voici :

Dim TableState(255) As Boolean

[...]

Private Sub Timer1_Timer()
Dim I As Integer
    For I = 0 To 255
        If (TableState(I) <> (GetAsyncKeyState(I) <> 0)) Then
            If (GetAsyncKeyState(I) <> 0) Then
                If (I <> 1) Then
                    MsgBox ("Une touche vient d'être appuyé!")
                End If
                TableState(I) = True
            Else
                TableState(I) = False
            End If
        End If
    Next I
End Sub


1 2

Cette discussion est classé dans : end, begin, esi, ecx, keytable


Répondre à ce message

Sujets en rapport avec ce message

# Export Table - Kernel32.dll - GetProcessAddress # [ par joanna ] Voici le code qui devrait récupérer l'adresse de la fonction "GetProcessAddress" connaissant l'ImageBase du module "kernel32.dll".Malheureusement à la # Export Table --- Kernell32.dll --- GetProcAddress # [ par joanna ] Voici le code qui devrait récupérer l'adresse de la fonction "GetProcessAddress" connaissant l'ImageBase du module "kernel32.dll".Malheureusement à la Différences ??? [ par Arecibo ] Voila je debute en assembleur et j'aimerais savoir quelles sont les différences entre :-> mov eax, ebx et mov eax, [ebx]-> mov esi, eax et mov [esi], Delphi (6) + ASM en ligne ... Problème !!! [ par Robbby ] Voici un problème concernant un programme tres simple utilisant l'Assembleur en ligne sousDelphi 6.Dans l'exemple n°1, "gogo" et "toto" sont incrément Parcours tableau de HWND [ par AlexMAN ] Bonjour, Voila mon pb : Je declare un tableau de HWND comme suit :hwndCmd HWND 10 dup (?)Ensuite, je veux créer 10 boutons et stocker leur handle ds c Besion info importante assembleur/desassembleur [ par PatSW ] Bonjour,je suis présentement en train de modifier un fichier execute que jai décompiler avec W32Dasm et toute mes modifications jusqu'a présent sont p Pb registre DL [ par AlexMAN ] Bonjour, J'ai un ptit pb avec le code qui suit, au nivo du mov dl, [ecx] ://Renvoie pointeur sur fin de chaine (permet d'eviter l'utilisation de strca mon programme bloque [ par rhumsek ] slt j'ai améliore mon programme mais il provoque une erreure lorsdu calcul de la somme des entiers saisi (sommeentier)POURTANT il exécute bien les de HELP ! :'( [ par TheHacker ] Salut j'ai un probleme: voici mon code, il fonctionne correctement, activer le programme vous verres qu'a la fin i laffiche un MessageBox avec marqué CONVERSION SYNTAXE GCC VERS INTEL [ par BruNews ] CONVERSION SYNTAXE GCC VERS INTELSalut,j'ai un fichier asm (*.s) dans un projet en C qui compile sur GCC. Faut que je traduise depuis cette syntaxe bi


Nos sponsors

Sondage...

CalendriCode

Novembre 2008
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,702 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.