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

Résolu
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013 - 17 avril 2012 à 15:48
BruNews Messages postés 21040 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

7 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 avril 2012 à 14:06
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++
3
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
19 avril 2012 à 23:43
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é ?
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 avril 2012 à 09:10
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++
0
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
19 avril 2012 à 11:40
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 avril 2012 à 09:55
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++
0
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
20 avril 2012 à 09:58
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 !
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 avril 2012 à 15:38
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++
0
Rejoignez-nous