Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

inline assembly in vc++

6 views
Skip to first unread message

assa

unread,
Jul 17, 2003, 10:52:18 AM7/17/03
to
Salve a tutti, ho un problema con l'istruzione __asm in vc++, spero possiate
aiutarmi.
Allora, ho fatto con vc++ un nuovo progetto Dll, a cui faccio esportare la
funzione AsmTest, implementata come segue:

void __stdcall AsmTest(HDC hdc)
{
__asm
{
mov eax, 255
push eax
mov eax, 0
push eax
push eax
mov eax, hdc
push eax
call SetPixel
}
}

questo dovrebbe richiamare la funzione SetPixel(hdc, 0, 0, 255) per
disegnare un punto rosso sullo schermo, ma appena cerco di richiamare la
funzione AsmTest crasha tutto rovinosamente con un classico 'la memoria non
poteva essere "read"'.
Qualcuno sa da cosa potrebbe essere provocato?
grazie, assa.


Antonio Mazzeo

unread,
Jul 17, 2003, 10:58:31 AM7/17/03
to

"assa" <as...@assa.it> wrote in message
news:bf6daf$bgur7$1...@ID-60516.news.uni-berlin.de...

> Salve a tutti, ho un problema con l'istruzione __asm in vc++, spero
possiate
> aiutarmi.
> Allora, ho fatto con vc++ un nuovo progetto Dll, a cui faccio esportare la
> funzione AsmTest, implementata come segue:
>
> void __stdcall AsmTest(HDC hdc)
> {
> __asm
> {
> mov eax, 255
> push eax
> mov eax, 0
> push eax
> push eax
> mov eax, hdc
> push eax
> call SetPixel
> }

oltre a __stdcall la dll deve essere dichiarata col modificatore
__declspec(dllexport)

extern "C"
__declspec(dllexport) void WINAPI AsmTest(HDC hdc)
{
}

molto propabilemente se crasha prima di call SetPixel è x il modo in cui
passi i parametri

prova a usare il codice fuori dalla dll e vedi se funziona.. se funziona il
problema sta nel modo in cui è compilata la dll


assa

unread,
Jul 17, 2003, 11:47:53 AM7/17/03
to
Antonio Mazzeo wrote:
[cut]

> molto propabilemente se crasha prima di call SetPixel è x il modo in
> cui passi i parametri

se lascio tutto cosi' e commanto la chiamata a SetPixel mi da' errore di
convenzione di chiamata, se metto il call crasha. Anche aggiungendo tutto
ciò che mi hai scritto alla definizione della funzione.

> prova a usare il codice fuori dalla dll e vedi se funziona.. se
> funziona il problema sta nel modo in cui è compilata la dll

ho provato lo stesso codice in un nuovo progetto e il risultato è pressapoco
lo stesso, appena incontra quelle istruzioni da' un errore del tipo
"First-chance exception in test.exe: 0xC0000005: Access Violation."
e mi fa vedere la finestra Disassembly mettendomi la freccetta sulla riga
del retf:
"
__imp__SetPixel@16:
0053E168 retf
0053E169 jno __imp__BitBlt@36+3 (0053e15f)
0053E16B ja __imp__GetROP2@4+3 (0053e0f3)
0053E16D ???
...
"

non ho idea di quale possa essere il problema, sai aiutarmi?
grazie, assa.


Antonio Mazzeo

unread,
Jul 18, 2003, 2:22:08 AM7/18/03
to

"assa" <as...@assa.it> wrote in message
news:bf6gas$b275m$1...@ID-60516.news.uni-berlin.de...

> se lascio tutto cosi' e commanto la chiamata a SetPixel mi da' errore di
> convenzione di chiamata, se metto il call crasha. Anche aggiungendo tutto
> ciň che mi hai scritto alla definizione della funzione.

ho guardato il codice stavolta :) e ho fatto anche una prova.. distrazione
mia che ho pensato che
stessi sbagliando a richiamare la dll

il problema č che tu stai sbagliando a chiamare le api

se tu guardassi tutte le chiamate che genera il compilatore, non vedrai mai
un call SetPixel ma bensě
un call dword ptr [SetPixel], xchč per te SetPixel non č altro che un valore
nella sezione DATA che contiene
a sua volta l'indirizzo effettivo all'interno della GDI dove si trova
l'entry point dell'api

CALL DWORD PTR [SetPixel]
al posto di CALL SetPixel

ciao
antonio


assa

unread,
Jul 18, 2003, 7:30:01 AM7/18/03
to

giusto :) cosě funziona infatti :-D
eppure se faccio un programma completamente con MASM32 e uso il semplice
call SetPixel funziona... fa lui in automatico la conversione?

poi volevo anche chiedere, se dovessi fare una procedura che elabora delle
immagini pixel a pixel sarebbe sensato usare GetPixel e SetPixel oppure ci
sono metodi migliori o piů veloci?
grazie, assa.


Antonio Mazzeo

unread,
Jul 18, 2003, 7:29:49 AM7/18/03
to
il masm lo fa in automatico, anche xchè gli puoi aggiungere i parametri
tramite la virgola..

CALL SetPixel, HDC, X, Y, COLORREF ... che assembly non è di sicuro

per quanto riguarda il GetPixel / SetPixel non credo che chi fa elaborazione
digitale lavora sulla copia a video, credo che lavori
direttamente su un livello che poi visualizza a video (anche xchè se x
accedere a quello che c'è sul video devi fare Get/Set x ogni
pixel mo ti sbrighi). .. di gdi non sono esperto.. però credo esista
qualcosa sulle regioni ... ti conviene guardare direttamente msdn

antonio


AAARRRGH

unread,
Jul 19, 2003, 12:09:50 PM7/19/03
to
Il Fri, 18 Jul 2003 11:29:49 +0000, Antonio Mazzeo scrisse:

> il masm lo fa in automatico, anche xchè gli puoi aggiungere i parametri
> tramite la virgola..
>
> CALL SetPixel, HDC, X, Y, COLORREF ... che assembly non è di sicuro

non ho mai capito (tra le tante cose) perche' MASM debba usare invoke per
passare i parametri sulla stessa linea di chiamata , mentre TASM usa la
stessa "call " (con un stdcall ad esempio in testa al listato).
Odio il superfluo.

Quake2

unread,
Jul 20, 2003, 1:20:36 AM7/20/03
to
veramente masm è più corretto, perché invoke è una macro che pusha i
parametri che gli passi sullo stack e poi chiama la funzione con call,
mentre tasm potrebbe confondere, metti che arriva uno che programma da
poco in asm e vede:

call f, p1, p2

che potrebbe pensare?
che la call ha 3 parametri, quando non è assolutamente vero, mentre se
vede invoke, gli viene il sospetto che quell'istruzione in x86 non
esiste, quindi cerca di capire cos'è
almeno io la penso così, poi ognuno ha i suoi punti di vista :)

0 new messages