|
| Assembly i C++ Fra : Daniel Blankensteine~ |
Dato : 01-06-02 14:02 |
|
Hey
Jeg har både skrevet programmer i C++ og assembly, nu prøver jeg så at
forbinde de to. Fx har jeg nogle input funktioner jeg har skrevet i
Assembly, som jeg gerne vil benytte i mit C++ program. (Jeg arbejder
under FreeBSD).
_asm() er ikke noget for mig, da den gør længere assembly kode besværlig
at indsætte.
Jeg har derfor prøvet med:
#include <iostream.h>
void main(void) {
lang "asm" {
mov ax.dx
}
}
Men dette giver fejl på linie 4:
Syntax error before string constant
Så prøvet jeg med:
#incluse <iostream.h>
void main(void) {
extern "asm" {
mov ax,dx
}
}
Men det giver samme fejl på linie 4, men også dette på linie 6:
Confused by earlier errors, bailing out.
Har I nogle forslag til hvordan jeg løser dette problem?
Måske kan I også guide mig til nogle sider om hvordan man via C++ sender
parametere til en assembly funktion og hvordan man modtager en
return-værdi fra en assembly funktion. Men dette har måske mere med
OS'et at gøre? Eftersom BSD jo i modsætning til Windows og Linux, ikke
bruger registerne til parameter og return værdier, men derimod stakken?
mvh
db
| |
Morten Boysen (01-06-2002)
| Kommentar Fra : Morten Boysen |
Dato : 01-06-02 15:25 |
|
"Daniel Blankensteiner" <db@traceroute.dk> wrote in message
news:adagks$cin$1@sunsite.dk...
> Jeg har derfor prøvet med:
> #include <iostream.h>
#include <iostream>
iostream.h er forældet.
> void main(void) {
int main()
void main er ikke, og har aldrig, været tilladt C++. At din compiler
så kompilerer kan du anse som held.
> lang "asm" {
> mov ax.dx
> }
> }
> Men dette giver fejl på linie 4:
> Syntax error before string constant
Standardmåden at inkludere assembler er:
asm("streng");
Streng skal så være dine assembler-kommandoer:
asm("mov ax dx");
> Så prøvet jeg med:
> #incluse <iostream.h>
>
> void main(void) {
> extern "asm" {
> mov ax,dx
> }
> }
extern specificerer kun linker-konventioner og ikke noget inlinet
sprog.
--
Morten Boysen
| |
Daniel Blankensteine~ (01-06-2002)
| Kommentar Fra : Daniel Blankensteine~ |
Dato : 01-06-02 15:42 |
|
"Morten Boysen" <morten.boysen@aub.dk> wrote in message
news:adalg3$cb8$1@sunsite.dk...
> Standardmåden at inkludere assembler er:
>
> asm("streng");
>
> Streng skal så være dine assembler-kommandoer:
>
> asm("mov ax dx");
Ja, men jeg har mange linier asm kode, så den holder ikke at jeg skal
til at sætte dem alle i "er.
mvh
db
| |
Morten Boysen (01-06-2002)
| Kommentar Fra : Morten Boysen |
Dato : 01-06-02 15:51 |
|
"Daniel Blankensteiner" <db@traceroute.dk> wrote in message
news:adamfr$mhf$1@sunsite.dk...
> Ja, men jeg har mange linier asm kode, så den holder ikke at jeg
skal
> til at sætte dem alle i "er.
Det er den eneste måde i standard C++. Det er dog ikke ualmindeligt at
man kan bruge denne kontruktion:
asm {
op-code
op-code
.....
}
--
Morten Boysen
| |
Daniel Blankensteine~ (01-06-2002)
| Kommentar Fra : Daniel Blankensteine~ |
Dato : 01-06-02 22:03 |
|
"Morten Boysen" <morten.boysen@aub.dk> wrote in message
news:adan13$o27$1@sunsite.dk...
> Det er den eneste måde i standard C++. Det er dog ikke ualmindeligt at
> man kan bruge denne kontruktion:
>
> asm {
> op-code
> op-code
> .....
> }
Ok, men den virker heller ikke her.
mvh
db
| |
Byrial Jensen (01-06-2002)
| Kommentar Fra : Byrial Jensen |
Dato : 01-06-02 22:02 |
|
Morten Boysen <morten.boysen@aub.dk> skrev:
> "Daniel Blankensteiner" <db@traceroute.dk> wrote in message
>
>> void main(void) {
>
> int main()
>
> void main er ikke, og har aldrig, været tilladt C++. At din compiler
> så kompilerer kan du anse som held.
Tja, jeg vil nærmere anse det som uheld at man ikke bliver gjort
opmærksom på fejlen af oversætteren.
| |
Morten Boysen (01-06-2002)
| Kommentar Fra : Morten Boysen |
Dato : 01-06-02 23:38 |
|
"Byrial Jensen" <bjensen@nospam.dk> wrote in message
news:slrnafi847.18m.bjensen@ask.ask...
> >> void main(void) {
> >
> > int main()
> >
> > void main er ikke, og har aldrig, været tilladt C++. At din
compiler
> > så kompilerer kan du anse som held.
>
> Tja, jeg vil nærmere anse det som uheld at man ikke bliver gjort
> opmærksom på fejlen af oversætteren.
Jeg vil give dig fuldstændig ret, i at det mindste kompileren kan
gøre, er at komme med en advarsel, hvis den accepterer void main. Jeg
ved at Visual C++ 6.0 også glad og fro kompilerer void main() uden
videre. Det er ikke godt nok.
--
Morten Boysen
| |
Morten Brix Pedersen (01-06-2002)
| Kommentar Fra : Morten Brix Pedersen |
Dato : 01-06-02 23:51 |
|
Morten Boysen wrote:
> "Byrial Jensen" <bjensen@nospam.dk> wrote in message
> news:slrnafi847.18m.bjensen@ask.ask...
>
>>>>void main(void) {
>>>
>>>int main()
>>>
>>>void main er ikke, og har aldrig, været tilladt C++. At din
>>
> compiler
>
>>>så kompilerer kan du anse som held.
>>
>>Tja, jeg vil nærmere anse det som uheld at man ikke bliver gjort
>>opmærksom på fejlen af oversætteren.
>
>
> Jeg vil give dig fuldstændig ret, i at det mindste kompileren kan
> gøre, er at komme med en advarsel, hvis den accepterer void main. Jeg
> ved at Visual C++ 6.0 også glad og fro kompilerer void main() uden
> videre. Det er ikke godt nok.
gcc 3 vil slet ikke compile 'void main()':
mbp /testcode$ g++-3.0 main.cpp
main.cpp:1: `main' must return `int'
- Morten.
| |
Morten Boysen (01-06-2002)
| Kommentar Fra : Morten Boysen |
Dato : 01-06-02 23:59 |
|
"Morten Brix Pedersen" <morten@wtf.dk> wrote in message
news:3CF94FCE.5040802@wtf.dk...
> gcc 3 vil slet ikke compile 'void main()':
>
> mbp /testcode$ g++-3.0 main.cpp
> main.cpp:1: `main' must return `int'
Det mener jeg også er den bedste løsning.
--
Morten Boysen
| |
J. Martin Petersen (01-06-2002)
| Kommentar Fra : J. Martin Petersen |
Dato : 01-06-02 20:55 |
|
"Daniel Blankensteiner" <db@traceroute.dk> writes:
> Hey
>
> Jeg har både skrevet programmer i C++ og assembly, nu prøver jeg så at
> forbinde de to. Fx har jeg nogle input funktioner jeg har skrevet i
> Assembly, som jeg gerne vil benytte i mit C++ program. (Jeg arbejder
> under FreeBSD).
> _asm() er ikke noget for mig, da den gør længere assembly kode besværlig
> at indsætte.
Hvad med at have den symbolske maskinekode og C++-koden i separate
filer, som så oversættes hver for sig, men lænkes sammen til sidst?
Det kræver selvfølgelig, at dine input-funktioner benyttes
vha. funktionskald.
--
J. Martin Petersen "Atter springer gnuerne ud i vandet..."
| |
Daniel Blankensteine~ (01-06-2002)
| Kommentar Fra : Daniel Blankensteine~ |
Dato : 01-06-02 22:04 |
|
"J. Martin Petersen" <jmp@spam.alvorlig.dk> wrote in message
news:uwutibwq5.fsf@spam.alvorlig.dk...
> > Jeg har både skrevet programmer i C++ og assembly, nu prøver jeg så
at
> > forbinde de to. Fx har jeg nogle input funktioner jeg har skrevet i
> > Assembly, som jeg gerne vil benytte i mit C++ program. (Jeg arbejder
> > under FreeBSD).
> > _asm() er ikke noget for mig, da den gør længere assembly kode
besværlig
> > at indsætte.
>
> Hvad med at have den symbolske maskinekode og C++-koden i separate
> filer, som så oversættes hver for sig, men lænkes sammen til sidst?
> Det kræver selvfølgelig, at dine input-funktioner benyttes
> vha. funktionskald.
Ja, det må jeg jo så gøre. Kender du nogle tekster der beskriver denne
metode?
mvh
db
| |
J. Martin Petersen (02-06-2002)
| Kommentar Fra : J. Martin Petersen |
Dato : 02-06-02 07:30 |
|
"Daniel Blankensteiner" <db@traceroute.dk> writes:
> "J. Martin Petersen" <jmp@spam.alvorlig.dk> wrote in message
> >
> > Hvad med at have den symbolske maskinekode og C++-koden i separate
> > filer, som så oversættes hver for sig, men lænkes sammen til sidst?
> > Det kræver selvfølgelig, at dine input-funktioner benyttes
> > vha. funktionskald.
>
> Ja, det må jeg jo så gøre. Kender du nogle tekster der beskriver denne
> metode?
Nej, men det er ikke så forskelligt igen, fra når man skal lænke
forskellige objektfiler sammen. Dog er der en forskel når man skal
erklære funktionerne, og det er, at de skal erklæres som eksterne, da
C++-oversætteren jo ikke kender dem.
Givet en fil foo.s, der indeholder funktionen bar, som tager et heltal
som argument og returnerer et heltal, og som er skrevet i symbolsk
maskinkode, kan du benytte denne på følgende måde:
'---baz.cc---
|extern "C" int bar(int);
|
|int main() {
| return bar(42);
|}
'------------
Du kan nu oversætte baz.cc med f.eks. gcc eller g++ med flaget c, der
angiver, at der kun skal oversættes, men ikke lænkes, og du får
således baz.o.
Når du har oversat foo.s til en objektfil foo.o (f.eks. vha. as), kan
du lænke foo.o og baz.o sammen. Dette kan gøres med f.eks. ld.
Har du, når du skal oversætte baz.cc, allerede foo.o, kan du give den
som parameter til gcc, der så vil lænke med det samme. Jeg kan ikke
huske syntaksen, for jeg plejer at bruge Makefiler.
Oversætteren sørger for at overholde kaldkonventionerne, så når du
skal arbejde med funktionskald i symbolsk maskinkode skal du bare være
sikker på, du også gør det.
--
J. Martin Petersen "Atter springer gnuerne ud i vandet..."
| |
Daniel Blankensteine~ (02-06-2002)
| Kommentar Fra : Daniel Blankensteine~ |
Dato : 02-06-02 10:28 |
|
"J. Martin Petersen" <jmp@spam.alvorlig.dk> wrote in message
news:u8z5y2nxp.fsf@spam.alvorlig.dk...
> > Ja, det må jeg jo så gøre. Kender du nogle tekster der beskriver
denne
> > metode?
>
> Nej, men det er ikke så forskelligt igen, fra når man skal lænke
> forskellige objektfiler sammen. Dog er der en forskel når man skal
> erklære funktionerne, og det er, at de skal erklæres som eksterne, da
> C++-oversætteren jo ikke kender dem.
>
> Givet en fil foo.s, der indeholder funktionen bar, som tager et heltal
> som argument og returnerer et heltal, og som er skrevet i symbolsk
> maskinkode, kan du benytte denne på følgende måde:
>
> '---baz.cc---
> |extern "C" int bar(int);
> |
> |int main() {
> | return bar(42);
> |}
> '------------
>
> Du kan nu oversætte baz.cc med f.eks. gcc eller g++ med flaget c, der
> angiver, at der kun skal oversættes, men ikke lænkes, og du får
> således baz.o.
>
> Når du har oversat foo.s til en objektfil foo.o (f.eks. vha. as), kan
> du lænke foo.o og baz.o sammen. Dette kan gøres med f.eks. ld.
>
> Har du, når du skal oversætte baz.cc, allerede foo.o, kan du give den
> som parameter til gcc, der så vil lænke med det samme. Jeg kan ikke
> huske syntaksen, for jeg plejer at bruge Makefiler.
>
> Oversætteren sørger for at overholde kaldkonventionerne, så når du
> skal arbejde med funktionskald i symbolsk maskinkode skal du bare være
> sikker på, du også gør det.
Oki, mange tak for hjælpen
mvh
db
| |
|
|