Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2013, 22:08   #1
alexey_kip
Форумчанин
 
Регистрация: 19.11.2011
Сообщений: 198
Радость 32 бит в 16

Программирую на ТР7 с ассемблерными вставками.
Т.к. там команды только 16-битные, то я не могу использовать регистры EDX,ECX, а необходимая информация возвращается именно в них
Цитата:
в EDX — сигнатура «PCI» («Р» — в DL, «С» — в DH и т. д., в старшем байте — пробел);
Как эту информацию можно оттуда выудить?
alexey_kip вне форума Ответить с цитированием
Старый 28.10.2013, 22:39   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Никак. Возьми паскаль поновее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.10.2013, 00:32   #3
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

На самом деле способ есть, но он не для слабых духом
В древних версиях паскаля можно было вставлять машинные коды напрямую с помощью директивы inline. Потому, например, получить доступ к старшему слову edx можно, используя коды инструкций
Код:
mov eax, edx
ror eax, 16
После этого младшее слово можно будет забирать из dx, а старшее - из eax, и спокойно работать с ними в 16-битном коде.
Ну а быстро узнать опкоды можно тут, например - https://defuse.ca/online-x86-assembler.htm
В итоге получаем
Код:
inline($66/$89/$D0/$66/$C1/$C8/$10)
P.S. Хотя, безусловно, куда проще и эффективнее будет обновить компилятор.
Son Of Pain вне форума Ответить с цитированием
Старый 29.10.2013, 00:45   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Son Of Pain
По-моему там была одна маленькая сложность - загрузчик программы (или ядро винды) ведь распознает битность, и для 16, 32 и 64 битных программ загружает по разному. В результате даже если использовать такой способ программа скорее всего падет смертью храбрых на исполнении этих инструкций. Не помню у кого я читал про такие выкрутасы, кажется на хакере статья была.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.10.2013, 08:30   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
На самом деле способ есть, но он не для слабых духом
проверил....

сильно удивлён.
похоже, что действительно, внутри 16-битной программы можно работать с 32-х битными регистрами!
Изображения
Тип файла: jpg td.jpg (39.7 Кб, 99 просмотров)

Последний раз редактировалось Serge_Bliznykov; 29.10.2013 в 08:39.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.10.2013, 09:18   #6
alexey_kip
Форумчанин
 
Регистрация: 19.11.2011
Сообщений: 198
По умолчанию

Ок, спасибо большое)
alexey_kip вне форума Ответить с цитированием
Старый 29.10.2013, 09:20   #7
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
В древних версиях паскаля можно было вставлять машинные коды напрямую с помощью директивы inline.
Мне кажется, что этот способ был выпилен из компилятора одновременно с появлением встроенного ассемблера, то есть в TP 6.0. Могу ошибаться. Ой, невнимательно на скриншот посмотрел. Ошибся.

Способ по-любому есть -- это разработка на ассемблере и компиляция в OMF (obj-файлы) внешним ассемблером, а потом компоновка Паскалем директивой external. Но с удобством встроенного ассемблера не сравнить, согласен.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
сильно удивлён.
похоже, что действительно, внутри 16-битной программы можно работать с 32-х битными регистрами!
Я читал об этом, но на практике не пользовал, поэтому решил не флудить почем зря.
Vapaamies вне форума Ответить с цитированием
Старый 29.10.2013, 10:59   #8
alexey_kip
Форумчанин
 
Регистрация: 19.11.2011
Сообщений: 198
По умолчанию

Ошибка синтаксиса((
Код:
inline($66/$89/$D0/$66/$C1/$C8/$10)
Попробовал заюзать код из хэлпа для инлайн - такая же ошибка(
Подкажите, плз, где можно скачать паскать чтобы с 32 битами работать было можно?
Скачивал TP7.1 тоже не хочет работать(
alexey_kip вне форума Ответить с цитированием
Старый 29.10.2013, 11:14   #9
alexey_kip
Форумчанин
 
Регистрация: 19.11.2011
Сообщений: 198
По умолчанию

Скачал BC 3.1
Пишу
Код:
void main()
{
 _asm
 {
   mov ax,bx;
 }
}
Не найден mov

Код:
void main()
{
 _asm
 {
   movl ax,bx;
 }
}
Не нейден movl

Код:
void main()
{
 _asm
   ("movl %ax,%bx;");
}
Опять...

Как правильно-то?
alexey_kip вне форума Ответить с цитированием
Старый 29.10.2013, 11:53   #10
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от alexey_kip Посмотреть сообщение
Подкажите, плз, где можно скачать паскать чтобы с 32 битами работать было можно?
Есть Free Pascal (FPC), были также Virtual Pascal и TMT Pascal. Попробуй также обычный TP в связке с TASM, как уже говорил. При большом желании можно и самостоятельно кодогенератор TP 6.0 доработать, благо исходники давно открыты.
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ОС: 32 vs 64 бит Буратино Операционные системы общие вопросы 29 18.01.2011 11:10
C++ перевод 8 бит в 7 0479 Помощь студентам 1 25.09.2010 12:25
Ковертирование из png 24 бит в png 8 бит isat Общие вопросы .NET 0 22.03.2010 13:38
Бит чётности fogmistery Общие вопросы C/C++ 1 02.01.2010 22:58
1 байт 9 бит ?! Иллидан Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 13.04.2008 12:47