abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:00 | Nová verze

    Zeek (Wikipedie), původně Bro, byl vydán v nové major verzi 8.0.0. Jedná se o open source platformu pro analýzu síťového provozu. Vyzkoušet lze online.

    Ladislav Hagara | Komentářů: 0
    včera 23:55 | Zajímavý software

    Emacs na stříhání videa? Klidně.

    Ladislav Hagara | Komentářů: 3
    včera 15:55 | Nová verze

    Byl vydán Mozilla Firefox 142.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 142 je již k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    včera 13:22 | Zajímavý článek

    Python Developers Survey 2024, výsledky průzkumu mezi vývojáři v Pythonu organizovaném Python Software Foundation ve spolupráci se společností JetBrains v říjnu a listopadu loňského roku. Zúčastnilo se 30 tisíc vývojářů z 200 zemí. Linux používá 59 % z nich.

    Ladislav Hagara | Komentářů: 0
    včera 04:00 | Zajímavý článek

    Farid Abdelnour se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.08.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.

    Ladislav Hagara | Komentářů: 2
    včera 01:55 | Nová verze

    Byla vydána nová verze 2.51.0 distribuovaného systému správy verzí Git. Přispělo 91 vývojářů, z toho 21 nových. Přehled novinek v příspěvku na blogu GitHubu a v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 1
    včera 01:33 | Zajímavý článek

    Po roce bylo vydáno nové číslo magazínu Phrack: Phrack 72.

    Ladislav Hagara | Komentářů: 3
    18.8. 19:33 | Pozvánky

    OpenSSL Corporation zve na den otevřených dveří ve středu 20. srpna v Brně a konferenci OpenSSL od 7. do 9. října v Praze.

    Ladislav Hagara | Komentářů: 3
    18.8. 19:22 | Komunita

    Konference LinuxDays 2025 proběhne o víkendu 4. a 5. října v Praze. Konference OpenAlt 2025 o víkendu 1. a 2. listopadu v Brně. Blíží se konec přihlašování přednášek. Přihlaste svou přednášku (LinuxDays do 31. srpna a OpenAlt do 3. října) nebo doporučte konference známým.

    Ladislav Hagara | Komentářů: 0
    18.8. 12:22 | IT novinky

    Raspberry Pi Touch Display 2 je nově vedle 7palcové k dispozici také v 5palcové variantě. Rozlišení stejné 720 × 1280 pixelů. Cena 40 dolarů.

    Ladislav Hagara | Komentářů: 1
    Pro otevření více webových stránek ve webovém prohlížečí používám
     (78%)
     (9%)
     (9%)
     (0%)
     (4%)
     (0%)
    Celkem 23 hlasů
     Komentářů: 4, poslední včera 16:48
    Rozcestník

    Dotaz: Zapisovanie do pamate

    12.8.2019 19:24 mates
    Zapisovanie do pamate
    Přečteno: 510×
    Ahojte potreboval by som v C / C++ daco zapisat na adresu v pamati

    V Basicu na to boli funckie

    PEEK(ADRESA%) - funkcia precitala hodnotu zo zadanej adresy
    POKE ADRESA%, hodnota% - procedura zapisala hodnotu na zadanu adresu ak sme chceli zapisat znak bolo ho potrebne previest na cislo

    A k tymto funkciam bola este prikaz:
    DEF SEG, ktorym sa prepinali segmenty.

    Ako sa tieto funkcie a prikazy volaju v C++ resp C? Alebo vedeli by ste mi poradit ako tento priklad z basicu prepisat do C++?
    DIM a%(2)
    DEF SEG = VARSEG(a%(0))
    FOR i% = 0 TO 2
      READ d%
      POKE VARPTR(a%(0)) + i%, d%
    NEXT i%
    DATA 205, 5, 203
    
    CALL ABSOLUTE(VARPTR(a%(0)))
    DEF SEG
    

    Řešení dotazu:


    Odpovědi

    12.8.2019 21:33 debian+
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate
    9 Smerniky

    V C neprepinaju pametove segmenty.
    xkucf03 avatar 12.8.2019 21:40 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate

    Zapisovat můžeš pomocí funkce outb():

    outb(0b00000001, addr);

    (celý příklad)

    Nebo si ukazatel mířící na dané místo v paměti přetypovat na datový typ, který chceš zapsat a pak normálně přiřadit pomocí =.

    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    13.8.2019 10:26 R
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate
    out zapisuje na I/O port, nie do pamati.
    13.8.2019 11:45 Rezervní Polská Kotace
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate
    Je sice pravda, že na x86 jsou to oddělené adresní prostory, ale v první řadě by to chtělo vědět, co je cílem tazatele. Dost možná totiž přímo do paměti zapisovat nepotřebuje...
    13.8.2019 18:56 petr_p | skóre: 59 | blog: pb
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate

    Cílem je kopírovat příklady z Dokumentace QBasicu poplatné reálnému režimu x86.

    Ne že by ho jazyk C omezoval v zapisování do paměti. Ale skok na konkrétní adresu už problém bude. Předně C bude očekávat platformě závislou volací konvenci, takže autor bude muset ty tři bajty kódu obalit nějakou hlavičkou. A pak bude muset najít operační systém, který mu dovolí spustit kód z adresy, kam má právo zapisovat. Řada moderních systémů takovému mapování paměti brání. Nehledě na to, že volání BIOSu mu z uživatelského ringu opět fungovat nebude. Ale je docela možné, že tazatel stále používá DOS a jen vyměnil QBasic za C.

    13.8.2019 20:07 debian+
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate
    Ako skakanie v Cecku funguje. Pouziva sa goto. Ale nikto ti negarantuje, ze sa neposkodi zasobnik. C je cecko.
    Předně C bude očekávat platformě závislou volací konvenci, takže autor bude muset ty tři bajty kódu obalit nějakou hlavičkou. A pak bude muset najít operační systém, který mu dovolí spustit kód z adresy, kam má právo zapisovat. Řada moderních systémů takovému mapování paměti brání. Nehledě na to, že volání BIOSu mu z uživatelského ringu opět fungovat nebude. Ale je docela možné, že tazatel stále používá DOS a jen vyměnil QBasic za C.
    Ak on mysli na skok na nejaku funkciu z adresa, da sa to. Zavolat funkciu cez smernik na funkciu. Ale nechod tak LOW ak nemusis a nechod az tak LOW ako pascal resp. assambler. Ano, ma pravdu, ze existuje nejake standart, ako sa predavaju data medzi OS a programom. A je to v C osetrene aj platformove veci - napr. big/little endian. Pokial sa bavime o OS s Linuxom. Ak to zariadenie nema OS. Tak volas funkcie alebo funkcie cez smernik na funkcie, pouzitie goto alebo inline assambler v C.
    13.8.2019 20:13 debian+
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate
    Hm, este tu mame setjmp() a longjmp(), pre "goto" nie len v prave lokalnom ("static") .c subore.
    Jendа avatar 14.8.2019 01:16 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate
    Ale skok na konkrétní adresu už problém bude. Předně C bude očekávat platformě závislou volací konvenci, takže autor bude muset ty tři bajty kódu obalit nějakou hlavičkou.
    A pokud se bude chtít vrátit, tak bude muset vědět, co ten kód udělal, a jak po něm uklidit. Ale to mu neporadíme dokud nebudeme vědět o co se snaží.

    (pokud to má správnou konvenci tak teoreticky chce udělat to co dělá dlopen/dlsym, ne?)
    A pak bude muset najít operační systém, který mu dovolí spustit kód z adresy, kam má právo zapisovat. Řada moderních systémů takovému mapování paměti brání.
    AFAIK to jde třeba na Linuxu dost snadno vypnout (viz mprotect) a i takový non-executable stack se teprve nedávno řešil že by měl být všude defaultně zapnutý.
    13.8.2019 09:35 rastos | skóre: 63 | blog: rastos
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate
    Toto bude prča.

    /me clicks "Začni sledovat"
    13.8.2019 11:40 Rezervní Polská Kotace
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate
    Co je špatného na tom, že odložil svůj Commodore 64 na půdu a pořídil si modernější systém?
    13.8.2019 12:13 rastos | skóre: 63 | blog: rastos
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate
    Špatné absolutne nic. Ale občas je zábavné sledovať ľudí zažívajúcich kultúrny šok ;-)
    Řešení 1× (xkucf03)
    Jendа avatar 13.8.2019 17:06 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate
    Příklad z Arduína, zapíše 0x7777 na adresu 0x0300
    volatile uint16_t *const bootKeyPtr = (volatile uint16_t *)0x0300;
    *bootKeyPtr = 0x7777;
    
    Samozřejmě pokud je to na nějakém operačním systému a ne přímo bare-metal, tak jde o virtuální paměť, kterou tvému programu poskytl operační systém. Pokud chceš přímo zapisovat do fyzické paměti (například máš v paměti namapované nějaké zařízení, které se pomocí zápisů ovládá), musíš si (na Linuxu) zkompilovat podporu pro zařízení /dev/mem. Následně toto zařízení otevřeš, pomocí lseek dojedeš na danou pozici a pomocí read přečteš (případně je možné namapovat kousek tohoto souboru pomocí mmap do tvého virtuálního prostoru a zápisy jsou pak překládány jak by člověk čekal).
    15.8.2019 17:31 Jindřich Makovička | skóre: 17
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate
    Pokud opravdu chcete ekvivalent uvedeného kódu, tak tady. (v DOSu by to mohlo tu obrazovku na tiskárně vyjet, v Linuxu to pochopitelně spadne na segfault)
    #include <stdlib.h>
    
    void int5() {
        asm volatile("int $5" : : : "memory");
    }
    
    
    int main(int argc, char **argv) {
        int5();
    
        return EXIT_SUCCESS;
    }
    
    15.8.2019 20:36 debian+
    Rozbalit Rozbalit vše Re: Zapisovanie do pamate
    gcc pouzi AT/X syntax. Zaujimavostou je, ze mozte v tom asm pouzivat premenne z C prostredia a prekladat ich nahradi, za realne hodnoty pri preklade.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.