В чем смысл asm-кода, связанного с syscall, в архитектуре uclibc для архитектуры i386
#define INLINE_SYSCALL(name, nr, args...) \
({ \
unsigned int resultvar; \
asm volatile ( \
LOADARGS_##nr \
"movl %1, %%eax\n\t" \
"int $0x80\n\t" \
RESTOREARGS_##nr \
: "=a" (resultvar) \
: "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc"); \
if (resultvar >= 0xfffff001) \
{ \
__set_errno (-resultvar); \
resultvar = 0xffffffff; \
} \
(int) resultvar; })
#define LOADARGS_0
#define LOADARGS_1 \
"bpushl .L__X'%k2, %k2\n\t" \
"bmovl .L__X'%k2, %k2\n\t"
#define LOADARGS_2 LOADARGS_1
#define LOADARGS_3 LOADARGS_1
#define LOADARGS_4 LOADARGS_1
#define LOADARGS_5 LOADARGS_1
кто знает значение следующего кода asm
#define LOADARGS_1 \
"bpushl .L__X'%k2, %k2\n\t" \
"bmovl .L__X'%k2, %k2\n\t"
может кто-нибудь объяснить мне%2 означает третьи параметры в вводе и выводе asm, так что%k2 означает, что и что означает.L__X bpushl и bmovl, кажется, не такая инструкция для ia32
1 ответ
Решение
%2
а также %k2
ограничения регистра, которые хорошо описаны здесь: Простые ограничения
bpushl
а также bmovl
являются макросами, определенными uClibc в syscalls.h, и, похоже, они предназначены для сохранения предыдущего значения в%ebx перед его захламлением.
.L__X
определяется в том же файле.