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.

Člen

Zobrazeno 11 zpráv z 11.
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.