помощь в понимании этого фрагмента кода


Это 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 5

1 ответ:

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

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

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

Точный код:

    pushw   %ds
    pushw   $6f
    lretw
6:

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

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