LINUX.ORG.RU

Можно ли написать на асме кроссплатформенный код?


0

2

Здравствуйте, уважаемые линуксоиды.

Имеется реализация одного нетривиального алгоритма на ассемблере. Код предназначен для исполнения на процессорах Intel в реальном режиме. Вряд ли его можно переписать на C без потери производительности, так как там использованы такие возможности микропроцессора как флаг PE; кроме того, код хорошо оптимизирован с использованием таких команд как LoopNE, LodSB и т.д. Можно ли такой код сделать кроссплатформенным?

Если кому-то интересно, это реализация декодирования по Хэммингу. Модуль можно собрать под MSDOS с использованием Open Watcom. Хотелось бы использовать его в программе, разработанной под Windows и Linux. Можно ли это сделать с помощью того же Watcom, или нужно для каждой платформы писать свою реализацию?

Или, быть может, можно иметь один код + конфигуратор к нему под конкретную платформу?

Заранее благодарю за любые полезные рекомендации.

нетривиального алгоритма

Я тоже в своё время делал такую лабу.

adriano32 ★★★
()

исполнения на процессорах Intel в реальном режиме

без потери производительности


x_x

vasily_pupkin ★★★★★
()

Можно, если пользоваться транслятором PASM.

Quasar ★★★★★
()

>Вряд ли его можно переписать на C без потери производительности, так как там использованы такие возможности микропроцессора как флаг PE; кроме того, код хорошо оптимизирован с использованием таких команд как LoopNE, LodSB и т.д.

Да ведь и конпеляторы нынче не лыком шиты.

proud_anon ★★★★★
()
Ответ на: комментарий от Quasar

Я не могу воспользоаться QEMU. Это не законченная программа, а всего лишь модуль. И вот его нужно скомпоновать с другим модулем, написанным под Линукс/Виндоуз (то есть, под защищённый режим), чтобы этот как-то заработало.

Starduster
() автор топика
Ответ на: комментарий от Starduster

Ты правда не можешь kvm от qemu отличить или только зеленеешь?

Elemir
()

>Вряд ли его можно переписать на C без потери производительности, так как там использованы такие возможности микропроцессора как флаг PE; кроме того, код хорошо оптимизирован с использованием таких команд как LoopNE, LodSB и т.д.

Одно скажу по этому поводу точно: без эмуляции на других процессорах это невозможно завести.

Quasar ★★★★★
()
Ответ на: комментарий от tailgunner

>>Так а в чем проблема? На Linux нет ассемблера, понимающего нужный синтаксис, или что?

у него есть бинарный модуль собранный под MSDOS/WACOM и его надо линковать под все остальное.

exception13 ★★★★★
()
Ответ на: комментарий от exception13

> у него есть бинарный модуль собранный под MSDOS/WACOM

Из каких именно слов топикстартера следует отсуствие исходного кода?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Код 16-разрядный. А вообще-то, действительно надо будет попробовать собрать его прям как есть. Вроде как он должен заработать в 32-разрядном режиме. Я просто думал, что может быть можно именно 16-разрядный модуль как-то линковать с 32-разрядными? Хотя нет, кое-что там есть специфическое: меняется содержимое регистров DS и ES, чтобы работать с такими командами как lodsb. Вот здесь что делать - просто закомментировать строки и считать, что все DS, ES, CS указывают на один и тот же сегмент?

Starduster
() автор топика
Ответ на: комментарий от Starduster

> А вообще-то, действительно надо будет попробовать собрать его прям как есть.

Вообще-то это твой единственный шанс.

tailgunner ★★★★★
()
Ответ на: комментарий от Artificial_Thought

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

Starduster
() автор топика
Ответ на: комментарий от Starduster

> Нет, на сях не годится.

Нельзя, чтобы код стал быстрее?

tailgunner ★★★★★
()

Код предназначен для исполнения на процессорах Intel в реальном режиме.

на дворе 2011й год, а вы всэ в 16 битах плаваете

ckotinko ☆☆☆
()
Ответ на: комментарий от Starduster

Нет, на сях не годится.

Может стоит перестать считать современные компиляторы такими же тупыми, как и 20 лет назад? Перепиши на С и оцени производительность.

Pavval ★★★★★
()

перепиши на 64-битном ассемблере :) под amd64

Harald ★★★★★
()
Ответ на: комментарий от Starduster

Похоже, что работает как есть. Всем спасибо.

Starduster
() автор топика

> Можно ли написать на асме кроссплатформенный код?

С.В.Зубков. Ассемблер для DOS, Windows и UNIX.

pacify ★★★★★
()

> Вряд ли его можно переписать на C без потери производительности

> код хорошо оптимизирован с использованием таких команд как LoopNE, LodSB и т.д.

у меня для тебя очень, очень плохие новости ;)

arsi ★★★★★
()

Готов поставить 100 рублей на то, что правильно переписанный на Си и скомпилированный с оптимизацией код будет не медленнее исходного, и ещё 50 на то, что быстрее.

Yareg ★★★
()

Не особо в тему, но не могу не процитировать кусочек из Fighting the lemmings:

Example from a famous IOCCC (International Obfuscated C Code Contest) entry - this code is portable between a VAX and a PDP-11:

short main[] = {
277, 04735, -4129, 25, 0, 477, 1019, 0xbef, 0, 12800,
-113, 21119, 0x52d7, -1006, -7151, 0, 0x4bc, 020004,
14880, 10541, 2056, 04010, 4548, 3044, -6716, 0x9,
4407, 6, 5568, 1, -30460, 0, 0x9, 5570, 512, -30419,
0x7e82, 0760, 6, 0, 4, 02400, 15, 0, 4, 1280, 4, 0,
4, 0, 0, 0, 0x8, 0, 4, 0, ',', 0, 12, 0, 4, 0, '#',
0, 020, 0, 4, 0, 30, 0, 026, 0, 0x6176, 120, 25712,
'p', 072163, 'r', 29303, 29801, 'e'
};

ratatosk
()
Ответ на: комментарий от arsi

>> код хорошо оптимизирован с использованием таких команд как LoopNE, LodSB и т.д.

у меня для тебя очень, очень плохие новости ;)

Думаю, он просто не поверит.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Думаю, он просто не поверит.

да я тоже не верил, пока не проверил :) даже код остался, где гцц, используя внутри цикла шесть «совершенно неоптимальных» инструкций (типа movzx + add eax,1 + sub edx,1 + cmp + mov + jne), обогнал мой «хорошо оптимизированный» вариант с тремя инструкциями (lodsb + mov + loop) почти ровно в два раза… слишком много всего изменилось за последние 5 лет…

arsi ★★★★★
()

переписать на Си и сравнить, потом оптимизировать сишный код

Vernat ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.