теперь я пытаюсь понять код xv6. и я нашел ниже код.
Я думаю, что этот код связан с ассемблером, но я не смог найти, что он означает.
в частности, я обнаружил, что передняя часть asm volatile(:)
означает набор операций сборки и что такое eflags, но я не смог найти, что означает задняя часть этого ("= r" (eflags)) .
Итак, мой вопрос: что означает приведенный ниже код? Если вы можете дать мне какой-то ответ или совет, я буду очень благодарен вам за то, что вы поделились. Спасибо :)
static inline uint readeflags(void)
{
uint eflags;
asm volatile("pushfl; popl %0" : "=r" (eflags));
return eflags;
}
Чтобы ответить на ваш последний вопрос, часть "=r" (eflags)
— это способ, которым во встроенной сборке ССАГПЗ¹ указывается, какую переменную использовать с «местоположением» хранилища и каким образом (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html). Местоположения пронумерованы от 0, и можно указать несколько местоположений. %0
Следовательно, я первый.
pushfl
помещает содержимое регистра EFLAGS
в стек, а pop %0
удаляет самое верхнее значение, то есть значение EFLAGS
, и помещает его в ячейку %0
, которая будет переменной eflags
. Это сделано так, потому что набор инструкций IA-32 не содержит инструкции для чтения EFLAGS
напрямую.
1: также используется LLVM, но не MSVC — встроенный ассемблер не стандартизирован!