[Перевод] Недокументированные операционные коды процессора 8086

Недавно, когда я изучал досовые бут-секторы, я обнаружил довольно загадочную вещь. DOS распознает, является ли бут-сектор загрузочным, по нескольким критерям, и один из них (странно, да?) — есть ли в первых двух байтах jump-инструкция, которая указывает, соответственно, куда-нибудь за BPB. В модуле MSDISK.INC из MS-DOS 3.21 OAK как раз и происходят такие проверки. Модуль проверяет, начинается ли BPB с прыжка, при этом за верную jump-инструкцию он принимает опкоды EBh (short JMP), E9h (JMP), или 69h. Стоп. 69? Это же IMUL! Не-а, не IMUL. Комментарий в коде утверждает, что это «direct jump»: cmp byte ptr cs:[DiskSector],069H; Is it a direct jump? je Check_Signature; don’t need to find a NOP cmp byte ptr cs:[DiskSector],0E9H; DOS 2.0 jump? je Check_Signature; no need for NOP cmp byte ptr cs:[DiskSector],0EBH; How about a short jump. jne BadDisk Хорошо, вот только про 69h в документации 8086 ничего не сказано! Да, в 8186 и далее — это опкод IMUL, но то, что 8086 умеет IMUL — крайне маловероятно. Тем более, комментарий ясно указывает, что это прыжок. Может быть, на процессорах 8086 69h ведёт себя как прыжок? Вопрос хороший, вот только информации по этому поводу почти нет. Читать дальше →

© Habrahabr.ru