Страница 1 из 1

вставки на ASN'е

Добавлено: 27 сен 2003, 02:37
mp3

Нужно в сишную программу сделать вставку на ASM'е
Пытаюсь сделать так:

Somefunction(){
....
asm
{
movl %eax,%ebx
}
...
}
В итоге parse error
Что делать???

Добавлено: 27 сен 2003, 03:20
AlekseyKondratenko
See info gcc.

Also look at headers in /usr/include/asm/ or /usr/src/linux/include/asm/

Добавлено: 27 сен 2003, 19:49
mp3
Посмотрел ... бр
вот для примера
#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \
do { \
int dummy; \
asm("1: movl (%1),%%eax;" \
"movl %%eax,%%edx;" \
"andl %2,%%edx;" \
"btsl $0x1,%%edx;" \
"adcl $0x0,%%edx;" \
"lock; cmpxchgl %%edx,(%1);" \
"jnz 1b;" \
"cmpb $0x3,%%dl;" \
"sbbl %%eax,%%eax" \
:"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~1L):"dx"); \
} while(0)

%1 , %2 очевидно параметры a ,c ; но как полностью расшифровать строчку
:"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~1L):"dx");

^ ^ ^ почему в одном случае есть = а в другом нет.

PS Есть ли какая-нибудь дока типа PORTING HOW-TO?


:shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock:

Добавлено: 27 сен 2003, 20:52
AlekseyKondratenko
There was something like assemply howto.

Also look at gcc info page at section gcc extensions.

Добавлено: 17 мар 2004, 01:02
red f0x
Почти, только =а и =с это не параметры, а вид, в котором хранятся/записываются переменные. На эту тему не могу посоветовать ничего лучше как почитать маны или лучше инфы по инлайн-ассмеблеру в gcc. Здесь описывать всё это тоже не буду - долго занудно и кроме того у меня нет педагогического таланта:D
%-символ, который надо писать перед именами регистров. Но в инлайне нужен двойной % перед регистрами (%%еах). $ - префикс для "непосредственной" переменной ($0x3 - нечто иное как 0х3, а не указатель на память с адресом 0х3, например)
Н/с портирования ИМХО следует хорошо изучить доки по инлайну и всё будет ОК

Добавлено: 17 мар 2004, 01:08
red f0x

Код: Выделить всё

asm (“shrl $8, %0” : “=r” (answer) : “r” (operand) : “cc”);
The keyword asm is followed by a parenthetic expression consisting of sections separated
by colons.The first section contains an assembler instruction and its operands. In
this example, shrl right-shifts the bits in its first operand. Its first operand is represented
by %0. Its second operand is the immediate constant $8.
The second section specifies the outputs.The instruction’s one output will be
placed in the C variable answer, which must be an lvalue.The string “=r” contains an
equals sign indicating an output operand and an r indicating that answer is stored in a
register.
The third section specifies the inputs.The C variable operand specifies the value to
shift.The string “r” indicates that it is stored in a register but omits an equals sign
because it is an input operand, not an output operand.
The fourth section indicates that the instruction changes the value in the condition
code cc register.

Добавлено: 17 мар 2004, 01:13
red f0x
Для output'a могут быть такие флаги:

R General register (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP)
q General register for data (EAX, EBX, ECX, EDX)
f Floating-point register
t Top floating-point register
u Second-from-top floating-point register
a EAX register
b EBX register
c ECX register
d EDX register
x SSE register (Streaming SIMD Extension register)
y MMX multimedia registers
A An 8-byte value formed from EAX and EDX
D Destination pointer for string operations (EDI)
S Source pointer for string operations (ESI)

За более подробными разъяснениями - info

Добавлено: 17 мар 2004, 14:47
Scorpion
А проще никак нельзя!

Добавлено: 17 мар 2004, 15:30
red f0x
Scorpion, что именно?

Добавлено: 18 мар 2004, 01:09
Гость
Такой подход вполне правильный, так как компилятор
знает какие регистры используются и есть ли "глобальный"
побочный эффект у вставки. Без этой синтаксической
оссобенности компилятору пришлось бы анализировать
ассемблерный код. Похожие оссобенности были, кажется,
и в Watcom C.