CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Récupéré une variable C++ en ASM...

Blawk
Blawk
Niveau 10
02 septembre 2003 à 12:32:42

Voilà un petit programme:

  1. include < iostream>

using namespace std;

int main() {

int a = 2;

__asm {
mov eax, dword ptr [ebp-4];
shl eax, 1;
mov dword ptr [ebp-4], eax;
};

cout < < a < < endl;
// Sortie: " 4"

return a;
}

Donc le but de la manoeuvre est de multiplier ´a´ par 2. Aucun problèmes...

Sauf UN: Je sais que ´a´ est la première varible déclarée et que donc sont adresse mémoire est ebp-4. Mais si je ne le savais pas, comment devrai-je faire ?

JeanYvesYves
JeanYvesYves
Niveau 10
02 septembre 2003 à 13:13:39

tu veux multiplier a par 2 ?

essaie ça :

void main()
{
int a;
_asm
{
mov ax,a
shl ax,1
mov a,ax
}
cout < < a < < endl;
}

JeanYvesYves
JeanYvesYves
Niveau 10
02 septembre 2003 à 13:14:53

faut peut etre mettre eax a la place des ax pardon : je programmais en ASM sous DOS : 16 bits.

SHL est une astuce pour multiplier par 2.

Sinon utilise MUL
mais je te conseille SHL

Blawk
Blawk
Niveau 10
02 septembre 2003 à 13:23:26

La multiplication par deux était juste un prétexte, a*2 est plus simple :-))) .

Ce que ej en savais pas, c´est que l´on pouvait directement utilisé le nom de la variable dans le bloc ASM.

Blawk
Blawk
Niveau 10
02 septembre 2003 à 13:25:14

Sinon, question bète, si ma variable s´appelle eax, comment je fais ? :-)

Lightness1024
Lightness1024
Niveau 10
02 septembre 2003 à 13:30:02

une reference.

Blawk
Blawk
Niveau 10
02 septembre 2003 à 13:34:28

Il n´y a pas de notation spéciale pour indiqué que eax n´est pas le registre mais un variable ?

JeanYvesYves
JeanYvesYves
Niveau 10
02 septembre 2003 à 13:38:14

Belle remarque :)

mais a mon avis, évite d´appeler ta variable eax :)

pour multiplier par 3 par exemple :

mov eax,a
mov bx,3
mul bx
mov a,eax

je crois. Je ne me suis pas servi de MUL depuis longtemps.

JeanYvesYves
JeanYvesYves
Niveau 10
02 septembre 2003 à 13:38:53

autre chose, ça doit peut etre dépendre des langages, mais dans le corps assembleur, pas de " ;"

Blawk
Blawk
Niveau 10
02 septembre 2003 à 13:48:21

VC++ à l´air de les accepter... Mets je retiens quand même.

Merci JYY.

Blawk
Blawk
Niveau 10
02 septembre 2003 à 13:50:35

Et pour les IF, comment fait-on pour dire " tu saute trois ligne plus loin ? "

Lightness1024
Lightness1024
Niveau 10
02 septembre 2003 à 17:24:23

normalement c instruction JE ( jump if equal) et jne ( jump if not equal) et d´autres comme " compare" dont je ne connais pas les noms.

normalement c des instructions sur 5 octets ( je crois) tu met les operandes et ensuite l´adresse ou tu veux ke ca aille. tu dois savoir ca non ?

je pense qu´il existe un registre qui pointe vers la ligne courante du code un de la liste SI, DI, EBP tout ca tu as qu´a mettre + nbd´octetdesinstructionsasauter

enfin je spécule mais g jamais programmé en assembleur de départ. ce que je veut dire c ke le seul assembleur que je connaisse c´est l´assembleur désassemblé.
et en assembleur désassemblé et ben on voit les addresses completes absolues.

Blawk
Blawk
Niveau 10
02 septembre 2003 à 19:03:48

Ok.

Blawk
Blawk
Niveau 10
02 septembre 2003 à 19:05:10

C´est EIP qui semble pointer vers la ligne courante.

Kelios
Kelios
Niveau 8
03 septembre 2003 à 00:43:00

En fait, c´est même CS:EIP qui pointe :-)))
Quoique, tu vas me dire, sous Win32, ça ne sert pas beaucoup, CS....

" normalement c instruction JE ( jump if equal) et jne ( jump if not equal) et d´autres comme " compare" dont je ne connais pas les noms.

normalement c des instructions sur 5 octets ( je crois)"
->>>
-------------------------------------
Bare Hex Opcodes And Mnemonics

This list include opcodes that are not in the main listing.

NOTE : There are redundancies in the Intel instruction set which show in this list as duplication of both hex opcodes and mnemonics.

More detailed reference can be found in the Intel Architecture Software Developer’s Manual Volume 2 : Instruction Set Reference found in the file " 24319101.PDF" from Intel.

0F 80 JO
0F 81 JNO
0F 82 JB
0F 82 JC
0F 82 JNAE
0F 83 JAE
0F 83 JNB
0F 83 JNC
0F 84 JE
0F 84 JZ
0F 85 JNE
0F 85 JNZ
0F 86 JBE
0F 86 JNA
0F 87 JA
0F 87 JNBE
0F 88 JS
0F 89 JNS
0F 8A JP
0F 8A JPE
0F 8B JNP
0F 8B JPO
0F 8C JL
0F 8C JNGE
0F 8D JGE
0F 8D JNL
0F 8E JLE
0F 8E JNG
0F 8F JG
0F 8F JNLE
38 CMP
39 CMP
3A CMP
3B CMP
3C CMP
3D CMP

70 JO
71 JNO
72 JB
72 JC
72 JNAE
73 JAE
73 JNB
73 JNC
74 JE
74 JZ
75 JNE
75 JNZ
76 JBE
76 JNA
77 JA
77 JNBE
78 JS
79 JNS
7A JP
7A JPE
7B JNP
7B JPO
7C JL
7C JNGE
7D JGE
7D JNL
7E JLE
7E JNG
7F JG
7F JNLE

80 CMP
81 CMP
83 CMP
A6 CMPS
A6 CMPSB
A7 CMPS
A7 CMPSD
A7 CMPSW

D8 D0 FCOM
D8 D1 FCOM
D8 D8 FCOMP
D8 D9 FCOMP
D8 FCOM
D8 FCOMP
DA FICOM
DA FICOMP
DB E8 FUCOMI
DB F0 FCOMI
DC FCOM
DC FCOMP
DD E0 FUCOM
DD E1 FUCOM
DD E8 FUCOMP
DD E9 FUCOMP
DE FICOM
DE FICOMP
DF E8 FUCOMIP
DF F0 FCOMIP

E0 LOOPNE
E0 LOOPNZ
E1 LOOPE
E1 LOOPZ
E2 LOOP

E3 JCXZ
E3 JECXZ

E9 JMP
EA JMP
EB JMP

F2 A6 REPNE
F2 A7 REPNE
F2 AE REPNE
F2 AF REPNE
F3 6C REP
F3 6D REP
F3 6E REP
F3 6F REP
F3 A4 REP
F3 A5 REP
F3 A6 REPE
F3 A7 REPE
F3 AA REP
F3 AB REP
F3 AC REP
F3 AD REP
F3 AE REPE
F3 AF REPE

FF JMP
-------------------------------------

Hum... c´est quelque part :)
Merci, opcode.hlp de masm32 :ok:

Kelios
---------

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment