Я пытаюсь понять, что будет компиляция результат следующего кода в 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), поэтому я понимаю синтаксис встроенной сборки.
Не могли бы вы дать мне подсказку, как завершить компиляцию результата, которую я написал выше?
Спасибо!
Итак, когда вы пишете «int ppid», компилятор не генерирует код сборки, управляющий регистрами? – SyndicatorBBB
Не как таковой, нет, но в начале функции он выделяет пространство для всех локальных переменных. Таким образом, в этом смысле, да, в начале есть что-то вроде 'subl $ 4,% esp', где выделенная сумма зависит от размера всех локальных переменных и требований к выравниванию платформы. – Jester
Большое спасибо! – SyndicatorBBB