.code
start:
[...]
invoke Telecharger Fichier1,Fichier11 => invoke Telecharger, addr Fichier1, addr Fichier11
;on pousse sur la pile l'addresse de la variable Fichier1 et Fichier11
[...]
Telecharger proc Url:byte, Fichier:byte => Telecharger proc Url :DWORD, Fichier:DWORD
=>Donc dans Url, on aura l'adresse de la variable Fichier1
=> Et dans Fichier, on aura l'adresse de la variable Fichier11
local Buffer[1024] :byte
local Buffersize :dword
local UrlFichier[256]:byte
local CheminFichier[256]:byte
pop UrlFichier
pop CheminFichier
invoke InternetOpen,addr Nom,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
mov Ouvert,eax.if Ouvert INVALID_HANDLE_VALUE;donc0
jmp @Erreur
.endif
;!!!!!!!!!!!!!!
;Et c'est la que l'API n'accepte pas ma chaîne de caractère!
;alors que si je remplace par 'addr Fichier1' tout se passe bien
;et même chose pour la variable 'Fichier' que j'utilise plus loin
invoke InternetOpenUrl,Ouvert,addr Url,NULL,0,INTERNET_FLAG_RELOAD,0
=> invoke InternetOpenUrl,Ouvert, Url,NULL,0,INTERNET_FLAG_RELOAD,0
donc faut pas mettre "addr Url", mais Url tout court, car sinon tu pousses sur la pile l'addresse de Url, et non son contenu qui contient l'addresse de ta variable Fichier1
cs_redwings
Messages postés24Date d'inscriptionjeudi 2 décembre 2004StatutMembreDernière intervention28 avril 20082 18 déc. 2004 à 23:04
resonnement TASM
l'idee est de creer la fonction en utilisant une variable dans laquelle on stockera plus tard au programme principale et juste avant l'appel de la fonction, la chaine dont on a besoin
sinon, a l'entree de ta fonction ta pile a été incrémentée de seulement 1 octet pour le parametre. Forcement -> Plantage vu que tu attends un pointeur de 4 octets.
ce n'est pas le caractere qui est passé en param mais bien le pointeur 32bit.
@++
Vous n’avez pas trouvé la réponse que vous recherchez ?
flagyg
Messages postés50Date d'inscriptionsamedi 1 septembre 2001StatutMembreDernière intervention20 septembre 2006 19 déc. 2004 à 11:43
euh je ne sais pas si vous avez bien compris mon probème..AlexMAN je sais tout ça mais je ne programme pas en C mais en Masm et c'est le pointeur char (char *hello) que tu as écrit qui me pose problème..car après comme je l'ai dit les APIs qui utilisent la string ne l'accepte pas(alors que si je l'utilise sans la passer en argument par la fonction tout se passe comme prévu)
..pour que ça soit plus compréhensible je vais donner les bouts importants du vrai programme:
local Buffer[1024] :byte
local Buffersize :dword
local UrlFichier[256]:byte
local CheminFichier[256]:byte
pop UrlFichier
pop CheminFichier
invoke InternetOpen,addr Nom,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
mov Ouvert,eax.if Ouvert INVALID_HANDLE_VALUE;donc0
jmp @Erreur
.endif
;!!!!!!!!!!!!!!
;Et c'est la que l'API n'accepte pas ma chaîne de caractère!
;alors que si je remplace par 'addr Fichier1' tout se passe bien
;et même chose pour la variable 'Fichier' que j'utilise plus loin
flagyg
Messages postés50Date d'inscriptionsamedi 1 septembre 2001StatutMembreDernière intervention20 septembre 2006 19 déc. 2004 à 11:48
ah désolé j'ai répondu en meme temps que vos autre réponses.
Ah ok merci je vais essayer ça...
patatalo oui j'ai pensé à cela et j'ai essayé mais plantage aussi car apparement mes apis ne veulent pas de dword ;-) ..
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 19 déc. 2004 à 15:37
Les APIs ne prennent QUE du DWORD en param, c'est a dire 4 octets par param pour un prog 32 bits.
Le prends pas mal mais quand je vois par exemple:
mov Connexion,eax
.if Connexion == INVALID_HANDLE_VALUE
...
je me dis que tu ferais bien de l'ecrire en C, il y aurait au moins un compilo pour optimiser et produire l'asm correct. Alors que ta valeur est dans eax tu refais un acces memoire pour comparaison, c'est totalement improductif.
Apprends a ecrire de l'asm plutot que du sabir (invoke, .if, etc...), le moins bon des compilos C de maintenant produira un meilleur code.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 20 déc. 2004 à 13:05
re,
non car:
invoke Telecharger OFFSET Fichier1, OFFSET Fichier11
donne
push 403000h ; par exemple
push 403100h ; par exemple
call Telecharger
que:
invoke Telecharger ADDR Fichier1, ADDR Fichier11
donne
lea eax,403000h ; par exemple
push eax
lea eax,403100h ; par exemple
push eax
call Telecharger
ADDR, je l'utilise quand les variables sont locales et OFFSET quand c global.
mygiorgio
Messages postés12Date d'inscriptionmercredi 3 novembre 2004StatutMembreDernière intervention 1 octobre 2005 1 oct. 2005 à 23:02
Bon, j'avoue, c'est pas si simple ...
J'ais quand meme reusit a faire un petit exemple pour t'aidé un peu (étant donné que tu n'a pas reusit, sinon, tu serai venu posté un petit bout de code )
Des critiques, des suggetstions, ameliorations. Ca me serrais utile a moi et au autre.
.386
.model flat,stdcall
option casemap:none
connect proto
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\wininet.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\wininet.lib
.data
AppName db "web browser",0
ok db "Ok!",0
bad db "Erreur",0
site db "http://www.google.fr",0
server db "www.google.fr",0
UserName db "loginHTACCES",0
PassWord db "passHTACCES",0
.data?
; [...]
buffer db 5120 dup(?)
hInternet DWORD ?
NetSucces DWORD ?
hConnectSession DWORD ?
ByteRead DWORD ? ; poiteur de la chaine de carractere recut (queue == a string)