помощь в понимании этого фрагмента кода
Это code snipper из заголовка.S-файл в коде ядра. Я не мог понять, что делает инструкция lretw
. Я проверил так много онлайн-источников для инструкции.
# We will have entered with %cs = %ds+0x20, normalize %cs so
# it is on par with the other segments.
pushw %ds
pushw $6f
lretw
Может ли кто-нибудь помочь мне в понимании этого наставления?1 ответ:
ret
это инструкция вернуться с процедуры. Таким образом, в основном он выводит обратный адрес из стека в регистр EIP.Префикс
l
здесь, чтобы сказать, что этодалекое возвращение из процедуры. В этом случае команда сначала вставляет значение из стека в регистр EIP, а затем вставляет второе значение в регистр CS.Суффикс
w
здесь, потому что на этом шаге мы работаем в реальном режиме, и операнды составляют 16 бит широкий.Точный код:
pushw %ds pushw $6f lretw 6:
6:
здесь очень важно. Таким образом, это делает следующее: помещает значение ds в стек, помещает адрес метки6
в стек, а затем запускает эту инструкциюlretw
. Таким образом, в основном, он загрузит адрес метки6
в регистр указателя инструкции и загрузит регистрcs
со значением регистраds
. Так что это просто трюк, чтобы продолжить выполнение в label6
с изменениемcs
значения регистров.