8051: инструкция JMP работает непредвиденным образом.

Я работаю с 89C51 в Keil uVision.

Я каким-то образом приобрел привычку использовать

JMP label   ; goto label

Согласно техническому описанию, JMP должно быть записано как JMP @A+DPTR, а для того, что я использую, следует использовать SJMP, LJMP и AJMP.

Тем не менее, то, как я его использую, работает просто отлично.

Вопрос в том, почему? Это какое-то дополнение к языку от uVision?


person MightyPork    schedule 26.03.2015    source источник
comment
Изучите сгенерированный машинный код. Я предполагаю, что это просто особенность вашего ассемблера, поэтому он генерирует наиболее подходящую инструкцию, но в руководстве ничего не нашел об этом.   -  person Jester    schedule 27.03.2015
comment
Я думаю, что это лучший способ использовать инструкцию JMP, если вы используете таблицу переходов.   -  person DigitalNinja    schedule 27.03.2015
comment
Хорошо, я проверил шестнадцатеричный файл, и он скомпилирован в SJMP (возможно, другие типы тоже, это тот, который я нашел).   -  person MightyPork    schedule 27.03.2015


Ответы (1)


Это оптимизация, которая вставляет соответствующую инструкцию перехода, поэтому вам не нужно определять, какая из них требуется.

Из Руководства пользователя Ax51:

Общие переходы и вызовы — это две мнемоники инструкций, которые не представляют конкретный код операции. JMP может собираться в SJMP, AJMP, LJMP или EJMP. CALL может собираться в ACALL, LCALL или ECALL. Эти общие мнемоники всегда оцениваются как инструкция, не обязательно самая короткая, которая достигает указанного операнда с адресом программы.

Если вам нужен определенный тип прыжка, вы всегда можете использовать соответствующую мнемонику.

person D Krueger    schedule 27.03.2015