команда для jmp (межсегментный косвенный переход)

компилятор MASM, два раза его упомянула. С каких пор команды процессора зависят от компилятора? о_О

вообще глобально - я пишу транслятор, который должен переводить определённый набор команд ассемблера в машинный код. Мне не жалко нарисовать на выходе то, что я считаю нужным, но мне нужно знать, что я права, рисуя это. Есть вероятность, что я неправильно объявляю label10, поэтому оно воспринимает его как ближний переход, или ещё где-нибудь не права.

В случае косвенного перехода jmp в поле reg байта ModR/m хранится продолжение команды. Когда jmp ближний, там хранится 4, когда дальний - 5. Т.е. команда дальнего косвенного перехода выглядит так: 1111 1111 **10 1---, где ** поле Mod, всегда равен 00, потому что байта Sib в команде jmp быть не может; а --- поле R/m, которое равно либо коду регистра, если в команде он фигурирует, либо 101, если после байта ModR/m идут байты смещения. Так вот, в случае ближнего перехода Интел допускает хранение адреса перехода и в регистре, и в памяти. В вашем примере JMP [BX] - адрес хранится в регистре. В случае же дальнего перехода Интел допускает хранение адреса только в памяти, поэтому тупое добавление 8 к предыдущей команде, оно же попытка сформировать JMP FAR [BX] - это ошибка и есть, процессор этого не понимает.

Я не зря написала про километры теории

Добавлено через 2 часа 25 минут

Я попробовала другую версию MASM, результат тот же: формирует ближний косвенный вместо дальнего.

Добавлено через 9 часов 47 минут

Скорее всего, прикол в том, что 4-х байт, выделяемых командой

label10 dd l10

не хватает, чтобы хранить 4 байта смещения + 2 байта сегмента. Поэтому оно хранит только смещение, и вполне логично формирует ближний переход. Только почему-то на

label10 dp l10

(6 байт) масм ругается, хочет в качестве операнда константу, а не метку. Подозреваю, дело в

.386

, но я хз что ему прописать вместо неё, чтобы не ругался. *ушла думать дальше*