praegune kellaaeg 17.06.2025 17:11:26
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
kalvis
Kreisi kasutaja
liitunud: 20.10.2009
|
20.10.2012 13:33:58
C viit ja aadress |
|
|
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 |
|
 |
i8080
Kreisi kasutaja

liitunud: 15.03.2002
|
21.10.2012 03:51:46
|
|
|
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
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 |
|
 |
kalvis
Kreisi kasutaja
liitunud: 20.10.2009
|
23.10.2012 11:06:06
|
|
|
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 |
|
 |
|
lisa lemmikuks |
|
|
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.
|