Avatar billede bluwduch Nybegynder
10. oktober 2002 - 10:55 Der er 13 kommentarer og
3 løsninger

Returnere værdi fra asm-funktion til C

Wolla!

Jeg har lavet et funktionskald i C til en assemblerfunktion, som skal returnere en værdi af typen int. Er der nogen der ved hvordan man gør det (Måske forkert gruppe - Håber på forståelse),

Eks.

-C-
/*
a = test();
*/

-Asm-
/*
_test:   
  ;Der skal bare returneres en int-værdi - Hvordan?
*/
Avatar billede soreno Praktikant
10. oktober 2002 - 11:32 #1
hvilken compiler har du - der er nemlig forskel på compilere og deres asm syntaks, nogle bruger intel andre at&t

hvis det er at&t så er det værd at kigge her:
http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html
Avatar billede bluwduch Nybegynder
10. oktober 2002 - 11:35 #2
Det er til et TI embedded system, og jeg bruger TI's compiler.

Kunne umiddelbart ikke finde noget på det link du sendte (Søgte på "return" men fandt intet).
Avatar billede soreno Praktikant
10. oktober 2002 - 11:44 #3
med at&t kan du eks gøre sådan her:
unsigned long foo()
{
  unsigned long eax;
  asm(".byte 0x0f, 0xa2" : "=a" (eax));
  return eax;
}
Avatar billede bluwduch Nybegynder
10. oktober 2002 - 11:48 #4
Hmm! - Det bli'r jeg sgu' ikke meget klogere af :-D
Avatar billede soreno Praktikant
10. oktober 2002 - 11:55 #5
du udfører noget asm og det du vil returnere putter du over i en lokal variabel og returnere denne.

[.byte 0x0f, 0xa2] er den opcode der "Read Time Stamp Counter (RDTSC)"
["=a" (eax)] putter indholdet af eax registreret over i variablen eax
Avatar billede borrisholt Novice
10. oktober 2002 - 13:08 #6
Når det blot er en integer så ligger du blot svaret i eax registeret så er du i luften !

Jens B
Avatar billede bluwduch Nybegynder
10. oktober 2002 - 13:16 #7
Lyder godt - Der er bare ikke noget EAX register af hvad jeg sådan lige kan se. Hat dog selv fundet ud af, at et register der hedder T0 måske kan bruges :-D
Avatar billede borrisholt Novice
10. oktober 2002 - 13:17 #8
så er det ikke på en Intel processor du koder :-)

Jens B
Avatar billede soepro Nybegynder
10. oktober 2002 - 14:51 #9
Jens >> Godt set - han skrev også at det var en TI ovenfor !

blowduch >> I C++ kan man (i Borland syntax, og dermed til Intel x86) skrive sådan her (stubben læser data fra LPT-porten):

  // Read the data - clearing present contents.
  int portAddr = 0x378;
  int portData = 0x00;
  asm
  {
    mov  dx,portAddr
    in  al,dx
    mov  portData,al
  };

måske kan du lade dig inspirere herfra !
Avatar billede soepro Nybegynder
10. oktober 2002 - 14:53 #10
dx og al er navnene på de registre (her i Intel x86 CPU'en) som der bliver læst/skrevet til. 'mov' og 'in' er Intel x86 assembler instruktioner - 'mov' eller 'move' findes til de fleste CPU'er, også f.eks. 6502 (Gode gamle Commodore 64 bl.a.)
Avatar billede borrisholt Novice
10. oktober 2002 - 14:58 #11
soepro >> Nu ikke så spydig ...

"Der skal bare returneres en int-værdi - Hvordan?"

Dit kode retuneren et word :-)

Og ja du havde ret det havde jeg ikke set !
Jens B
Avatar billede bluwduch Nybegynder
10. oktober 2002 - 15:05 #12
En sjov lille dialog :-D.

Fandt dog ud af det var T0 det drejede sig om - En anden gang tror jeg at jeg glor lidt i hjælpen først :-D
Avatar billede bluwduch Nybegynder
10. oktober 2002 - 15:08 #13
Her er lidt point - Tak for hjælpen!
Avatar billede borrisholt Novice
10. oktober 2002 - 15:09 #14
bluwduch >> Hvis man ikke flue knepper en gang i mellem så bliver det hele så strengent og så kedeligt :-)
Avatar billede soepro Nybegynder
10. oktober 2002 - 15:27 #15
jens >> Nej, min kode returnere en int - se definitionen på portData og bemærk at jeg bruger AL ikke AX ! (A-registreret's LSB - ikke hele registret.)
Avatar billede soreno Praktikant
10. oktober 2002 - 15:36 #16
en int defineres vel også som et heltal bestående af "x antal (bit|bytes)" - så i princippet er det vel afhængig af miljøet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester