2015-04-04 3 views
0

Я пытаюсь понять, что будет компиляция результат следующего кода в C:Встроенный ассемблер в C - Поймите компиляции результат

int ppid; 
#define SYS_getppid 23 
asm volatile("int %1" : "=a" (ppid) : "i" (T_SYSCALL), "a" (SYS_getppid)); 

Где T_SYSCALL постоянная 64.

Это что я придумал до сих пор:

?       // I know something is missing here but I'm not sure what it is 
mov $(SYS_getppid), %eax  // "a" (SYS_getppid) 
int $(T_SYSCALL)    // T_SYSCALL = 64 in xv6 
?       // I know something is missing here but I'm not sure what it is 

Я не уверен, что делать с переменной ppid. Где я должен сохранить его, когда он объявлен, и как мне назначить значение этой переменной в результате встроенного кода сборки (думаю, я должен использовать косвенную адресацию где-нибудь).

Уведомление Я попытался использовать компилятор GCC, чтобы создать файл сборки из файла c, но результат слишком сложный, и я не уверен, что правильно его понимаю (я пытаюсь придумать самый простой результат компиляции).

Также я прочитал о встроенной сборке на веб-сайте GNU (https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html#Using-Assembly-Language-with-C), поэтому я понимаю синтаксис встроенной сборки.

Не могли бы вы дать мне подсказку, как завершить компиляцию результата, которую я написал выше?

Спасибо!

ответ

1

Есть два входных операнда, и вы правильно обработали их оба, чтобы в начале ничего не было.

У вас есть одна выходная переменная, ppid, которая использует ограничение a, и вы уже знаете, что относится к регистру eax. Это означает, что компилятор ожидает, что значение для ppid будет в eax после блока asm. Таким образом, что-то вроде movl %eax, ppid, или, если ppid является локальной переменной, то, конечно, используйте правильный сдвиг от esp или ebp, такой как movl %eax, 4(%esp).

+0

Итак, когда вы пишете «int ppid», компилятор не генерирует код сборки, управляющий регистрами? – SyndicatorBBB

+0

Не как таковой, нет, но в начале функции он выделяет пространство для всех локальных переменных. Таким образом, в этом смысле, да, в начале есть что-то вроде 'subl $ 4,% esp', где выделенная сумма зависит от размера всех локальных переменных и требований к выравниванию платформы. – Jester

+1

Большое спасибо! – SyndicatorBBB

Смежные вопросы