Сообщение от
Lethargeek
О какой тогда "полной совместимости" идёт речь? Я подумал, что планировалась бинарная.
Бинарная совместимость обеспечивается в 16-разрядном режиме. В 32-разрядном режиме полная бинарная совместимость в принципе невозможна, а частичная имеется на уровне легаси-команд. Если загрузить слова 16-разрядного кода в каждое второе слово 32-разрядного процесса - этот код будет работать в 32-разрядном режиме, но без ГАРАНТИИ полной совместимости, которая абсолютно невозможна ни в теории, ни на практике.
Сообщение от
Lethargeek
Не пойму, в чём уж такая проблема и зачем для её решения порождать/усугублять проблему несовместимости
Проблема в том, что полная совместимость абсолютно невозможна, поэтому проблемы совместимости 16-разрядного кода и 32-разрядного кода в принципе не существует. 16-разрядный код должен исполняться в 16-разрядном режиме, а 32-разрядный код - в 32-разрядном режиме.
Сообщение от
Lethargeek
Так что насчёт модифицируемого кода? Вот хотя бы перед вызовом в тело процедуры вписать константу. А потом чтоб тот же адрес в том же регистре послужил базой для доступа к таблице какой-нибудь (или же для вычисления базы). А как автоинкременты должны работать? Неизвестно же, это шаг на следующую команду или на данные.
Названные проблемы на уровне ассемблерных исходников отсутствуют, поэтому если скомпилировать исходник в 16-разрядный код - он будет работать в 16-разрядном режиме, а если скомпилировать исходник в 32-разрядный код - он будет работать в 32-разрядном режиме. Приведите пример исходника с относительной адресацией без числовых констант, который будет работать в 16-разрядном режиме, но не будет работать в 32-разрядном режиме.
Такой код - в любом режиме будет работать одинаково:
Код:
MOV CONST, R0
MOVB ByteTBL(R0), R1
MOV #2, CONST
MOV (PC)+, R0
CONST: 1
ADD #WordTBL, R0
MOV (R0)+, R2
MOV (R0)+, R3
HALT
ByteTBL:
.BYTE 0,1,2,3,4,5,6,7
WordTBL:
.WORD 0,1,2,3,4,5,6,7