Как использовать константы адреса во встроенном ассемблерном коде GCC x86

С помощью 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 {}
.
9
задан 11 revs, 4 users 82% 9 September 2010 в 20:24
поделиться

2 ответа

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) пронумеровала зарегистрированный, в этом случае указав, что одно только небольшое число было бы неоднозначно относительно того, были ли предназначены адрес памяти или регистр.

5
ответ дан 4 December 2019 в 23:41
поделиться

Вот мои собственные результаты:

*(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");
1
ответ дан 4 December 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: