Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  C viit ja aadress märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
kalvis
Kreisi kasutaja

liitunud: 20.10.2009




sõnum 20.10.2012 13:33:58 C viit ja aadress vasta tsitaadiga

Ei leidnud kuskilt infot, et mis "aadressi" C viitmuutuja kasutab? Eriti huvitavad just dünaamilised muutujad.
Vaja oleks C eritüüpi muutujate aadresse assemblerisse edasi anda kuid ühtedes kohtades räägitakse et need on C sisesed mingid virtuaalmuutujad, st. kui otse anda siis saab vaid mingi offseti, kuid mitte õiget viita mäluaadressile. Teises kohas, et need on piisavalt reaalsed. Kindlalt on väidetud, et globaalselt defineeritud ja exporditud muutujatele tehakse mingi linkide tabel ja neid saab kätte, kuid mind huvitab:
1. Lokaalselt alloca käsuga stacki tehtud muutuja koos tema järel oleva datablokiga, mis kutsutakse sama koodi lõigus välja ja antaks assemblerile edasi. Assembler peaks nagunii data stacki laadima seega kui see blokk oleks juba stackis jääks mõttetu ümberlaadimine ära.
2. Kui alloca eeldatavalt ei käitu siis sobib ka heap mäluviit oma dataga. Siis tuleb data muidugi stacki laadida kuid mis teha. Muus osas sama.
3. C funktsioonide viidad. Momendil sellega kiiret pole, kuid väga bro oleks C funktsiooni viidaga assemblerisse anda ja seal välja kutsuda.

Muidu äraspidiseid lahendusi leidsin, kus C-s nuhitakse tegelik viida aadress välja C inline assembleriga, see pannakse funktsiooni parameetrisse ja siis saab assemblerile edasi anda. Kas on mõni valge inimese lahendus ka olemas. Seda et export ja import käskude (extern, global) saab edasi anda ja saab õige tean. Kuid see sobib staatilistele muutujatele, mul aga on vaja edasi anda dünaamiline blokk

Assembler on plaan linkida kokku sama C programmiga (ei ole mingit plaani stand alone dll-na või muu iseseisva programmina, kus saab vaid üle globaalmuutujate andmevahetust teha).
tagasi üles
vaata kasutaja infot saada privaatsõnum
i8080
Kreisi kasutaja
i8080

liitunud: 15.03.2002



Autoriseeritud ID-kaardiga

sõnum 21.10.2012 03:51:46 vasta tsitaadiga

mingid kaudsed näited, kuidas see umbes nagu võiks olla. hetkel mul pole nasmi käepärast, et see järgi proovida, aga peaks olema teoreetiliselt mõlemat pidi accessitav. teatud juhtudel (cpp) puhul võib olla probleeme nimede "dekoreerimisega" ja vaja natuke rohkem jurada.

c.c

extern long InAsm;
long InC;

void func()
{
  long val = something();
}


asm.asm

// olenevalt mis asm kasutad. nasm vist oli midagi taolist
global dd InAsm;
extern dd InC;

something:
  mov eax, dword [InAsm]; // asm failis defineeritud muutuja kasutamine
  mov ebx, dword [InC];  // c failis oleva muutuja kasutamine
  return; // tagastab eax = InAsm


ja vastavalt muutuja suurusele kasutada kas
db, dw või dd

EDIT: lisan ka cpp näte
c.cpp

extern "C" long InCpp;


asmcpp.asm

extern dd InCpp;

something:
  mov dword [InCpp], 100;
  mov eax, dword [InCpp];
  return; // tagastab 100
Kommentaarid: 169 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 151
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
kalvis
Kreisi kasutaja

liitunud: 20.10.2009




sõnum 23.10.2012 11:06:06 vasta tsitaadiga

Nüüdseks lõpuks enam vähem toimiv asi saadud. Tükk aega kulus esimese toimiva koodi kokkukirjutamine, sest kompileerimise kõik võtmed ei olnud selged. Kasutasin minGW ja NASM-i.
Momendil ei pea mingit trikitamist tegema, meeldiv üllatus oli, et nii globaalmuutuja, alloci viida (pinuviit) kui malloci (heap viit) antakse samasse koodi staatiliselt lingituna õieti üle pinu ja mingit trikitamist tegema ei pea.
gcc piisas C-s
extern int foo(int *a,int pikkus);

ja asmis
global _foo

Lõpp hea, kõik hea
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  C viit ja aadress
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.