В школе мы использовали программу начальной загрузки для запуска автономных программ без операционной системы. Я изучал эту программу, и когда включен защищенный режим, происходит большой переход, который выполняется путем непосредственной сборки кода операции и операндов в качестве данных в программе. Это было для ассемблера GNU:
/* this code immediately follows the setting of the PE flag in CR0 */</p>
<pre><code>.byte 0x66, 0xEA
.long TARGET_ADDRESS
.word 0x0010 /* descriptor #2, GDT, RPL=0 */
Прежде всего, зачем делать это (вместо мнемоники инструкции)?
Я просматривал руководства Intel, но код все еще немного сбит с толку. В частности, в томе 2А, стр. 3-549, есть таблица кодов операций. Соответствующая запись:
EA *cp* JMP ptr16:32 Inv. Valid Jump far, absolute, address given in
operand
Фактический код операции очевиден, но первый байт, 0x66, сбил меня с толку. Ссылаясь на таблицу в руководстве Intel, cp, очевидно, означает, что последует 6-байтовый операнд. И, очевидно, 6 байтов следуют в следующих двух строках. 0x66 кодирует «Префикс переопределения размера операнда». Какое это имеет отношение к cp в таблице? Я ожидал, что для cp будет какое-то шестнадцатеричное значение, но вместо этого есть префикс переопределения. Может кто-нибудь прояснить это для меня?
Вот дамп из od:
c022 **ea66 0000 0001 0010** ba52 03f2 c030
TARGET_ADDRESS был определен как 0x00010000.
Меня также немного смущает значение двух последних байтов. Тем не менее, это, кажется, совсем другой вопрос. Становится довольно поздно, и я часами смотрю на код и руководства Intel, поэтому я надеюсь, что понял свою точку зрения.
Спасибо за внимание!