3 votes

Est-il possible d'écrire une instruction if en langage assembleur x86 ?

Est-il possible d'imiter un état if en langage d'assemblage x86 (en utilisant la syntaxe masm) ? Je veux faire quelque chose comme ça en langage assembleur x86, mais je ne suis pas sûr de l'opérateur que je dois utiliser pour imiter une instruction if-else. Dois-je utiliser l'opérateur jl ou l'instruction cmp ou une autre instruction ?

int i = 2;
int j = 3;
if(i > j){
    i = 1;
}
else{
    i = 4;
}

8voto

Alexey Frunze Points 37651

Une combinaison de cmp y jcc (c'est-à-dire le saut conditionnel) feront l'affaire. Consultez le manuel de votre processeur.

3voto

Justin Points 42106

Vous pouvez consulter le manuel de votre CPU, ou vous pouvez simplement demander au compilateur

gcc -c foo.c
objdump -d foo.o

Où foo.c est juste votre fonction dans une méthode simple. La sortie est

00000000 <_foo>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 10                sub    $0x10,%esp
   6:   c7 45 fc 02 00 00 00    movl   $0x2,-0x4(%ebp)
   d:   c7 45 f8 03 00 00 00    movl   $0x3,-0x8(%ebp)
  14:   8b 45 fc                mov    -0x4(%ebp),%eax
  17:   3b 45 f8                cmp    -0x8(%ebp),%eax
  1a:   7e 09                   jle    25 <_foo+0x25>
  1c:   c7 45 fc 01 00 00 00    movl   $0x1,-0x4(%ebp)
  23:   eb 07                   jmp    2c <_foo+0x2c>
  25:   c7 45 fc 04 00 00 00    movl   $0x4,-0x4(%ebp)
  2c:   c9                      leave
  2d:   c3                      ret
  2e:   90                      nop
  2f:   90                      nop

Le truc au début est la mise en place de la pile / le traitement de la convention d'appel, la partie importante est la suivante

  17:   3b 45 f8                cmp    -0x8(%ebp),%eax
  1a:   7e 09                   jle    25 <_foo+0x25>
  1c:   c7 45 fc 01 00 00 00    movl   $0x1,-0x4(%ebp)    // i = 1;
  23:   eb 07                   jmp    2c <_foo+0x2c>
  25:   c7 45 fc 04 00 00 00    movl   $0x4,-0x4(%ebp)    // i = 4;

Dans ce cas, c'est juste un cmp suivi d'un jle - la partie "si" de l'instruction se termine par un signe jmp pour sauter la partie else de l'instruction.

1voto

0x90 Points 8193

En supposant que vous ayez deux étiquettes d'assemblage :

cmp j1, j2
jg LABEL1
LABEL2

Et MASM n'a pas de "syntaxe", c'est comme un "compilateur", qui s'appelle généralement Assembler.


Note complémentaire :

L'assembleur est le langage et l'assembleur est le "compilateur".

0voto

Mahdi Points 3138

Cela pourrait aider à mieux comprendre comment mettre en oeuvre IF dans l'assemblage. Notez que ce n'est pas dans MASM la syntaxe.

Instruction IF complexe en Assemblage

0voto

patchariadog Points 17

Si vous utilisez masm32, vous pouvez écrire des instructions if comme en c++. exemple

.if eax == 0
invoke MessageBoxA, NULL, addr strn, offset title, NULL
.endif

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X