помочь в понимании этого фрагмента кода - PullRequest
5 голосов
/ 08 сентября 2011

Это фрагмент кода из файла header.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 Ответ

5 голосов
/ 08 сентября 2011

ret - инструкция для возврата из процедуры. Таким образом, в основном он вставляет адрес возврата из стека в регистр EIP.

префикс l здесь, чтобы сказать, что это дальний возврат из процедуры. В этом случае инструкция сначала вставляет значение из стека в регистр EIP, а затем вставляет второе значение в регистр CS.

здесь указан суффикс w, потому что на этом шаге мы работаем в реальном режиме, а операнды имеют ширину 16 бит.

Точный код:

    pushw   %ds
    pushw   $6f
    lretw
6:

6: очень важен здесь. Итак, что это делает: поместите значение ds в стек, вставьте адрес метки 6 в стек и затем вызовите эту инструкцию lretw. Таким образом, в основном, он загрузит адрес метки 6 в регистр указателя инструкций и загрузит регистр cs со значением регистра ds. Так что это всего лишь прием для продолжения выполнения с меткой 6 с изменением значения регистра cs.

Вы должны загрузить http://www.intel.com/design/intarch/manuals/243191.htm, который дает точные детали для всех инструкций, включая псевдокод, который подробно описывает, что делает каждая инструкция.

...