Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 03.08.2014
Сообщений: 21
1

Не работает ассемблер в Free Pascal

09.08.2015, 12:00. Показов 1314. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Free Pascal при компиляции кода, содержащего вставки на ассемблере, выдает ошибки Uncnown Identifier "AX","CX","DX". Если добавить {$ASMMODE INTEL}, то компилируется без ошибок, но при запуске вылетает с exitcode=216. В Turbo Pascal все работает без проблем. В чем проблема? Вот код, в котором возникают ошибки, он выводит координаты мыши и состояние кнопок:
Код

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
uses dos,crt;
var
a:integer;
{$ASMMODE INTEL}
{=======================================================}
function MX:integer;
var resX:integer;
begin
     ASM
     mov ax,$03;
     int $33;
     mov resX,CX;
     end;
     MX:=resX;
end;
{=======================================================}
function MY:integer;
var resY:integer;
begin
     ASM
     mov ax,$03;
     int $33;
     mov resY,DX;
     end;
     MY:=resY;
end;
{=======================================================}
function MB:byte;
var b:byte;
begin
     ASM
     mov ax,$3;
     int $33;
     mov b,bl;
     end;
     MB:=b;
end;
{=======================================================}
 
begin
clrscr;
repeat
gotoxy(1,1);
write(MX,' ',MY,' ',MB,'    ');
until keypressed;
END.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2015, 12:00
Ответы с готовыми решениями:

Free Pascal работает некорректно
Что за чертовщина? Free Pascal отказывается читать мои команды и творит неведомую хрень. Вот 2...

Программа не работает на Free Pascal
Программа на Free Pascal сразу закрывается, хотя на ABC все нормально работает. Помогите...

Как работает Free Pascal в Windows 7
у меня стоит vista ,хочу поставить window 7 как в window 7 будет работать free pascal может...

Free Pascal плохо работает в Windows 7
Здравствуйте! У меня стойт windows 7. Я установил Free Pascal, но он плохо на ней работает?...

6
Модератор
Эксперт по электронике
8522 / 4376 / 1648
Регистрация: 01.02.2015
Сообщений: 13,600
Записей в блоге: 9
09.08.2015, 20:05 2
А для какой ОС предназначена эта программа?

Я вижу, что для DOS, но в какой запускаешь ты?

Кроме того, если работаешь под DOS, придётся забыть об ассемблерных обёртках, т.к. программа работает в защищённом режиме и с прерываниями общается через API DPMI. Другими словами используй Intr из DOS.

Ещё FPC привлекателен тем, что штатно с ним идёт много модулей. Для мыши, возможно, подойдёт mouse.

В общем, читай rtl.pdf или на сайте. На сайте даже лучше - т.к. pdf по сравнению с ним имеет пропуски.
1
0 / 0 / 0
Регистрация: 03.08.2014
Сообщений: 21
09.08.2015, 21:45  [ТС] 3
Спасибо, буду разбираться с Mouse.
Запускаю в Windows. До этого работал в Turbo Pascal в SchoolPak, там подобное работало нормально, но программы запускались только в DosBox; при обычном запуске жаловалось на несовместимость с версией Windows(стоит 64 разрядная).
0
449 / 415 / 124
Регистрация: 03.02.2013
Сообщений: 1,295
15.08.2015, 00:04 4
ФедосеевПавел
не понял каким образом сюда относится DPMI, если человек работает из DOS - ему вообще не нужен переход в защищённый режим, в его программе int 33 этого не требует, если под win/lin - то там как бы есть защищённый режим, но он хватает от туда только адресацию памяти, с точки зрения задач - он нефига не аппаратный, т.е. например мультизадачность эмулируется программно специальным мендежером, а не на уровне процессора, как это делается в микроядерных ОС типа Hurd/QNX, вопрос исключительно в том, что драйвер мыши не перекрывает вектор прерываний по тем или иным причинам, DPMI вообще не причём

Кроме того, если работаешь под DOS, придётся забыть об ассемблерных обёртках
а вот не советую) там как раз это было очень популярно ))) в защищённом режиме просто перегружались вектора прерываний, они создавались под каждый дискриптор-шлюз, кароче даже в защищённом режим асм был нужен
0
Модератор
Эксперт по электронике
8522 / 4376 / 1648
Регистрация: 01.02.2015
Сообщений: 13,600
Записей в блоге: 9
15.08.2015, 01:23 5
Free Pascal for DOS безальтернативно предлагает работу с DPMI (экстендером Go32v2) - подтверждение. Не буду обманывать, мне почему-то казалось, что как-то задействован cwsdpmi.

Отсюда и моё предложение отказаться от asm обёрток API Mouse, API DOS, API BIOS в пользу конструкций Intr и MSDos. Т.к. при работе под экстендером для некоторых из них требуется вызов через API DPMI, а в некоторых случаях и выделение памяти в 1-м мегабайте. И чтобы не перечислять неопытному ТС, что можно, а что нельзя - всё под одну гребёнку.

Но мои советы не очень нужны ТС. Основная причина - он правомерно хочет начать работу в более современной ОС. О чем он и поведал. А раз так, то есть готовые библиотеки в составе FPC - Mouse и WinMouse. Могу только пожелать ему успехов и терпения (лично я с 3 или 4 попытки заставил себя перейти на FPC - моя старость, его сложность при общении с COM-портом, обилие несовместимых asm-вставок и трюков в поддерживаемом мною коде).
Кликните здесь для просмотра всего текста

Пример различия TP от FPC for DOS с одного из форумов
При написании некоей консоли я столкнулся с тем что при обращении к прерыванию BIOS $10 для произведения загрузки пользовательского шрифта шрифт без ошибок загружался в память и стал использоваться для экранного отображения текста в текущем текстовом режиме экрана монитора, но это в 16-битном Паскале, то есть в Турбо Паскале 7.0, а компиляция консоли в FreePASCAL 2.2.2 для DOS хотя и осуществляется успешно, при обращении к BIOS вместо загруженного шрифта весь экран покрывается кашей из снегообразного бякового белого тумана вместо различимых символов. Почему так происходит? Прошу разъяснить мне это. Пример приведён во вложенном к этому постингу вложении. В Турбо Паскале он работает на отлично. Во всех версиях FPC с любыми видоизменениями настроек компиляции выдаёт кашу.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Uses DOS;
Var
  Font         : Array[1..4096] Of Byte;
  FontFile     : File;
  CPURegisters : Registers;
Begin
 Assign(FontFile,'FONT.FNT');
 ReSet(FontFile,1);
 BlockRead(FontFile,Font,4096);
 Close(FontFile);
 CPURegisters.AX:=$0003;
 Intr($10,CPURegisters);
 CPURegisters.AX:=$1110;
 CPURegisters.BH:=$10;
 CPURegisters.BL:=$0;
 CPURegisters.CX:=$100;
 CPURegisters.DX:=$0;
 CPURegisters.ES:=Seg(Font);
 CPURegisters.BP:=Ofs(Font);
 Intr($10,CPURegisters);
 CPURegisters.AH:=$1;
 CPURegisters.CX:=$0E0F;
 Intr($10,CPURegisters);
end.
Мой вариант решения с использованием rtl.pdf
Думаю, что курить мануалы нужно в следующем направлении:
1. Прерывание 10h из реального режима и работает с адресами из 1-го мегабайта.
2. Твоя программа работает в защищённом режиме с линейной адресацией, поэтому Seg(любая переменная)=0.
3. Чтобы отработало это прерывание нужно выделить память в 1-м мегабайте, получить её сегмент реального режима и смещение реального режима, и именно эти сегмент и смещение передавать в прерывание (конечно, предварительно скопировав туда содержимое переменной Font).
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Uses
  DOS, Go32;
Var
  Font         : Array[1..4096] Of Byte;
  FontFile     : File;
  CPURegisters : Registers;
  SegSel       : LongInt;
Begin
 Assign(FontFile,'FONT.FNT');
 ReSet(FontFile,1);
 BlockRead(FontFile,Font,4096);
 Close(FontFile);
 
 {выделяем память в первом мегабайте}
 SegSel:=Global_DOS_Alloc(SizeOf(Font));
 if int31error<>0
 then begin
   WriteLn('Error while allocation real mode memory, halting...');
   Halt(1);
 end;
 {копируем в неё содержимео переменной Font}
 DosMemPut(Word(SegSel shr 16), 0, Font, SizeOf(Font));
 
 {вызываем прерывания}
 CPURegisters.AX:=$0003;
 Intr($10,CPURegisters);
 CPURegisters.AX:=$1110;
 CPURegisters.BH:=$10;
 CPURegisters.BL:=$0;
 CPURegisters.CX:=$100;
 CPURegisters.DX:=$0;
 CPURegisters.ES:=Word(SegSel shr 16);    //Seg(Font);
 CPURegisters.BP:=0;                      //Ofs(Font);
 Intr($10,CPURegisters);
 CPURegisters.AH:=$1;
 CPURegisters.CX:=$0E0F;
 Intr($10,CPURegisters);
 
 {освобождаем память из первого мегабайта}
 Global_DOS_Free(Word(SegSel));
end.
0
449 / 415 / 124
Регистрация: 03.02.2013
Сообщений: 1,295
15.08.2015, 06:43 6
ФедосеевПавел
о, нет, не безальтернативно, есть варианты)))
0
Модератор
Эксперт по электронике
8522 / 4376 / 1648
Регистрация: 01.02.2015
Сообщений: 13,600
Записей в блоге: 9
15.08.2015, 13:27 7
Да, я слукавил Но самую малость.
0
15.08.2015, 13:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2015, 13:27
Помогаю со студенческими работами здесь

Почему не работает модуль graph в Free Pascal
во FreePascal'е не знаю почему не работает этот модуль, в папке units есть graph, у друга работает...

Почему не работает код в Free Pascal методом пузырька?
USES windows; CONST Size=32000; TYPE TArray=array of integer; VAR

Turbo Pascal, Pascal ABC, Free Pascal, PascalABC.NET - в чем разница?
Всем привет, решил изучать Паскаль, но на форуме увидел 4 его версии - Turbo Pascal, Pascal ABC,...

Как во free pascal узнать, в какой ос работает программа: Win 7 или Win xp?
Так же хотелось бы узнать имя пользователя, запустившего программу.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru