Diskuze: assembler v code::blocks s GNU GCC pod linuxem
V předchozím kvízu, Online test znalostí Assembler, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 11 zpráv z 11.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí Assembler, jsme si ověřili nabyté zkušenosti z kurzu.


Problém je také v tom, že ani na IA32 ani na AMD64 (x64) neexistuje instrukce přesunu dat mezi dvěma proměnnými (místy v paměti). Vždy musí být alespoň jeden operand registr nebo konstanta.
Assembler by měl jít vkládat přes __asm (jednoinstrukční varianta) resp. _asm { ... } (více instrukční varianta.
Co se týče syntaxe instrukcí, GCC (alespoň podle mých zkušeností a https://www.ibiblio.org/…y-HOWTO.html) užívá syntaxe AT&T, kterářto mi přijde zbytečně nepřehledná a ukecaná (na rozdíl od Intel syntaxe, kde ale člověk řeší v podstatě jen jednu architekturu).
EDIT:
Aha, takže pro vkládání Assembleru se užívá asm() či
__asm__().
Doplním, že GCC lze přinutit k používání Intelovské syntaxe dvěma způsoby:
asm(".intel_syntax noprefix");
nebo volbou -masm=intel v kompilátoru.
tak jsem to předělal na
asm(
".intel_syntax noprefix \n\t"
"mov eax,(a) \n\t"
"add (b),eax"
);
a píše to:
||=== Build: Debug in ASMTest (compiler: GNU GCC Compiler) ===|
/home/thugmek/Dokumenty/code::blocks/asmtest/ASMTest/main.cpp||In function ‘int main()’:|
/home/thugmek/Dokumenty/code::blocks/asmtest/ASMTest/main.cpp|5|warning: unused variable ‘a’ [-Wunused-variable]|
/home/thugmek/Dokumenty/code::blocks/asmtest/ASMTest/main.cpp|6|warning: unused variable ‘b’ [-Wunused-variable]|
/tmp/ccwoiWYB.s|31|Error: no such instruction: `movl $0,%eax'|
||=== Build failed: 1 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|
bez prvního řádku to píše:
||=== Build: Debug in ASMTest (compiler: GNU GCC Compiler) ===|
/home/thugmek/Dokumenty/code::blocks/asmtest/ASMTest/main.cpp||In function ‘int main()’:|
/home/thugmek/Dokumenty/code::blocks/asmtest/ASMTest/main.cpp|5|warning: unused variable ‘a’ [-Wunused-variable]|
/home/thugmek/Dokumenty/code::blocks/asmtest/ASMTest/main.cpp|6|warning: unused variable ‘b’ [-Wunused-variable]|
/home/thugmek/Dokumenty/code::blocks/asmtest/ASMTest/main.cpp|11|Error: too many memory references for `mov'|
/home/thugmek/Dokumenty/code::blocks/asmtest/ASMTest/main.cpp|12|Error: too many memory references for `add'|
||=== Build failed: 2 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|
Co zkusit tohle?
asm(
".intel_syntax noprefix \n\t"
"mov eax, dword ptr [a] \n\t"
"add dword ptr [b], eax"
);
Předpokládám, že a a b jsou 32bitová celá čísla. Případně zkus vynechat slovo ptr.
furt to píše to samý, nejde to ani když jsou čísla int, ani když jsou char
asm volatile (
".intel_syntax noprefix;"
"add %%eax, %%ebx;"
:"=a" (a)
:"b" (b)
);
Ty dolní argumenty znamenají, že se tyto proměnné přesunou do registru
EAX (a) a výsledek se uloží do registru EBX (b), který se přesune do
proměnné b.
Ohledně inline asm doporučuji dokumentaci GCC:
https://gcc.gnu.org/…-with-C.html
Pardon, moje chyba. Výsledek se samozřejmě neuloží do EBX ale do EAX. EBX je jen vstupní parametr.
teď se to sice přeloží, ale nic to nesečte. Moc tomu nerozumím, kde se vezmou hodnoty v registrech?
Sečte, pošli celý kód. Hodnoty se tam ocitnou pomocí těch parametrů "=a"(a) (Zapiš hodnotu a do EAXu a na konci bloku přesuň hodnotu z EAXu do a) a "b"(b) (Zapiš hodnotu b do EBX) . Přečti si tu dokumentaci, co jsem ti posílal.
Zobrazeno 11 zpráv z 11.