/ 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 i C (gcc)
Fra : Trux


Dato : 07-11-02 13:48

Hej, mit problem er følgende kode eksembel der skal udregne cpu hastigheden.
Lettere modificeret fra intel.com. Problemet er at den giver fejl ved _asm.
Den giver egentlig også fejl ved LARGE_INTEGER, men jeg prøver med long long
i stedet for.

#include <stdio.h>
#include <stdlib.h>

void freq(void);

int main(int argc, char *argv[]){
freq();
system("PAUSE");
return(0);
}

void freq(void){
unsigned long sL, eL;
unsigned long sH, eH;
LARGE_INTEGER tS;
LARGE_INTEGER tE;
LARGE_INTEGER f;
Double start;
double end;
double r;
QueryPerformanceFrequency(&f);
_asm{
rdtsc
mov sL, eax
mov sH, edx
}
QueryPerformanceCounter(&tS);
Sleep((unsigned long) 100);
QueryPerformanceCounter(&tE);
_asm{
rdtsc
mov eL, eax
mov eH, edx
}
start = (sH * 4294967296.0) + sL;
end = (eH * 4294967296.0) + eL;
r = (tE.LowPart - tS.LowPart) / f.LowPart;
r = ((end - start) / r) / 1000000.0;
printf("CPU Speed: %d", r);
}



 
 
Michael Rasmussen (07-11-2002)
Kommentar
Fra : Michael Rasmussen


Dato : 07-11-02 15:45

"Trux" <trux@nork.auc.dk> wrote in message news:aqdne6$puv$1@sunsite.dk...
> Hej, mit problem er følgende kode eksembel der skal udregne cpu
hastigheden.
> Lettere modificeret fra intel.com. Problemet er at den giver fejl ved
_asm.
> Den giver egentlig også fejl ved LARGE_INTEGER, men jeg prøver med long
long
> i stedet for.
> [snip]

det er fordi :
1 ) LARGE_INTEGER er defineret i windows.h
2 ) _asm er MSVC's (bla.) maade at lave inline assembler paa, gcc bruger en
anden, og meget
anderledes assembler syntax.

- Michael Rasmussen.



Anders Borum (07-11-2002)
Kommentar
Fra : Anders Borum


Dato : 07-11-02 16:06



Michael Rasmussen (07-11-2002)
Kommentar
Fra : Michael Rasmussen


Dato : 07-11-02 16:24

"Anders Borum" <ander@diku.dk> wrote in message
news:Pine.LNX.4.44L0.0211071556480.9376-100000@lofn.diku.dk...
> On Thu, 7 Nov 2002, Michael Rasmussen wrote:
> 1. Kan man lave inline-assembler eller skal assembler-koden ud i en
> separat objekt-fil med funktions-kald overhead som resultat?

Du kan godt lave inline assembler i gcc, men det er ikke noget jeg goer det
i, saa det kan jeg ikke hjaelpe med.
Men jeg ved at du kan linke til en externt lavet obj fil lavet af f.eks. den
rare (og gratis) assembler nasm
( http://nasm.sourceforge.net/ )

f.eks:
// test.cpp
#include <iostream>
using namespace std;
extern "C" int test();
int main()
{
cout << "test() returned: " << test() << endl;
return 0;
}

; test.asm
section .text

global _test

_test:
mov eax, 5
ret

-- kommandolinje:

nasmw -f win32 -o test.o test.asm
g++ test.cpp test.o
a.exe


>
> 2. Findes der et program der oversætter traditionel Intel Assembler, som
> vores gamle ven TASM lærte os det, til gcc's særlige dialekt?

ikke hvad jeg kender til, men jeg vil paa den anden side heller ikke afvise
eksistensen af en saadan :)
Du kan selvfoelgelig ogsaa bruge objektfiler lavet med TASM paa ca. samme
facon.

- Michael Rasmussen



Jesper Louis Anderse~ (07-11-2002)
Kommentar
Fra : Jesper Louis Anderse~


Dato : 07-11-02 18:00

On Thu, 7 Nov 2002 16:05:35 +0100, Anders Borum <ander@diku.dk> wrote:

> Jeg støder en gang i mellem ind i en opgave hvor jeg skal bruge små
> assembler-bidder i mit c-program. Er der nogen snedig måde at gøre dette
> på i gcc?
>
> 1. Kan man lave inline-assembler eller skal assembler-koden ud i en
> separat objekt-fil med funktions-kald overhead som resultat?

Jeg ville hælde den ud i en seperat fil til enhver tid. Den primære
årsag er at når du begynder på assembler så bliver det uportabelt. Det
kan til dels reddes ved at have C-ækvivalenter for dine hurtigere
assemblerkald og så linke med den rigtige af de 2 forskellige filer.

--
Jesper


Igor V. Rafienko (08-11-2002)
Kommentar
Fra : Igor V. Rafienko


Dato : 08-11-02 14:40

[ Anders Borum ]

[ ... ]

> Jeg støder en gang i mellem ind i en opgave hvor jeg skal bruge små
> assembler-bidder i mit c-program. Er der nogen snedig måde at gøre
> dette på i gcc?


gcc tilbyr muligheten å sette inn assembly kode inline via "asm
volatile". Dog, denne muligheten kunne likeså gjerne ha vært fjernet,
da det er langt mere til skade enn til tjeneste.


> 1. Kan man lave inline-assembler eller skal assembler-koden ud i en
> separat objekt-fil med funktions-kald overhead som resultat?


Du kan lage inline assembler (fx. ta en titt på info-sidene til gcc).
Men du vil ikke det. Det forvirrer kompilatoren altfor mye.

Legg assemblykoden din i egen funksjon som legges i en separat .s-fil.
Om funksjonsoverhead er et problem, kan du be kompilatoren om å inline
funksjonen.


> 2. Findes der et program der oversætter traditionel Intel Assembler,
> som vores gamle ven TASM lærte os det, til gcc's særlige dialekt?


Eh? gas støtter da både AT&T og Intel syntaks.





ivr
--
<peder> igorr: tcl ja... det er fra de dypeste avgrunnene i helvete det...
<peder> php er bare fra foajeen
            -- pederst på irc

Rasmus Kaae (08-11-2002)
Kommentar
Fra : Rasmus Kaae


Dato : 08-11-02 16:10

Anders Borum wrote:

> Jeg støder en gang i mellem ind i en opgave hvor jeg skal bruge små
> assembler-bidder i mit c-program. Er der nogen snedig måde at gøre dette
> på i gcc?

Snedig og snedig, der findes da en syntax.

> 1. Kan man lave inline-assembler eller skal assembler-koden ud i en
> separat objekt-fil med funktions-kald overhead som resultat?

Inline assembler kan snildt laves under GCC vha. følgende konstruktion:

int main()
{
asm("mov %eax, %ebx");
return 0;
}


> 2. Findes der et program der oversætter traditionel Intel Assembler, som
> vores gamle ven TASM lærte os det, til gcc's særlige dialekt?

Du kan evt. bruge NASM, den har vist "almindelig" x86 asm-syntax.

Det du kalder "gcc's særlige dialket" hedder officielt AT&T syntax, som
der findes talrige tutorials til hist og her.


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

Månedens bedste
Årets bedste
Sidste års bedste