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í
×
včera 15:11 | Komunita

Ubuntu 21.04 bude Hirsute Hippo.

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

Byla vydána verze 12.2 svobodného unixového operačního systému FreeBSD. Podrobný přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 2
včera 07:00 | Nová verze

Byla vydána nová stabilní verze 20.09 linuxové distribuce NixOS (Wikipedie). Její kódové označení je Nightingale. Přehled novinek v poznámkách k vydání. O balíčky se v NixOS stará správce balíčků Nix.

Ladislav Hagara | Komentářů: 0
27.10. 15:55 | IT novinky

Na Indiegogo byla spuštěna kampaň na podporu mobilního telefonu s klávesnicí Pro1 X od společnosti F(x)tec. Na výběr je předinstalovaný LineageOS, Ubuntu Touch nebo Android.

Ladislav Hagara | Komentářů: 12
27.10. 15:11 | Nová verze

Bylo oznámeno (en) vydání Fedory 33. Ve finální verzi vycházejí tři oficiální edice: Workstation pro desktopové nasazení, Server pro serverové nasazení a IoT pro internet věcí. Vedle nich jsou k dispozici také vznikající edice Silverblue a alternativní desktopy, např. KDE Plasma, Xfce nebo LxQt, a k tomu laby – upravené vydání Fedory například pro designery, robotiku, vědecké použití atd. Stahovat lze z Get Fedora. Přehled novinek v

… více »
Ladislav Hagara | Komentářů: 17
27.10. 14:22 | Zajímavý článek

V Edici CZ.NIC vyšla kniha Data, čipy, procesory od Martina Malého. Koupit ji lze tištěnou nebo zdarma stáhnout ve formátech PDF (10 MB), EPUB (4,3 MB) a MOBI (11 MB). Jedná se o volné pokračování knih Hradla, volty, jednočipy a Porty, bajty, osmibity.

Ladislav Hagara | Komentářů: 0
27.10. 13:33 | IT novinky

Společnost AMD kupuje firmu Xilinx za 35 miliard dolarů. V září bylo oznámeno, že společnost Nvidia kupuje firmu Arm za 40 miliard dolarů.

Ladislav Hagara | Komentářů: 4
27.10. 07:00 | Komunita

Neziskové technologické konsorcium Linux Foundation rozšířilo seznam svých oficiálních projektů. Nejnovějším projektem je SDDI (Software Developer Diversity and Inclusion), jehož cílem je rozšiřování diverzity a inkluze v softwarovém inženýrství.

Ladislav Hagara | Komentářů: 60
27.10. 06:00 | Komunita

Greg Kroah-Hartman oznámil, že Linux 5.10 bude jádrem s prodlouženou upstream podporou (LTS, Long Term Support). Aktuální jádra s prodlouženou podporou jsou 4.4, 4.9, 4.14, 4.19 a 5.4.

Ladislav Hagara | Komentářů: 0
26.10. 18:22 | Komunita

Uživatelé linuxové distribuce Debian mají možnost hlasovat o výchozím grafickém motivu Debianu 11 aneb Bullseye.

Ladislav Hagara | Komentářů: 9
Které aspekty uživatelského rozhraní textového editoru považujete za důležité?
 (70%)
 (37%)
 (33%)
 (17%)
 (24%)
 (16%)
Celkem 227 hlasů
 Komentářů: 21, poslední 23.10. 17:33
Rozcestník

Dotaz: Zapisovanie do pamate

12.8.2019 19:24 mates
Zapisovanie do pamate
Přečteno: 450×
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: 76 | blog: Výlevníček | 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: 62 | 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: 62 | 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: 76 | blog: Výlevníček | 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.