begin process at 2010 03 10 23:45:31
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive Assembleur

 > 

Archives

 > 

delphi et asm

 > 

Faire des conditions sans instruction J*


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Faire des conditions sans instruction J*

mercredi 22 juin 2005 à 11:08:00 | Faire des conditions sans instruction J*

grandvizir

Bonjour,

Quand je fais un programme Delphi, je dois souvent faire des IF :
  if MaVariable then
    {quelque chose};

Qui se traduit par les instructions ASM suivantes:
  CMP
ou par la succession
  TEST
  LEA
  JNE/JE

Je me demandais si on ne pouvait pas faire des instructions conditionnelles sans faire apparaître de telles commandes ASM, histoire qu'elles passent un peu plus inaperçues ?

Je m'en réferre donc aux gourous de l'assembleur...
Cordialement

=============
ViewVite : HTML

mercredi 22 juin 2005 à 12:41:52 | Re : Faire des conditions sans instruction J*

patatalo

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
salut,

si, par exemple:

reponses dd rep1,rep2,0

xor edx,edx
cmp eax,1
sete dl
call [reponses+edx*4]
...
ret

rep1:
; code 1
ret
rep2
; code 2
ret

@++
mercredi 22 juin 2005 à 14:06:45 | Y'a toujours de la gruge !

grandvizir

C'est sympa patatelo, mais je dirais qu'il y a toujours un CMP...

J'ai classé la question en "Delphi + ASM", donc ça risque d'être chaud par ce que la syntaxe n'est pas pareil... Mon idée était de faire un truc du genre:

var AdressesFichier : array[boolean] of Label = (Label1, Label2);
    b               : boolean
begin
  b:=true;
  goto AdressesFichier[b];
  asm
    Label1: //si valeur fausse de b
      JMP @Sortie
    Label2: //si valeur vraie de b
      //JMP @Sortie
    Sortie:

  end;
end;     

On fait un saut en considérant des tableaux, et a priori, il n'y a pas besoin de faire des conditions, sachant que boolean est un type énuméré (il se comporte comme de nombre).

Techniquement, il y a des choses qui ne se font pas...

Alors

=============
ViewVite : HTML
jeudi 23 juin 2005 à 10:13:33 | Re : Faire des conditions sans instruction J*

patatalo

Membre Club Administrateur CodeS-SourceS

re,

a ce moment là, la demande devrait etre Faire des conditions sans instruction C*

@++

jeudi 23 juin 2005 à 11:36:25 | Re : Faire des conditions sans instruction J*

Nasman

Je pense que plusieurs solutions sont possibles à partir du moment ou le résultat d'une comparaison a été stocké quelque part (par exemple AND eax,eax affecte les flags de signe, de zero etc). Tu peux alors faire un jmp indirect à partir d'une table dont l'adresse pointée dépendra du résultat de ta comparaison.

Autre solution pour la discretion, leurrer un désassembleur en effectuant un décalage des octets.

depart:  mov eax,dword 0x12345678
        jmp depart+13
        add eax,0x432b0000
        or eax,0x04eb0374
        ret
        nop
        nop
        nop
        ret

après desassemblage celà donne

00000205  B878563412        mov eax,0x12345678
0000020A  E903000000        jmp 0x212
0000020F  0500002B43        add eax,0x432b0000
00000214  0D7403EB04        or eax,0x4eb0374
00000219  C3                ret
0000021A  90                nop
0000021B  90                nop
0000021C  90                nop
0000021D  C3                ret

Il ne semble pas y avoir de comparaisons ; par compte à l'exécution il en sera tout autrement. En effet le jmp envoie à une l'adresse 212 où se trouvent les octets suivants:
212   2B430D   sub eax,[ebx+0xd]      comparaison
215   7403         jz 21A                        si nul aller en 21A
217   EB04         jmp short 21D            sinon terminé

jeudi 23 juin 2005 à 14:37:32 | Delphi est limité

grandvizir

Au final, je pense que Delphi n'est pas suffisamment avancé pour ce genre de trucs. Comment lui dire de sauter à une adresse qui se situe dans des lignes prochainement interprétées. La fenêtre CPU du logiciel propose les codes ASM associés aux commandes Pascal, mais tout ça va finir par devenir de la bidouille. Alors, étant propre, je ne ferais rien. C'était juste une petite curiosité technique...

Si des membres ont d'autres propositions, n'hésitez pas à les déposer...

=============
ViewVite : HTML
vendredi 24 juin 2005 à 11:43:55 | Re : Faire des conditions sans instruction J*

patatalo

Membre Club Administrateur CodeS-SourceS
re,

les exceptions ( notament l'instruction bound )

@++
vendredi 24 juin 2005 à 15:03:27 | Re : Faire des conditions sans instruction J*

Nasman

Réponse acceptée !
En fait une bonne partie des instructions assembleur affecte les flags (signe, carry, ...), il est possible de convertir le résultat, retenue par exemple, en un offset qui permettra de moduler un déplacement.
A partir du moment ou le registre d'état aura été affecté les instructions suivantes:
LAHF, RCL (RCR), SALC permettront de définir un déplacement qui pourra être mis à profit lors d'un JMP indirect.

Autre possibilité de saut (à risque), utiliser les instructions suivantes:

instuction précédente                    xxx
instruction de saut                        Call Routine
instruction normale après appel     yyy

Routine                                       comparaison (discrète)
                                                   calcul d'une adresse
                                                   mov [esp],adresse souhaitée
                                                   ret

L'instruction mov [esp],adresse remplace l'adresse de retour empilée (eip) par la nouvelle adresse. Le Call est en fait un jump déguisé



vendredi 24 juin 2005 à 16:21:48 | J'ai pensé à autre chose

grandvizir

Je pensais faire une autre structure :

var NbJump : array[boolean] of byte = (3,6); //nombre d'instructions ASM-compilé à sauter
    b      : boolean;
label Sortie:
begin
  b:=true;
  asm
    JMP AdresseEnCours + NbJump[b]
  end;
//PREMIERE PARTIE: valeur FALSE
  JAppelleLaFonctionNumeroUn;
  goto Sortie:
//DEUXIEMME PARTIE: valeur TRUE
  JAppelleLaFonctionNumeroDeux;
Sortie:
end;

Le fait de faire un appel à fonction devrait forcer l'optimiseur de Delphi à faire un CALL, ce qui réduit le nombre d'instructions à sauter...

Ainsi, la première cellule de NbJump est le nombre d'instuctions entre JMP et l'appel à fonction N°1, la deuxième cellule entre JMP et l'appel à la fonction N°2.

On s'aidera de la fenêtre CPU afin de déterminer ces nombres...

On résumé, ma question est: comment dire à l'ASM de Delphi de sauter N instructions de code compilé  Après, ça devrait se simplifier...

Note importante: la technique de résolution doit être très propre. Pas de bidouille !

=============
ViewVite : HTML
vendredi 18 août 2006 à 10:53:23 | Tableaux de sauts

grandvizir

Réponse acceptée !

J'ai trouvé la solution pour Pascal... et vient de remarquer l'exactitude des informations de Patatalo et Nasman. Mais c'est tellement technique que Delphi ne l'autorise pas facilement. Merci à vous.

program Saut;

    procedure Faux;
    begin
      //le code
    end;
    procedure Vrai;
    begin
      //le code
    end;

const TableSaut : array[boolean] = (Faux, Vrai);
var   Condition : boolean;
begin
  Condition:=true;
  TableSaut[Condition];
end.


Il suffit tout simplement de faire un tableau de procédures. C'est ce qui se fait aussi en asm.

=============
ViewVite XP : HTML



Cette discussion est classée dans : asm, instruction, conditions, instructions


Répondre à ce message

Sujets en rapport avec ce message

Instructions ASM [ par BarthOlivier ] Salut a tous.Je voudrais savoir où je pourrais trouver tout le jeux d'instruction disponible pour un processeur recent (type P3 ou P4 par exemple).Est instruction MID(vb) en ASM [ par flagyg ] Bonjour,J'essaye de traduire des codes que j'ai fait en vb en asm. mais je n'arrive pas à programmer la fonction mid.Qqn pourrait me la programmer svp Cherche doc instructions asm x86... [ par akboy7015 ] Bonjour a tous...J'ai beau eu cherché sur ce site dans le forum, je ne trouve aucun lien vers une bonne doc assembleur x86 faisant la liste de toutes Jeux d'instruction ASM [ par Neonapster ] Bonjour,On trouve beaucoup de docs sur les instruction asm en anglais.Connaissez vous un lien proposant des infos sur les instructions en FR le plus c scmos.asm [ par henri12 ] salutil est ou scmos.asmje le trouve pas Où avez vous appris l'assembleur [ par Joe0557 ] Bonjour, Je m'interresse depuis quelques temps à la programmation en ASM, mon projet final serait de faire un OS (je sais qu'il est très compliquer d' feu tricolor ave asm [ par hassan85281 ] qui peu m'aidé et  a ecrire un programme de feu tricolor avec l asm ,je trouve un exemple avec le emulateur8086 mais sa ne suffit pas . Lire et modifier la RAM [ par bilaloch ] Bonjour à tous, J'aimerais savoir s'il y a une possibilité pour que, à travers le C++ (ou l'ASM d'ailleurs, je poste ce message sur le forum de l'ASM Afficher le contenu d'un registre [ par Anakinele ] Bonjour !Grand débutant en ASM je cherche 'simplement' (rien ne semble simple en asm !) à afficher dans la console le contenu d'un registre choisi au


Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales