|
| assembler og visual c Fra : helleskov@vip.cyberc~ |
Dato : 02-10-01 21:23 |
|
Hej,
Jeg har nu i et par dage prøvet (forgæves) at blande assembler og c.
Ikke en gang en simpel ting som GetWindowDC kan jeg få til at virke,
men hvis jeg udelukkende kode assembler virker det fint.
Eksemple i c (som jo ikke virker)
__asm {
mov ebx, hwnd
push ebx
call GetWindowDC
}
Når programmet når til call instruktionen for jeg en
"unhandled exception."
Når jeg kode assembler og bruger MASM, virker følgende
fint:
mov ebx, hwnd
invoke GetWindowDC, ebx
Mit spørgsmål er hvordan kan jeg kalde win32 api funktioner
fra inline assembler ???
Jeg kunne selvfølgelige kode assembler funktionerne i en ekstern
DLL, men da det pt. kun er en funktion; så venter jeg lidt
venlig hilsen,
Bo Helleskov/Denmark.
| |
Benny Andersen (02-10-2001)
| Kommentar Fra : Benny Andersen |
Dato : 02-10-01 22:54 |
|
On Tue, 02 Oct 2001 22:23:26 +0200, helleskov@vip.cybercity.dk wrote:
>Hej,
>
>Jeg har nu i et par dage prøvet (forgæves) at blande assembler og c.
>Ikke en gang en simpel ting som GetWindowDC kan jeg få til at virke,
>men hvis jeg udelukkende kode assembler virker det fint.
>
>Eksemple i c (som jo ikke virker)
>
> __asm {
> mov ebx, hwnd
> push ebx
> call GetWindowDC
> }
>
>Når programmet når til call instruktionen for jeg en
>"unhandled exception."
C calling convention går ud på at det sted som kalder en funktion, og
push'er argumenter på staken, også fjerner disse argumenter efter
kaldet. Dette til forskel fra eksempelvis pascal calling convention,
hvor en funtion ikke afslutter med 'ret', men 'ret n' hvor n angiver
hvad der automatisk lægges til stakken, efter returneringen til den
kaldende kode.
Jeg tror ovennævnte asm kode skal afsluttes med
add esp,4
Det kan du let lure( i visual c), vha. view->debug
windows->disassembly under debugning af en kodestump som:
void foo(int a) { }
int main()
{
foo(1);
return 0;
}
>Når jeg kode assembler og bruger MASM, virker følgende
>fint:
>
> mov ebx, hwnd
> invoke GetWindowDC, ebx
Jeg kender ikke invoke, er det en 'assemble instruction', eller er det
en assembler macro. Den ser ud til have push implicit, så mon ikke den
også justerer stakken efter kaldet.
>Mit spørgsmål er hvordan kan jeg kalde win32 api funktioner
>fra inline assembler ???
>
>Jeg kunne selvfølgelige kode assembler funktionerne i en ekstern
>DLL, men da det pt. kun er en funktion; så venter jeg lidt
>
>venlig hilsen,
>Bo Helleskov/Denmark.
>
MVH Benny Andersen
| |
Bo Helleskov (03-10-2001)
| Kommentar Fra : Bo Helleskov |
Dato : 03-10-01 19:55 |
|
Hej Benny
Selvfølgelig er det jo det, hold da op hvor har jeg været blind.
Her er jeg regnet med at det var PASCAL calling convention (det
kommer der af at bruge delphi for meget) hvor funktionen laver
en RET n og ikke som i C, hvor det jo kun er en RET.
Så du har helt ret i din add esp,4
INVOKE er en macro, så man slipper for alle push instruktionerne og
så rydder den også selv op
Tusind tak.
Bo
| |
Jacob Heder (13-10-2001)
| Kommentar Fra : Jacob Heder |
Dato : 13-10-01 15:26 |
|
<helleskov@vip.cybercity.dk> skrev i en
nyhedsmeddelelse:p38krtkb3n2b2h7dcmomqlu84jip417tko@4ax.com...
> Hej,
>
> Jeg har nu i et par dage prøvet (forgæves) at blande assembler og c.
> Ikke en gang en simpel ting som GetWindowDC kan jeg få til at virke,
> men hvis jeg udelukkende kode assembler virker det fint.
>
> Eksemple i c (som jo ikke virker)
>
> __asm {
> mov ebx, hwnd
> push ebx
> call GetWindowDC
> }
>
> Når programmet når til call instruktionen for jeg en
> "unhandled exception."
>
> Når jeg kode assembler og bruger MASM, virker følgende
> fint:
>
> mov ebx, hwnd
> invoke GetWindowDC, ebx
>
> Mit spørgsmål er hvordan kan jeg kalde win32 api funktioner
> fra inline assembler ???
>
> Jeg kunne selvfølgelige kode assembler funktionerne i en ekstern
> DLL, men da det pt. kun er en funktion; så venter jeg lidt
>
> venlig hilsen,
> Bo Helleskov/Denmark.
>
Der er en mulighed for at dekode hvad din C/C++ kode bliver til i assembler,
hvis du kan bruge det til noget.
Hvis du benytter MSVC, skal du gå ind under project setting, dernæst gå ind
under
C/C++, vælge under kategorien General (se evt. attacted fil). Her skal du i
project
options skrive /FA, så bliver filen(erne) ikke kompileret men kun
komverteret
(fra C el. C++ til asm). Assembler filerne ligger i samme blibliotek som
C/C++ filen (eller i Debug/Release).
Sidst skal huske at fjerne /FA igen når du vil kompilere på normal vis.
Jeg formodes at du bruger MSVC, men alle andre compilere så som
borland/gcc kan også konvertere C/C++ kode til assembler.
Hilsen Jacob
2276996m001@stofanet.dk
ATTACTH FIL : MSVC Projekt setting (jpeg)
| |
Jacob Heder (13-10-2001)
| Kommentar Fra : Jacob Heder |
Dato : 13-10-01 15:27 |
|
<helleskov@vip.cybercity.dk> skrev i en
nyhedsmeddelelse:p38krtkb3n2b2h7dcmomqlu84jip417tko@4ax.com...
> Hej,
>
> Jeg har nu i et par dage prøvet (forgæves) at blande assembler og c.
> Ikke en gang en simpel ting som GetWindowDC kan jeg få til at virke,
> men hvis jeg udelukkende kode assembler virker det fint.
>
> Eksemple i c (som jo ikke virker)
>
> __asm {
> mov ebx, hwnd
> push ebx
> call GetWindowDC
> }
>
> Når programmet når til call instruktionen for jeg en
> "unhandled exception."
>
> Når jeg kode assembler og bruger MASM, virker følgende
> fint:
>
> mov ebx, hwnd
> invoke GetWindowDC, ebx
>
> Mit spørgsmål er hvordan kan jeg kalde win32 api funktioner
> fra inline assembler ???
>
> Jeg kunne selvfølgelige kode assembler funktionerne i en ekstern
> DLL, men da det pt. kun er en funktion; så venter jeg lidt
>
> venlig hilsen,
> Bo Helleskov/Denmark.
>
Der er en mulighed for at dekode hvad din C/C++ kode bliver til i assembler,
hvis du kan bruge det til noget.
Hvis du benytter MSVC, skal du gå ind under project setting, dernæst gå ind
under C/C++, vælge under kategorien General. Her skal du i project options
skrive /FA, så bliver filen(erne) ikke kompileret men kun komverteret (fra C
el. C++ til asm). Assembler filerne ligger i samme blibliotek som C/C++
filen
(eller i Debug/Release).
Sidst skal huske at fjerne /FA igen når du vil kompilere på normal vis.
Jeg formodes at du bruger MSVC, men alle andre compilere så som
borland/gcc kan også konvertere C/C++ kode til assembler.
Hilsen Jacob
2276996m001@stofanet.dk
| |
Jacob Heder (13-10-2001)
| Kommentar Fra : Jacob Heder |
Dato : 13-10-01 15:27 |
|
<helleskov@vip.cybercity.dk> skrev i en
nyhedsmeddelelse:p38krtkb3n2b2h7dcmomqlu84jip417tko@4ax.com...
> Hej,
>
> Jeg har nu i et par dage prøvet (forgæves) at blande assembler og c.
> Ikke en gang en simpel ting som GetWindowDC kan jeg få til at virke,
> men hvis jeg udelukkende kode assembler virker det fint.
>
> Eksemple i c (som jo ikke virker)
>
> __asm {
> mov ebx, hwnd
> push ebx
> call GetWindowDC
> }
>
> Når programmet når til call instruktionen for jeg en
> "unhandled exception."
>
> Når jeg kode assembler og bruger MASM, virker følgende
> fint:
>
> mov ebx, hwnd
> invoke GetWindowDC, ebx
>
> Mit spørgsmål er hvordan kan jeg kalde win32 api funktioner
> fra inline assembler ???
>
> Jeg kunne selvfølgelige kode assembler funktionerne i en ekstern
> DLL, men da det pt. kun er en funktion; så venter jeg lidt
>
> venlig hilsen,
> Bo Helleskov/Denmark.
>
Der er en mulighed for at dekode hvad din C/C++ kode bliver til i assembler,
hvis du kan bruge det til noget.
Hvis du benytter MSVC, skal du gå ind under project setting, dernæst gå ind
under C/C++, vælge under kategorien General. Her skal du i project options
skrive /FA, så bliver filen(erne) ikke kompileret men kun komverteret (fra C
el. C++ til asm). Assembler filerne ligger i samme blibliotek som C/C++
filen
(eller i Debug/Release).
Sidst skal huske at fjerne /FA igen når du vil kompilere på normal vis.
Jeg formodes at du bruger MSVC, men alle andre compilere så som
borland/gcc kan også konvertere C/C++ kode til assembler.
Hilsen Jacob
2276996m001@stofanet.dk
| |
Byrial Jensen (16-10-2001)
| Kommentar Fra : Byrial Jensen |
Dato : 16-10-01 18:32 |
|
Jacob Heder <2276996m001@mail1.stofanet.dk> skrev:
> Hvis du benytter MSVC, skal du gå ind under project setting, dernæst gå ind
> under C/C++, vælge under kategorien General. Her skal du i project options
> skrive /FA, så bliver filen(erne) ikke kompileret men kun komverteret (fra C
> el. C++ til asm).
Man vil nu stadig sige at C- og C++-filerne blivet oversæt/kopmpileret
når det sker til assembler.
Nogle oversættere, f.eks. gcc, kan kun oversætte til assembler, men
vil så normalt kalde en assembler til at assemblere assemblerfilerne
til objektfiler. Dette undlades typisk hvis man anvender "-S" som
tilvalg ved kaldet af oversætteren.
| |
|
|