С помощью abstract
вы можете опустить реализации методов и методов получения / установки
// with
abstract class A {
int foo();
String get bar;
set baz(String value);
}
var a = A(); // error about instantiating abstract class
class B extends A {
// error about missing implementations
}
var b = B(); // ok
// without
class A {
int foo(); // error about missing implementation
String get bar; // error about missing implementation
set baz(String value); // error about missing implementation
}
class B extends A {}
. noprefix
/prefix
директивы только управляют, требуют ли регистры a %
префикс (*) (по крайней мере, это кажется так и это - единственная разница упоминания документации). Литералам значения всегда нужен a $
префикс в синтаксисе AT&T и никогда в синтаксисе Intel. Так следующие работы:
__asm__(".intel_syntax prefix");
__asm__("MOV [DWORD PTR 0xDEADBEEF], 0x1234");
Если Вы действительно склонны использовать встроенный ассемблерный код синтаксиса Intel в рамках кода C, скомпилированного с GCC и собранного с GAS, не забывайте также добавлять следующее после него, так, чтобы ассемблер мог grok остальная часть (синтаксис AT&T) блок, сгенерированный GCC:
__asm__(".att_syntax prefix");
Обоснование я вижу prefix/noprefix различие, это для синтаксиса AT&T, %
префикс не действительно необходим для регистров на архитектуре Intel, потому что регистры называют. Но для однородности это может быть там, потому что некоторая другая архитектура (т.е. SPARC) пронумеровала зарегистрированный, в этом случае указав, что одно только небольшое число было бы неоднозначно относительно того, были ли предназначены адрес памяти или регистр.
Вот мои собственные результаты:
*(int *)0xdeadbeaf = 0x1234; // reference implementation
// AT&T: addresses without sigil; parentheses are optional
__asm__(".att_syntax prefix");
__asm__("movl $0x1234,0xdeadbeaf"); // works
__asm__("movl $0x1234,(0xdeadbeaf)"); // works
__asm__("movl $0x1234,($0xdeadbeaf)"); // doesn't work, doesn't warn!
//__asm__("movl $0x1234,$0xdeadbeaf"); // doesn't compile
//__asm__("movl 0x1234,0xdeadbeaf"); // doesn't compile
//__asm__("movl 0x1234,(0xdeadbeaf)"); // doesn't compile
__asm__(".att_syntax noprefix");
// same as above: no registers used!
// Intel: addresses with square brackets or segment register prefix
// brackets without prefix will warn
__asm__(".intel_syntax noprefix");
__asm__("mov DWORD PTR ds:0xdeadbeaf,0x1234"); // works
__asm__("mov DWORD PTR ds:[0xdeadbeaf],0x1234"); // works
__asm__("mov DWORD PTR [0xdeadbeaf],0x1234"); // works, but warns!
//__asm__("mov DWORD PTR 0xdeadbeaf,0x1234"); // doesn't compile
// `prefix` will add % to register names
__asm__(".intel_syntax prefix");
__asm__("mov DWORD PTR %ds:0xdeadbeaf,0x1234"); // works
__asm__("mov DWORD PTR %ds:[0xdeadbeaf],0x1234"); // works
__asm__("mov DWORD PTR [0xdeadbeaf],0x1234"); // works, but warns!
//__asm__("mov DWORD PTR 0xdeadbeaf,0x1234"); // doesn't compile
__asm__(".att_syntax prefix");