Différence entre l'ASM et le C avec la fonction MUL

Tout sur les langages de programmation.

Différence entre l'ASM et le C avec la fonction MUL

Messagepar skirby » 03 Mai 2007, 16:58

Bonjour tout le monde,

Je me bats avec le défi de Nodh et j'ai un petit soucis de traduction de code de l'ASM vers le C

Code: Tout sélectionner
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
  unsigned int i;
  unsigned short res = 0;
  char s[] = "skirby";

  for (i = 0, res = 1; i < strlen(s); i++) {
    res *= s[i];
  }
  printf("res C: %X\n", res);
  res = 0;

  _asm {
    PUSHAD
    XOR ECX,ECX
    MOV AL,BYTE PTR [s]
    INC ECX
    MyLoop:
        CMP BYTE PTR [s+ECX],0
        JE EndLoop
        MUL BYTE PTR [s+ECX]
        INC ECX
    JMP MyLoop
    EndLoop:
    MOV WORD PTR [res], AX
    POPAD
  }

  printf("res ASM: %X\n", res);

  system("PAUSE");
  return 0;
}


Pourquoi je n'obtient pas le même résultat en C et en ASM

Exemple pour i = 0 à 2
En C:
res = 73 * 6B => 3011 * 79 = B6F9

En ASM:
res = 73 * 6B => 3011 * 79 = 6F9

Quelqu'un aurait-il la solution ?
skirby
Dieu du cracking
Dieu du cracking
 
Messages: 2160
Inscription: 29 Novembre 2004, 09:53

Messagepar Deamon » 03 Mai 2007, 19:44

salut skirby, t'es sur que c'est pas l'inverse ?
car un unsigned short ça va de -32768 à 32767 non ? dans ce cas B6F9 ça dépasse.
Deamon

Les connaissances qu'on a cherchées restent, celles qu'on n'a pas cherchées se perdent. [Baden-Powell]
En un mot : cherche sur Google avant de demander !
Avatar de l’utilisateur
Deamon
Triumvirat
Triumvirat
 
Messages: 4374
Inscription: 25 Janvier 2004, 12:46
Localisation: Devant mon PC

Messagepar skirby » 03 Mai 2007, 20:54

Tu me dis qu'un unsigned short va de -32768 à 32767 :shock:
On parle d'un unsigned la :wink:

Sinon j'ai le même comportement sur Visual Studio 2005 et avec Pelles C :?
skirby
Dieu du cracking
Dieu du cracking
 
Messages: 2160
Inscription: 29 Novembre 2004, 09:53

Messagepar HolyView » 04 Mai 2007, 09:27

Dans tous les cas tu dépasses la taille de l'unsigned int ...
-> ton resultat = 1488905

Il te faut un long, et apres tu fais un AND $TrucNuche (ou un modulo ... je sais pas trop car j'arrive pas a comprendre comment t'obtiens les 2 resultats avec ton opération ...)
http://defisfc.free.fr : n'hesitez pas ! :)

J'aimerais bien avoir un peu de temps un jour, non pas pour me reposer mais pour faire ce que j'aime faire ... Le problème c'est que je suis crevé ...

Notepad++ :)
HolyView
Modérateur
Modérateur
 
Messages: 1740
Inscription: 08 Juillet 2004, 18:10
Localisation: Meurthe et Moselle

Messagepar skirby » 04 Mai 2007, 11:20

HolyView a écrit:Dans tous les cas tu dépasses la taille de l'unsigned int ...
-> ton resultat = 1488905

Il te faut un long, et apres tu fais un AND $TrucNuche (ou un modulo ... je sais pas trop car j'arrive pas a comprendre comment t'obtiens les 2 resultats avec ton opération ...)
Non, ça ne marchera pas.
En fait, il faut que j'arrive à comprendre comment fonctionne ce fichu opcode MUL.

Comment fait-il pour avoir 3011 * 79 = 6F9 :shock: alors qu'en C 3011 * 79 = B6F9

Petit rappel au cas ou: les valeurs sont en hexa.


HolyView a écrit:... je sais pas trop car j'arrive pas a comprendre comment t'obtiens les 2 resultats avec ton opération ...
Bah moi non plus, c'est bien la mon problème :wink:

As-tu essayer d'exécuter le code pour voir ?
skirby
Dieu du cracking
Dieu du cracking
 
Messages: 2160
Inscription: 29 Novembre 2004, 09:53

Messagepar Nodh » 04 Mai 2007, 15:40

Je voudrais pas embrouiller tout le monde maaaiiiiis...quand je fais le cacul sous la calculatrice de windows, j'obtiens B809 (word)...

Je suis pas encore dans les niveaux qui pourraient me permettre de vous aider mais si tu passais tout en DWORD en choppant les registres en entiers ??

Est ce que le MUL BYTE PTR [s+ECX] ne multiplierai pas qu'avec AL par hasard ? laissant AH de coté pour la multiplication...

Essayes peut etre:
MOV BL, BYTE PTR [s+ECX]
MUL EBX

Tiens nous au courant, ça me donne des idées (lol) :lol:
Avatar de l’utilisateur
Nodh
Débutant
Débutant
 
Messages: 38
Inscription: 10 Mars 2007, 19:52
Localisation: PUSH FR

Messagepar Deamon » 05 Mai 2007, 10:00

skirby a écrit:Tu me dis qu'un unsigned short va de -32768 à 32767 :shock:
On parle d'un unsigned la :wink:

oups :oops: au temps pour moi je n'ai rien dit ! :mrgreen:
Deamon

Les connaissances qu'on a cherchées restent, celles qu'on n'a pas cherchées se perdent. [Baden-Powell]
En un mot : cherche sur Google avant de demander !
Avatar de l’utilisateur
Deamon
Triumvirat
Triumvirat
 
Messages: 4374
Inscription: 25 Janvier 2004, 12:46
Localisation: Devant mon PC

Messagepar baboon » 05 Mai 2007, 10:34

petite remarque bete mais qui peu avoir son importance ...
Es tu sur que eax est a 0 dans la partie asm ????
MOV AL,BYTE PTR [s]
ne devrais tu pas faire un movzx ou un xor eax , eax avant ? (ou un and FF)
Newbie mais ayant soif d'apprendre et étant motivé
Avatar de l’utilisateur
baboon
Modérateur
Modérateur
 
Messages: 3347
Inscription: 08 Juillet 2005, 17:49

Messagepar HolyView » 05 Mai 2007, 14:01

Je voudrais pas embrouiller tout le monde maaaiiiiis...quand je fais le cacul sous la calculatrice de windows, j'obtiens B809 (word)...


Ben c'est ce que je disais .. lapin compris non plus ...
http://defisfc.free.fr : n'hesitez pas ! :)

J'aimerais bien avoir un peu de temps un jour, non pas pour me reposer mais pour faire ce que j'aime faire ... Le problème c'est que je suis crevé ...

Notepad++ :)
HolyView
Modérateur
Modérateur
 
Messages: 1740
Inscription: 08 Juillet 2004, 18:10
Localisation: Meurthe et Moselle

Messagepar skirby » 07 Mai 2007, 08:29

Salut Nodh,

Comme c'est ton défi, tu pourrais peut être me dire comment tu as fait ta multiplication.
Ca m'arrangerais de comprendre ce mystère.
Et puis j'aime pas ne pas comprendre un truc aussi bête.
skirby
Dieu du cracking
Dieu du cracking
 
Messages: 2160
Inscription: 29 Novembre 2004, 09:53

Messagepar Morgatte » 19 Mai 2007, 15:27

Hello,

Je profite de votre petite discution pour que vous m'éclairiez sur un point.
Je ne connais pas grand chose en C ni C++, mais ça m'intéresse.

J'ai récupéré Dev-C++ et j'ai testé le code ci-dessus en tant que projet de type Application Console en C. Et il ne reconnait pas la ligne _asm {

Il y a une erreur de compilation. Qu'est ce que j'ai loupé ?
@+
Morgatte
Apprenti
Apprenti
 
Messages: 67
Inscription: 15 Juin 2004, 21:55

Messagepar baboon » 19 Mai 2007, 15:40

trouve avec google (notre ami a tous :p )
http://www.siteduzero.com/forum-83-61496-p1-dev-c-quel-assembleur-utilise-il.html a écrit:OUI il y a une synthaxe différente de l'assembleur sous Dev-Cpp.

Par exemple sous Visual C++ on peu ecrire ceci en assembleur inline :

_asm
{
MOV AL,5
};

Mais sous Dev-Cpp la synthaxe est différente car L'assembleur inline avec devcpp est celui de gcc (syntaxe AT&T).


Donc apperemment le code de skirby doit etre compile par Visual C++

(la syntaxe AT&T pour le peu que j'en ai vu est ignoble .. je me demande quel tordu a cree ca ..)
Newbie mais ayant soif d'apprendre et étant motivé
Avatar de l’utilisateur
baboon
Modérateur
Modérateur
 
Messages: 3347
Inscription: 08 Juillet 2005, 17:49

Messagepar skirby » 19 Mai 2007, 20:55

En effet, Dev-Cpp (qui est une IDE soit dit en passant) utilise la syntaxe AT&T très différentes de la syntaxe Intel.
Il te faut soit Visual C++ ou Pelles C.
Tu peux trouver Visual Express 2005 qui est gratuit est très puissant.
Ne pas oublier de récupérer le SDK de Microsoft au passage.
skirby
Dieu du cracking
Dieu du cracking
 
Messages: 2160
Inscription: 29 Novembre 2004, 09:53

Messagepar Nats` » 20 Mai 2007, 22:17

J'ai pas trop suivi la discussion mais pour le AT&T:
- Il me semble que dev-cpp se base sur GCC si c'est le cas en googlant sur GCC + syntax intel vous trouverez votre bonheur pour utiliser du intel avec gcc (OUI OUI c'est possible) une option de compile et un "flag" à ajouter dans le source si je me rappel bien :)
Nats`
 

Messagepar skirby » 20 Mai 2007, 22:23

Plus simplement, il te suffit de faire une recherche sur le forum et hop, tu trouves ça :
http://s141422204.onlinehome.fr/forum/v ... ht=asm+gcc
skirby
Dieu du cracking
Dieu du cracking
 
Messages: 2160
Inscription: 29 Novembre 2004, 09:53


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron