IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

[NASM][Win] Invalid combination of opcode and operands


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre confirmé Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut [NASM][Win] Invalid combination of opcode and operands
    Hello tout le monde.

    j'ai mis sur un site le code d'un programme...
    c'est du windows / nasm
    et j'ai une trentaine d'erreurs avec le meme code
    je me suis bougé, j'ai fait google....
    et j'ai eu, comme je m'y attendais,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     > io.s:8: error: invalid combination of opcode and operands
     
     Correct. The operands either need to be of the
     same size, or you need to use MOVSX or MOVZX.
     
     > io.s:18: error: invalid combination of opcode and operands
     
     Correct. The OUT operands are restricted/fixed.
     Take a look at Intel/AMD"s reference manuals.
    la, j'ai remplacé un mov par un movzx,
    ca n'a pas marché, et je me dit que si quelqu'un
    n'est pas un newbie comme moi, il me donnera le truc en une seconde...
    et du meme coup un grand coup de motiv !

    Je sais que c'est un "extra", mais si quelqu'un a cette gentillesse,
    je n'aurai pas perdu ma journée...

    http://arnaudv6.free.fr/upload/rem2.html
    avec les erreurs a la fin
    ou en .asm pour le recompiler
    http://arnaudv6.free.fr/upload/rem2.asm

    je pense par ailleur que le code est interressant, meme si pas totalement complet : c'est un rewrite d'un code d'Iczelion pour se passer des .inc

  2. #2
    Membre confirmé Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut
    ya personne qu'a l'idée, pour un au moins ?
    ou ma question est trop bete/simple ? 8)
    je n'arrive pas a trouver la combinaison de mov qui va...

  3. #3
    Membre confirmé Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut
    Désolé, free plante, les codes ne sont accessibles que de temps en temps

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut
    Houlà, du calme, on est pas pressés ici. Laisse au moins 24 heures avant de crier à l'urgence.

    * Blustuff regarde une vache passer sur le forum, en ruminant un chewmgum

    Hmm... Alors, c'était quoi cette question ? Ah oui ! Ben, ton assembleur semble buter sur toutes les variables définies par "resd". Mais au juste, c'est quoi "resd" ?

  5. #5
    Membre confirmé Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut
    Blustuff m'évite de crier au meurtre, Alleluia !
    mon assembleur ne bloque pas sur les resd,
    mais sur les mov, du moins je pense.

    resd sert dans nasm a reserver de la memoire non-initialisée
    (reserve-double)...

    c'est bien des doubles, les variables windows ?

    après coup, je suis désolé :
    mon fichier htm ne contient pas de numérotage des lignes...

    Merci Blustuff : vie=>espoir

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Par défaut
    Bonjour,
    en syntaxe nasm, un label c'est une adresse.

    Par exemple :
    hInst est l'adresse d'un dword.
    Pour signifier la case mémoire, il faut mettre le label entre crochets [].
    Par exemple :
    pour mettre dans le dword d'adresse hInst la valeur dans eax, il faut écrire :
    mov [hInst], eax.

    Voilà pour les erreurs :
    rem2.asm:87: error: invalid combination of opcode and operands
    rem2.asm:99: error: invalid combination of opcode and operands
    etc.

    Au passage, il y a dans le code des erreurs du même type 'dans l'autre sens' que nasm n'a pas signalées car le code est correct même s'il ne fait pas ce qui est attendu.
    Par exemple :
    135 push hInst
    L'argument de CreateWindowExA attendu est [hInst] : la valeur et non l'adresse.
    Cet appel correct est (134 à 148):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    push 0
    push [hInst]
    push 0
    push 0
    push 200
    push 350
    push 0x0000 ;suite
    push 0x8000 ;CW_USEDEFAULT
    push 0000h  ;suite
    push 90CBh  :WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT
    push AppName ; là c'est bon, c'est l'adresse, char * en C
    push ClassName
    push 0200h ;suite
    push 0000h ;WS_EX_CLIENTEDGE
    call __imp_CreateWindowExA
    Pour ce qui est des erreurs du type :
    rem2.asm:95: error: invalid combination of opcode and operands
    call n'est pas une macro, on doit écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    push eax
    call __imp_ExitProcess
    Bon, voilà pour un début, je n'ai pas vraiment tout regardé.

  7. #7
    Membre confirmé Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut
    Merci 1000 fois !
    j'ai gagné beaucoup de temps... je ne cherchais pas dans la bonne direction

    Vraiment merci, zertur.

  8. #8
    Membre confirmé Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut
    Je remet le sujet sur la table une paire de secondes :
    j'ai remis le code en ligne....
    je cherche depuis plusieurs jours ce qui foire a l'edition des liens :
    je linke avec alink, tres puissant, mais "abandonnware" et non-documenté...
    pas tres pratique, deplus, il ne donne pas de précision sur la localisation de l'erreur.
    http://arnaudv6.free.fr/upload/rem2.asm
    http://arnaudv6.free.fr/upload/rem2.obj

    voila, et puis mes lignes de commande, sait-on jamais....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nasm -fobj  rem2.asm
    alink -oPE rem2.obj win32.lib
    alink est dispo ici :
    http://alink.sourceforge.net/

    J'ai 30 fois exactement la meme erreur au linkage :
    Relocs 1:Warning 32 bit offset in 16 bit field
    Où 1 est va jusqu'a 98... incrémenté irrégulièrement.

    Bien.... Merci d'avance a ceux qui jetteront un oeil,
    j'ai taché d'être complet...
    la réponse tient en une phrase, mais je ne la trouve pas
    Arnaudv6

  9. #9
    Membre confirmé Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut
    Que Zetur me pardonne :
    j'ai corrigé hier chez moi deux erreurs de crochets...

    Bon, pour le linkage, personne ?
    et quelqu'un a-t'il un autre linker a me proposer ?

    je ne pense pas que l'erreur vienne de la ligne de commande,
    ni meme du linker lui meme... ca vient du code,
    mais la dénomination de l'erreur est un peu imprécise....

    peut-etre fais-je mal mes call vers l'API windows:
    sous tasm, on devait préciser call far
    sous nasm, comment ca marche ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Par défaut
    Bonjour,

    pour ce qui est des call :
    je ne sais pas ce que représente __imp_ mais avec nasm, les appels se font :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    EXTERN GetMessageA
    IMPORT GetMessageA user32.dll
    call [GetMessageA]
    sinon, en regardant le code, je vois des choses qui me semblent étranges.
    Par exemple, je vois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    section .bss
    wndclass:
    clsstyle           dd 4003h; class style
    clslpfnWndProc     resd 1
    clscbClsExtra      dd 0
    clscbWndExtra      dd 0
    clshInstance       resd 1; instance handle
    clshIcon           dd 0; class icon handle
    clshCursor         dd 0; class cursor handle
    clshbrBackground   dd 0; class background brush
    clslpszMenuName    dd 0; menu name
    clslpszClassName   resd 1; far ptr to class name
    clshIconSm   resd 1
    je pense que c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    section .data
     
    wndclass:
    clsstyle           dd 4003h; class style
    clslpfnWndProc     dd 0
    clscbClsExtra      dd 0
    clscbWndExtra      dd 0
    clshInstance       dd 0; instance handle
    clshIcon           dd 0; class icon handle
    clshCursor         dd 0; class cursor handle
    clshbrBackground   dd 0; class background brush
    clslpszMenuName    dd 0; menu name
    clslpszClassName   dd 0; far ptr to class name
    clshIconSm   dd 0
    De même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WndProc:
    pop word [hWnd]
    pop word [uMsg]
    pop word [wParam]
    pop word [lParam]
    ;on a popé tous les arguments
    Ceci ne va pas à mon avis, les arguments sont plus haut dans la pile.
    hWnd est à esp+4
    uMsg est à esp+8
    wParam est à esp+12
    lParam est à esp+16
    d'après moi.
    De plus, ce sont des dwords je pense.

    Et il y a encore bien d'autres problèmes ...

  11. #11
    Membre confirmé Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut
    Merci beaucoup !
    je regarde des que je suis chez moi !

  12. #12
    Membre confirmé Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut
    J'ai trouvé !

    ... dans un de mes anciens programmes

    je déclarais simplement mal mon segment :

    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [segment code public use32]
    Un grand merci a ceux qui ont eu la patience :o

  13. #13
    Membre confirmé Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut
    Le thread est beaucoup lu...
    et google ne proposait aucun résultat pour ce type d'erreur...
    voilà don cpour ceux que ca interresse,
    un programme [nasm][alink][win32] type.
    bonne prog

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    ;nasm fichier.asm -fobj
    ;alink fichier.obj -oPE
     
    extern ExitProcess
    import ExitProcess  kernel32.dll
    extern MessageBoxA
    import MessageBoxA  user32.dll
     
    [section code class=code align=16 use32]
    ;le class= code sert quand meme a donner le entry point
    ..start:
     
    push dword 0
    push dword Titre
    push dword Avril
    push dword 0
    call [MessageBoxA]
     
    push dword 0
    call [ExitProcess]
     
    [section .data align=4 use32]
    Avril	   dd "Avril",0
    Titre	   dd "Titre",0
    Arnaudv6

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/02/2009, 14h20
  2. [SQL server] utilisation combinée de AND et OR
    Par igorzup dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/01/2007, 10h48
  3. [GTK] Win 32 and the Gimp
    Par Jean_Benoit dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 07/09/2006, 09h29
  4. [Nasm][Linux] Open and read
    Par daedric dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 28/07/2006, 12h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo