Проблемы. Ассемблер.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Проблемы. Ассемблер.

Сообщение SamS0m » 22.11.2007 02:41:25

Мне в программе нужно убрать курсор. Во всех других компиляторах следующий код работает, а вот FPC нет :(

Код: Выделить всё
procedure HideCursor1;
begin
asm
    mov ah,1
    mov ch,$20
    int $10
end;
end;
procedure ShowCursor1;
begin
asm
    mov ah,1
    mov ch,5
    mov cl,7
    int $10
end;
end;
SamS0m
незнакомец
 
Сообщения: 1
Зарегистрирован: 22.11.2007 02:17:42

Сообщение Рождённый_в_СССР » 22.11.2007 03:59:02

1) попробуй убрать курсор на другую видеостраницу или за пределы видимого экрана функцией перемещения курсора
mov ah,2
mov bh,номер страницы
mov dx,положение курсора на странице (строка:столбец)
int 10h

в частности везде рекомендуют Y сделать 25 (если 80x25 конечно), чтобы спрятать курсор

другой вопрос если тебе при этом надо печатать символы, то это сложнее... можно перекидывать их от туда сюда в памяти (я так делал - за одно проверял что цифры вводят а не буквы) или все таки поиграться с размером:

2) если говорить о данной функции биоса (изменение размера) - то это как бы не везде работает (зависит от видеоконтроллера и DOS-расширителя)
у меня например пашет (FPC 2.0.4), специально проверил...
не знаю даже... попробуй cx,2020h вместо ch,20h вписать...
но это всё как бы не стандартизированно, потому что в стандарте вроде четко написанно, что там не может быть больше чем 00011111b=1fh...
Аватара пользователя
Рождённый_в_СССР
новенький
 
Сообщения: 65
Зарегистрирован: 08.08.2007 01:03:26
Откуда: Саратов

Сообщение bw » 22.11.2007 07:57:09

SamS0m, программа точно для DOS собирается? Или для win/nix? Директиву {$asmmode intel} указал?
Что значет не работает, можно поподробнее? Не компилирется, не запускается, запускается но выдает ошибки или просто ничего не делает?

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Сообщение Vadim » 22.11.2007 10:09:49

Дорогие товарищи борцы!
Если нужно просто выключить\включить курсор, ассемблер беспокоить не надо. Для этого в модуле CRT есть отличнейшая функция CursorOff или CursorOn. Только она в никсах не работает.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение shade » 22.11.2007 12:47:30

SamS0m писал(а):Во всех других компиляторах следующий код работает, а вот FPC нет

FPC под DOS не компилирует :roll:
Так что юзайте CRT

Vadim писал(а):Только она в никсах не работает.

В багтрекер - авось заработает :?
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Vadim » 22.11.2007 13:34:01

shade
Не прокатит. Это даже в документации записано. Просто у никсов система управления дисплеем совершенно другая.
Наверное никто еще не брался за написание этой процедуры для никсов. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение nochnick » 29.11.2007 00:03:46

Подскажите пожалуйста в чем ошибка.
Нужно чтобы из программы на freepascale вызывалась процедура (с параметрами), написанныя на ассемблере, и хранящаяся в другом файле.
Ниже привожу код, в котором из файла f1.pp вызывается процедура f1, описанная в файле f.asm, которая должна выводить на экран символ 'a'. ( в качестве ассемблера мне можно испоьзовать nasm или fasm)

файл f1.pp
Код: Выделить всё
Program f1111;
{$F+}
procedure f1;cdecl;external;
{$L f.o}
begin
f1;
end.

файл f.asm
Код: Выделить всё
        segment CODE 

        global _f1         
_f1:
        push ax
        push dx

        mov ah,02h
        mov dl,'a'
        int 21h

        pop dx
        pop ax

        retf

эти файлы я компилирую так:
Код: Выделить всё
nasm -f coff f.asm
ppc386 f1.pp

(nasm version 0.98, fpc 2.2.0 )
после компиляции получается exe, но при запуске выдает следующее:
Runtime error 216 at $00400005
$00400005
$405F7B00

Подскажите пожалуйста в чем ошибка, и вообще правильно ли я все сделал?
nochnick
незнакомец
 
Сообщения: 3
Зарегистрирован: 24.11.2007 15:50:47

Сообщение halyavin » 29.11.2007 12:38:53

Функция должна быть скомпилирована в 32-битном режиме ассемблера (вроде [BITS 32] в nasm, use32 в fasm). Процедура должна заканчиваться retn, а не retf. И проверьте, что вы компилируете под DOS (aka GO32_v2), а не под что-либо еще (в таком случае 21 прерыванием пользоваться нельзя).
halyavin
новенький
 
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение nochnick » 29.11.2007 22:15:20

Исправил код, упростил ассемблерную процедуру
f.asm
Код: Выделить всё
     
   segment CODE 
        BITS 32
        global _f1         
_f1:
        retn

f1.pp:
Код: Выделить всё
Program f1111;
procedure f1;cdecl;external;
{$L f.o}
begin
f1;
end.

компилирую:
Код: Выделить всё
nasm -f coff f.asm
ppc386 -Tgo32v2 f1.pp

но теперь выдает следующее:
D:\FPC\bin\i386-win32>nasm -f coff f.asm

D:\FPC\bin\I386-W~1>ppc386 -Tgo32v2 f1.pp
Free Pascal Compiler version 2.2.0 [2007/09/09] for i386
Copyright (c) 1993-2007 by Florian Klaempfl
Target OS: GO32 V2 DOS extender
Compiling f1.pp
PPU Loading System.ppu
PPU is compiled for an other target
PPU Loading System.ppu
PPU is compiled for an other target
PPU Loading System.ppu
PPU is compiled for an other target
f1.pp(2,1) Fatal: Can't find unit System used by f1111
Fatal: Compilation aborted
как я понял нужно еще и модуль system.ppu перекомпилировать под Дос, но как я не знаю.
nochnick
незнакомец
 
Сообщения: 3
Зарегистрирован: 24.11.2007 15:50:47

Сообщение halyavin » 30.11.2007 12:04:42

d:\fpc\bin\i386-win32
а нужно - go32v2. Где найти версию компилятора с поддержкой go32v2 - не знаю.
halyavin
новенький
 
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение Sergei I. Gorelkin » 30.11.2007 12:42:43

Не путай человека. Если на -Tgo32v2 не ругается, значит поддержка кросс-компиляции есть.

А чтобы собрать нужный юнит system, нужно в папке с исходниками rtl запустить make OS_TARGET=go32v2 и потом make install OS_TARGET=go32v2.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение nochnick » 11.12.2007 00:18:53

c make OS_TARGET=go32v2 не получилось(нет исходников модулей),
но нашел fpc для go32 v2 v1.0.8 (compiler version 2.0.4)
скомпилировал:
Код: Выделить всё
nasm -f coff f.asm
ppc386 -Tgo32v2 f1.pp

но получил следующее:

Runtime error 216 at $000A03E6
$000A03E6
$00002068

Скорее всего компилировать придется под Win32 (там где надо эту лабу сдавать стоит fpc под Win32).
Пробовал так :
Код: Выделить всё
nasm -fwin32 f.asm
ppc386 -TWin32 f1.pp

Но получил всё тоже сообщение об ошибке.
В документации нашел пример использования ассемблерной процедуры(с числами Фибаначи), там используется ассемблер as.
Но и этот пример не компилируется...
Что же делать? Неужели никто не использовал ассемблерные процедуры в программах на паскле под win32?
nochnick
незнакомец
 
Сообщения: 3
Зарегистрирован: 24.11.2007 15:50:47

Сообщение halyavin » 11.12.2007 14:24:03

Вот пример связки fasm+fpc рассчитанный на win32 (хотя может и в go32v2 заработать): http://shade.msu.ru/~msu-se/asmtest.zip
Компиляция:
Код: Выделить всё
fasm asm.asm
fpc test.pp

Ассемблерные функции реализуют функцию увеличения на единицу. Напоминаю, что в win32 приложениях не работают прерывания DOS и BIOS.
halyavin
новенький
 
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru