![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 19.02.2011
Сообщений: 18
|
![]()
Доброго времени суток всем
![]() Попросили сделать исполняемый файл в Turbo Pascal'е, добавив процедуры на ассемблере, но так как я не создавал программы в связке с ассемблером, то возникли ряд вопросов. Листинги процедур на асме: http://radiofuck.zakadum.ru/3%EA%F3%...E/LIST6_07.INC Почитав статьи по TP и Asm я понял что ассемблерные вставки в код можно выполнять как процедуры/функции, но как использовать входные/выходные данные не понял ![]() Кому не сложно, могли бы мне подсказать по технологии связки TP и Asm, в частности как реализовать DATASEG и CODESEG в TP. Или подсказать ссылочку, где это описано. С удовольствием бы поковырялся сам, но время поджимает ![]() Заранее огромное спасибо ![]() |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Не нужно их реализовывать.
Если интересуют сегментные регистры, то они ds для глобальных переменных и bp - для локальных. Но обычно и этого не нужно - достаточно просто писать в ассемблерном коде имена переменных. Только следует помнить, что ассемблер не производит контроль типов, поэтому об этом необходимо помнить самому. В частности учитывать различие передачи параметров по ссылке и по значению. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 19.02.2011
Сообщений: 18
|
![]()
Благодарю за ответ
![]() ![]() |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 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. Прошу поправить меня если где то неверно определил переменные. А то пока, в первую очередь, не определюсь с перечислением дальше написать не могу ![]() Заранее благодарю за помощь ![]() |
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
![]()
dd это longint, а не double.
А остальное - просто массивы. Один константный, второй нет. |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 19.02.2011
Сообщений: 18
|
![]()
Благодарю
![]() |
![]() |
![]() |
![]() |
#7 | |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]() Цитата:
Но самый близкий - да - longint. Следует только помнить, что dword - беззнаковая величина (диапазон от 0 до 2^32-1), а longint - величина со знаком (диапазон от -2^31 до 2^31-1). |
|
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 19.02.2011
Сообщений: 18
|
![]()
Благодарю еще раз за ответы.
Начал делать программу, но теперь возникли ошибки: 1) Pushad/popad (Error 5: Syntax error) - Я как понимаю TP не меняет размещение стеков? ТО есть данные команды в TP неприемлемы? 2) строка Код:
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 уже сто лет не работал. Буду очень благодарен за наводки в решении ![]() |
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Турбо Паскаль - 16-разрядный компилятор.
И Ассемблер в нем тоже 16-разрчядный. Со всеми вытекающими. У меня впечатление, что Вам нужно переделать исходник на Ассемблере, который Вы не понимаете. В 4) Вы пытаетесь что-то загрузить из сегмента кода. Вероятнее всего, это особенность исходной программы, в которой какие-то данные хранятся в сегменте кода. Скорее всего, в Турбо Паскале их нужно перенести в сегмент данных. Разберитесь, как работает исходник, и для чего нужны используемые в нем данные. А потом уже пишите все это на Паскале либо встроенном в него Ассемблере. Ассемблер допускает очень широкий спектр способов организации памяти, в Паскале - практически один-единственный. Соответственно, организацию памяти, вероятнее всего, нужно будет изменить. А для этого - разобраться, как она работает. |
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 19.02.2011
Сообщений: 18
|
![]()
Согласен, не понимаю
![]() ![]() У меня такой вопрос возник - а не проще ли сделать obj файл с процедурами, сегментом данных и сегментом кода, и вызывать процедуры из программы? Тогда проблемы со структурой хранения и исполнения процедур пропадут? Или TP без разницы, брать ли данные из внутреннего листинга или из внешнего файла? |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Связка функций | 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 |