Comment utiliser une variable ?! lorsque l'on utilise déjà ESI et EDI dans la PR [Résolu]

Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
- - Dernière réponse : BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
- 20 avril 2012 à 15:38
Voilà mon problème, je débute en assembleur et je l'utilise essentiellement pour créer des procédure pour visual basic ou C
voici une de mes procédure (ne regarder pas le code elle plante, et c'est afreusement complexe de la réparer), et j'aimerais pouvoir utiliser des variable, tel que saut:word , nb_octets:word , etc...
j'ai vue cela :
Nom_Tableau2 DW 0 Dup (125) pour initialiser un tableu de 125 double mots
initialisé à 0 !
Mais ensuite comme l'utiliser "Assume Cs : Code, Ds : Data" fait planter
peut-être parce que j'utilise ESI et EDI !
...
BREF j'espère tombé sur un programmeur en assembleur, je sais qu'il
pourra me répondre rapidement, car moi je fait tout planter ...


ma procédure :
rgb_resize proc export rgb_source:ptr,rgb_desti:ptr,lx:word,ly:word
PUSH ESI
PUSH EDI
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
mov ax,ly

mov esi,rgb_source
mov edi,rgb_desti
add edi,12
mov ax,lx
mov ecx,[esi]
mov eax,4
mov eax,ecx
mul eax
mov ecx,eax
dec ecx
cmp ecx,0
jne LIGNE_1
mov ecx,1
LIGNE_1:
mov ax,lx
mov edx,[esi]
push ecx
mov cx,lx
mov eax,ebx
div ecx
mov ebx,eax
pop ecx
cmp ebx,1
jae LIGNE_2
mov ebx,1
LIGNE_2:
inc esi

cmp eax,1
jb LIGNE_3
xor ax,ax
push ax
boucle2:
pop ax
inc ax
push ax
cmp ax,ly
jbe LIGNE_4
jmp fin
LIGNE_4:
xor ax,ax
mov edx,edi
add edx,400000
boucle1:
cmp edi,edx
jb LIGNE_5
jmp fin
LIGNE_5:
;[edi]=[esi]
push eax
mov eax,[esi]
mov [edi],eax
pop eax
add esi,4
add edi,4
inc ax
cmp ax,bx
jae LIGNE_6
jmp boucle1
LIGNE_6:
add esi,ecx
jmp boucle1
LIGNE_3:

fin:

pop ax
fin2:
POP EDI
POP ESI
RET
rgb_resize ENDP
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
3
Merci
Disons qu'on fait ASM 322 bits.
On a besoin de 3 "variables" int32:

sub esp, 12
On a donc:
var1 en [esp]
var2 en [esp + 4]
var2 en [esp + 8]

var1 = 0, devient:
mov dword ptr[esp], 0

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 219 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
3
Merci
merci cela marche !
j'ai enfin des variable et avec :
a2 equ word ptr[esp+4]
ma variable s'appelle bien a2
donc exemple :
push esi
push edi
...
sub esp, 12
a1 equ dword ptr[esp+0]
a2 equ word ptr[esp+4]
a3 equ dword ptr[esp+6]
mov eax,a2
...
...etc.
add esp, 12 ;<<< sinon les pop vont avoir mal
...
pop edi
pop esi

En fait j'y avais penser d'utiliser le compteur des push et pop(ESP), mais je ne sais pas la peur de l'écran BLEU !!!
merci beaucoup !
par contre juste comme cela, tu n'as pas peur que la pile soit pleine ,... on est pas dans la mémoire vive là, c'est pas de la vrai mémoire alloué ?

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 219 internautes nous ont dit merci ce mois-ci

Commenter la réponse de rebixav
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
rgb_resize proc ; ET RIEN D'AUTRE
A toi de gerer la recup des params (offset ESP ou registre).
Remonter ESP en sortie (RET xxx).
EBX est a sauvegarder.
Assume ... RIEN DU TOUT, sous Windows nous sommes en FLAT model.
etc, etc.
Tu trouveras des tas de mes sources C (sur cppfrance) qui contiennent de l'ASM.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
0
Merci
Heuuu !
je suis pas sure que tu as compris en faite j'aimerais avoir des variable en plus dans mon ASM, pour travailler mon code !
exemple :
au lieu de :

mov ecx,0
boucle1:
add ecx,10
...
...
cmp ecx,100
jne boucle1

j'aimerais

mov compteur,0
boucle1:
add compteur,10
...
...
cmp compteur,100
jne boucle1
Commenter la réponse de rebixav
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Taille de pile est fixée à la compilation par un switch linker.
C'est la responsabilité du developpeur de ne pas aller trop bas.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
0
Merci
Est ce que l'on peut préparer en Routine ASSEMBLEUR un tableau mémoire de plusieurs Mo, donc sans utilisé la pile, en faite préparer un espace mémoire comme Visual BASIC !
Commenter la réponse de rebixav
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Sous Windows:
Appeler HeapAlloc() ou VirtualAlloc().

A noter que VirtualAlloc garantit un pointeur aligné sur taille de page mémoire (align 16), idéal pour calculs packés (SSE).

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews