/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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.

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste