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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2012, 12:05   #1
vasiliy_09_05
Пользователь
 
Регистрация: 19.02.2011
Сообщений: 18
По умолчанию Связка TP и Asm

Доброго времени суток всем
Попросили сделать исполняемый файл в Turbo Pascal'е, добавив процедуры на ассемблере, но так как я не создавал программы в связке с ассемблером, то возникли ряд вопросов.
Листинги процедур на асме:
http://radiofuck.zakadum.ru/3%EA%F3%...E/LIST6_07.INC

Почитав статьи по TP и Asm я понял что ассемблерные вставки в код можно выполнять как процедуры/функции, но как использовать входные/выходные данные не понял
Кому не сложно, могли бы мне подсказать по технологии связки TP и Asm, в частности как реализовать DATASEG и CODESEG в TP.
Или подсказать ссылочку, где это описано. С удовольствием бы поковырялся сам, но время поджимает
Заранее огромное спасибо
vasiliy_09_05 вне форума Ответить с цитированием
Старый 05.12.2012, 14:55   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Не нужно их реализовывать.
Если интересуют сегментные регистры, то они ds для глобальных переменных и bp - для локальных. Но обычно и этого не нужно - достаточно просто писать в ассемблерном коде имена переменных. Только следует помнить, что ассемблер не производит контроль типов, поэтому об этом необходимо помнить самому. В частности учитывать различие передачи параметров по ссылке и по значению.
s-andriano вне форума Ответить с цитированием
Старый 10.12.2012, 07:10   #3
vasiliy_09_05
Пользователь
 
Регистрация: 19.02.2011
Сообщений: 18
По умолчанию

Благодарю за ответ К сожалению руки на выходных не доходили попробовать, сегодня попробую
vasiliy_09_05 вне форума Ответить с цитированием
Старый 12.12.2012, 11:39   #4
vasiliy_09_05
Пользователь
 
Регистрация: 19.02.2011
Сообщений: 18
По умолчанию

Блин, на самом простом застрял Соответствие типов данных между паскалем и ассемблером. Подскажите плиз неучу
DW - Word, DB - Byte, DD- Double, MaxHDDWaitTime equ 10 - скорее всего const MaxHDDWaitTime:Integer;
А вот как сделать: StandardHDDBases DW 1F0h, 170h, 1E8h, 168h - нужно создать свой тип с перечислением? И SectorDataBuffer DB 512 DUP (?) - в паскале SectorDataBuffer: array [0..511] of byte.
Прошу поправить меня если где то неверно определил переменные. А то пока, в первую очередь, не определюсь с перечислением дальше написать не могу
Заранее благодарю за помощь
vasiliy_09_05 вне форума Ответить с цитированием
Старый 12.12.2012, 13:34   #5
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

dd это longint, а не double.
А остальное - просто массивы. Один константный, второй нет.
Son Of Pain вне форума Ответить с цитированием
Старый 12.12.2012, 14:12   #6
vasiliy_09_05
Пользователь
 
Регистрация: 19.02.2011
Сообщений: 18
По умолчанию

Благодарю
vasiliy_09_05 вне форума Ответить с цитированием
Старый 12.12.2012, 19:08   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
dd это longint, а не double.
А остальное - просто массивы. Один константный, второй нет.
Вообще-то dword. Только он не поддерживается диалектом Turbo Pascal.
Но самый близкий - да - longint.
Следует только помнить, что dword - беззнаковая величина (диапазон от 0 до 2^32-1), а longint - величина со знаком (диапазон от -2^31 до 2^31-1).
s-andriano вне форума Ответить с цитированием
Старый 14.12.2012, 16:45   #8
vasiliy_09_05
Пользователь
 
Регистрация: 19.02.2011
Сообщений: 18
По умолчанию

Благодарю еще раз за ответы.
Начал делать программу, но теперь возникли ошибки:
1) Pushad/popad (Error 5: Syntax error) - Я как понимаю TP не меняет размещение стеков? ТО есть данные команды в TP неприемлемы?
2) строка
Код:
mov     EAX,[SectorAddress]
и все подобные строки с регистром EAX (Error 3:Unknown identifier) - Если честно, вот это совсем не понял, почему TP ругается на регистр?
3) call SendCommandToHDD (Error 3:Unknown identifier) - здесь вызов процедуры, сегодня буду читать как из под asm вызывать процедуры ;
4) mov AX,[CS:MainDataSeg] (Error 3:Unknown identifier)- Как я понимаю идет обращение к разделу DATASEG, но у меня его нет, так как я его заменил паскалевскими переменными, какую именно переменную ему нужно я не пойму ;
5) mov AX,[BX+StandardHDDBases] (Error 155: Invalid combination of opcode and operands) - Видимо несоответствие переменных. Как я понимаю значение переменной берется в прямоугольные скобки, видимо StandardHDDBases - это ссылка а не значение;
Я понимаю что все мои ошибки на уровне начинающего, скорее всего, но я со связкой TP+asm первый раз столкнулся, да если честно и на TP уже сто лет не работал.
Буду очень благодарен за наводки в решении
Вложения
Тип файла: rar HDD1.rar (1.0 Кб, 11 просмотров)
vasiliy_09_05 вне форума Ответить с цитированием
Старый 14.12.2012, 17:30   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Турбо Паскаль - 16-разрядный компилятор.
И Ассемблер в нем тоже 16-разрчядный.
Со всеми вытекающими.

У меня впечатление, что Вам нужно переделать исходник на Ассемблере, который Вы не понимаете.
В 4) Вы пытаетесь что-то загрузить из сегмента кода. Вероятнее всего, это особенность исходной программы, в которой какие-то данные хранятся в сегменте кода. Скорее всего, в Турбо Паскале их нужно перенести в сегмент данных.

Разберитесь, как работает исходник, и для чего нужны используемые в нем данные. А потом уже пишите все это на Паскале либо встроенном в него Ассемблере. Ассемблер допускает очень широкий спектр способов организации памяти, в Паскале - практически один-единственный. Соответственно, организацию памяти, вероятнее всего, нужно будет изменить. А для этого - разобраться, как она работает.
s-andriano вне форума Ответить с цитированием
Старый 15.12.2012, 08:35   #10
vasiliy_09_05
Пользователь
 
Регистрация: 19.02.2011
Сообщений: 18
По умолчанию

Согласен, не понимаю Задание в следующем - есть исходный код на асме, необходимо, используя 3 процедуры, написанные на асме (чтение с диска, запись на диск, получение идентификатора диска - использование первой процедуры, чтобы считать данные, находящиеся по базовым адресам диска) написать программу на TP. Так как начал заниматься программированием уже в те годы, когда на асме уже не писали (да и если чесно и процедурно -ориентированные языки активно вытеснялись объектно-ориентированными), то и не работал со связками TP и asm
У меня такой вопрос возник - а не проще ли сделать obj файл с процедурами, сегментом данных и сегментом кода, и вызывать процедуры из программы? Тогда проблемы со структурой хранения и исполнения процедур пропадут? Или TP без разницы, брать ли данные из внутреннего листинга или из внешнего файла?
vasiliy_09_05 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связка функций alexsampler Microsoft Office Excel 2 27.01.2012 12:26
связка с пхп маГГ85 JavaScript, Ajax 2 25.12.2011 02:18
Передача параметров asm-asm Maksimall89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 22.12.2011 11:54
Связка С# и MySQL dampirik SQL, базы данных 3 09.01.2010 20:41
Связка с ассемблером Horknee Паскаль, Turbo Pascal, PascalABC.NET 6 07.05.2009 23:46