Я строю проект Windows Phone с некоторыми его частями в сборке. Мой файл сборки находится в режиме ARM (CODE32
), и он пытается перейти к функции C, которую я знаю, скомпилирован для Thumb. Код выглядит следующим образом:ARM/Thumb interworking в сборке
ldr r12, [pFunc]
mov pc, r12
pFunc
dcd My_C_Function
Вот что странно. Значение в pFunc
в фрагменте является указателем на функцию thunk plus one. То есть устанавливается 0-й бит, как если бы целью перехода был Thumb, а команда перехода - BX. Но трюк явно ARM! Thunk загружает адрес тела функции плюс один и выполняет BX для него, правильно переключая режимы.
Попытка BX к этому адресу, вероятно, потерпит крах, поскольку это переключит режимы и попытается выполнить код ARM в режиме Thumb, это не очень хорошая идея. Пытаться просто перейти на этот адрес (как это делает текущий код), вероятно, тоже произойдет сбой, потому что ПК окажется неравнозначным.
Я мог бы теоретически вручную очистить 0-й бит, а затем прыгнуть, но я должен подумать об ошибке. Thunk генерируется компилятором C - правильно? Компилятор C знает, что thunk - это код ARM. Адрес в pFunc генерируется компоновщиком, так как это межмодульный вызов. Таким образом, младший бит помещается туда компоновщиком; почему линкер не знает, что эти трюки являются ARM?
Любые объяснения, пожалуйста?
У меня сейчас нет устройства WP8, поэтому я не могу попробовать его в реальном оборудовании. Ужасно глядя на сгенерированный код - это единственная технология отладки, которая у меня есть :(
EDIT: но что, если эти громкости не являются ARM, но Thumb-2? Thumb-2 поддерживает 32-разрядную команду IIRC. то же, что и в режиме ARM? Как все-таки декодируют команды Thumb-2?
Если вы определили все свои ярлыки прямо в сборке (с помощью ассемблера gnu вы преследуете метки ярлыков с помощью .thumb_func, не знаете, как это сделать с другими инструментальными целями), а C должен позаботиться о себе. оттуда ассемблер, компилятор и компоновщик позаботятся о bx на четный или нечетный адрес в зависимости от адресата. –
Ассемблер - это аромат ARM от MASM. Я проверю, могу ли я соответствующим образом украсить ярлык. Но, по общему признаку, я не могу теоретически знать, какие режимы являются другими объектными файлами. Что делать, если они являются объектами сторонних разработчиков? Я бы ожидал, что компоновщик будет умным. –
Это моя точка зрения, я бы ожидал, что компоновщик будет умным, используйте дизассемблер, если у вас есть возможность проверить и убедиться, что инструменты сделали это правильно. –