вставки на ASN'е
вставки на ASN'е
Нужно в сишную программу сделать вставку на ASM'е
Пытаюсь сделать так:
Somefunction(){
....
asm
{
movl %eax,%ebx
}
...
}
В итоге parse error
Что делать???
Посмотрел ... бр
вот для примера
#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?
вот для примера
#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?
Почти, только =а и =с это не параметры, а вид, в котором хранятся/записываются переменные. На эту тему не могу посоветовать ничего лучше как почитать маны или лучше инфы по инлайн-ассмеблеру в gcc. Здесь описывать всё это тоже не буду - долго занудно и кроме того у меня нет педагогического таланта:D
%-символ, который надо писать перед именами регистров. Но в инлайне нужен двойной % перед регистрами (%%еах). $ - префикс для "непосредственной" переменной ($0x3 - нечто иное как 0х3, а не указатель на память с адресом 0х3, например)
Н/с портирования ИМХО следует хорошо изучить доки по инлайну и всё будет ОК
%-символ, который надо писать перед именами регистров. Но в инлайне нужен двойной % перед регистрами (%%еах). $ - префикс для "непосредственной" переменной ($0x3 - нечто иное как 0х3, а не указатель на память с адресом 0х3, например)
Н/с портирования ИМХО следует хорошо изучить доки по инлайну и всё будет ОК
Ну какая работа со строками может быть в языке, название которого является не строкой, а символом? (c) Sergue E. Leontiev
Код: Выделить всё
asm (“shrl $8, %0” : “=r” (answer) : “r” (operand) : “cc”);
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.
Ну какая работа со строками может быть в языке, название которого является не строкой, а символом? (c) Sergue E. Leontiev
Для 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
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
Ну какая работа со строками может быть в языке, название которого является не строкой, а символом? (c) Sergue E. Leontiev