2014-02-12 11 views
1
#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 

кто знает смысл следующего кода ассемблерногочто смысл связанных системных вызовов ассемблерного кода в uclibc для архитектуры i386

#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

ответ

0

%2 и %k2 Реестровая ограничения, которые описаны здесь хорошо: Simple Constraints

bpushl и bmovl макросы, определенные в uClibc syscalls.h, и, кажется, имел в виду, чтобы сохранить предыдущее значение в% EBX перед тем затирания его.

.L__X определен в том же файле.

+0

для .L__X '% ebx = 1 \ n \ ti не может понять значение, придавая значение символу .L__X или .L__X'% ebx или имеет некоторые другие значения @ superdesk – Adambynes

+0

.if 1 - \\ name \ n \ t в чем смысл \\ я думаю \ для разрешения значение имени, но \\ использует escape для \, поэтому что здесь используется @ superdesk – Adambynes

+0

Вы, вероятно, прав насчет \\. Он разрешает \, так что макрос имеет в нем '\ name'. Когда используется макрос, '.L__X '% k2' заменяет \ name (я думаю). Это дает вам .if 1 - .L__X '% k2' внутри макроса bpushl. Сам L__X - это макрос ... он выглядит как 1, 2 или 3 в зависимости от регистра. Поэтому '.if 1 - 1' может быть последней строкой ... Но я не уверен ни в одном из этого. – superdesk