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 15:11 | Bezpečnostní upozornění

    V Redisu byla nalezena a v upstreamu již opravena kritická zranitelnost CVE-2025-49844 s CVSS 10.0 (RCE, vzdálené spouštění kódu).

    Ladislav Hagara | Komentářů: 1
    dnes 14:00 | IT novinky

    Ministr a vicepremiér pro digitalizaci Marian Jurečka dnes oznámil, že přijme rezignaci ředitele Digitální a informační agentury Martina Mesršmída, a to k 23. říjnu 2025. Mesršmíd nabídl svou funkci během minulého víkendu, kdy se DIA potýkala s problémy eDokladů, které některým občanům znepříjemnily využití možnosti prokázat se digitální občankou u volebních komisí při volbách do Poslanecké sněmovny.

    Ladislav Hagara | Komentářů: 7
    dnes 12:33 | Zajímavý software

    Společnost Meta představila OpenZL. Jedná se o open source framework pro kompresi dat s ohledem na jejich formát. Zdrojové kódy jsou k dispozici na GitHubu.

    Ladislav Hagara | Komentářů: 0
    dnes 03:33 | IT novinky

    Google postupně zpřístupňuje českým uživatelům Režim AI (AI Mode), tj. nový režim vyhledávání založený na umělé inteligenci. Režim AI nabízí pokročilé uvažování, multimodalitu a možnost prozkoumat jakékoliv téma do hloubky pomocí dodatečných dotazů a užitečných odkazů na weby.

    Ladislav Hagara | Komentářů: 0
    včera 18:11 | Nová verze

    Programovací jazyk Python byl vydán v nové major verzi 3.14.0. Podrobný přehled novinek v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 2
    včera 16:33 | IT novinky

    Bylo oznámeno, že Qualcomm kupuje Arduino. Současně byla představena nová deska Arduino UNO Q se dvěma čipy: MPU Qualcomm Dragonwing QRB2210, na kterém může běžet Linux, a MCU STM32U585 a vývojové prostředí Arduino App Lab.

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

    Multiplatformní open source voxelový herní engine Luanti byl vydán ve verzi 5.14.0. Podrobný přehled novinek v changelogu. Původně se jedná o Minecraftem inspirovaný Minetest v říjnu loňského roku přejmenovaný na Luanti.

    Ladislav Hagara | Komentářů: 0
    včera 13:22 | Nová verze

    Byla vydána nová stabilní verze 6.10 (YouTube) multiplatformního frameworku a GUI toolkitu Qt. Podrobný přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    6.10. 23:55 | Komunita

    Ubuntu 26.04 LTS bude (𝕏) Resolute Raccoon (rezolutní mýval).

    Ladislav Hagara | Komentářů: 5
    6.10. 21:00 | Nová verze

    Netwide Assembler (NASM) byl vydán v nové major verzi 3.00. Přehled novinek v poznámkách k vydání v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (39%)
     (46%)
     (15%)
     (17%)
     (21%)
     (15%)
     (17%)
     (15%)
     (15%)
    Celkem 197 hlasů
     Komentářů: 13, poslední dnes 07:41
    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.