Двоичный перевод | Кросс-компиляция - PullRequest
0 голосов
/ 14 марта 2011

Допустим, вы пишете компиляторы для разных архитектур. Архитектуры имеют разные порядки байтов. У вас есть память для чтения и записи инструкций

Возьмите пример инструкции сохранения, где вы хотите сохранить значение 0xAA0xBB0xCC0xDD. Теперь, когда вы пишете сборку для этого, вы пишете две разные инструкции для различные архитектуры, например

Для байтов: st (reg), 0xDD0xCC0xBB0xAA

Для большого порядка байтов: st (reg), 0xAA0xBB0xCC0xDD

Или вы пишете одну и ту же инструкцию, скажем, st, (reg), 0xAA0xBB0xCC0xDD для обеих архитектур и позволяете процессору проанализировать инструкцию, чтобы она позаботилась о порядке байтов системы?

Причина, по которой я задаю этот вопрос, заключается в том, что я не знаю, что будет делать бинарный переводчик, когда ему приходится переводить код между архитектурами с разными порядками байтов. Если в Архитектуре A вы видите следующую строку st, (reg), XY, то конвертируете ли вы ее в st, (reg), YX для Архитектуры B ?? Если это так, то что происходит с чтением из памяти?

Я хотел бы знать, как позаботиться о порядке байтов, учитывая чтение и запись памяти в двоичном переводе.

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

Endianess не имеет ничего общего с тем, как память читается или записывается, но вместо этого он просто означает, что когда память интерпретируется как число, это самый старший или первый байт.Различие заключается только в реализации арифметики.

Таким образом, ваш двоичный переводчик, даже если такая вещь вообще существует, ничего не изменит, это просто инструкции типа ADD, SUB и MUL, которые интерпретируют числапо-разному.

1 голос
/ 14 марта 2011

Я не уверен, что полностью понимаю ваш вопрос, но похоже, что вы хотите перевести какой-нибудь код на ассемблере или дизассемблированный двоичный файл?

Каждый ассемблер, с которым я когда-либо работал, справляется с порядком байтовконстанты в здравом уме.То есть, если вы хотите сохранить 0xAABBCCDD, вы должны написать:

st (reg), 0xAABBCCDD

И ассемблер при необходимости изменит константу для соответствующего кода операции.Где проблема порядка байтов становится проблемой, когда вы хотите сохранить несколько однобайтовых значений, используя эту одну операцию.Что-то вроде записи короткой строки с нулевым символом в конце "123" в память с использованием того же кода операции.Вы должны перебросить эту константу в своем ассемблерном коде, чтобы вывести ее в память в правильном порядке для систем с прямым порядком байтов:

st (reg), 0x31323300 // big-endian
st (reg), 0x00333231 // little-endian

Безопасный способ - просто сохранить байты впорядок, который вы хотите:

stb (reg+0), 0x31
stb (reg+1), 0x32
stb (reg+2), 0x33
stb (reg+3), 0x00

Но вместо этого требуется четыре инструкции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...