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

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

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

Ответить
SamS0m
незнакомец
Сообщения: 1
Зарегистрирован: 22.11.2007 01:17:42

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

Сообщение SamS0m »

Мне в программе нужно убрать курсор. Во всех других компиляторах следующий код работает, а вот 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;
Аватара пользователя
Рождённый_в_СССР
новенький
Сообщения: 65
Зарегистрирован: 08.08.2007 01:03:26
Откуда: Саратов

Сообщение Рождённый_в_СССР »

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...
Аватара пользователя
bw
постоялец
Сообщения: 359
Зарегистрирован: 01.12.2005 10:36:23
Откуда: Усть-Илимск
Контактная информация:

Сообщение bw »

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

..bw
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Дорогие товарищи борцы!
Если нужно просто выключить\включить курсор, ассемблер беспокоить не надо. Для этого в модуле CRT есть отличнейшая функция CursorOff или CursorOn. Только она в никсах не работает.
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

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

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

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

В багтрекер - авось заработает :?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

shade
Не прокатит. Это даже в документации записано. Просто у никсов система управления дисплеем совершенно другая.
Наверное никто еще не брался за написание этой процедуры для никсов. :)
nochnick
незнакомец
Сообщения: 3
Зарегистрирован: 24.11.2007 14:50:47

Сообщение nochnick »

Подскажите пожалуйста в чем ошибка.
Нужно чтобы из программы на 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

Подскажите пожалуйста в чем ошибка, и вообще правильно ли я все сделал?
halyavin
новенький
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение halyavin »

Функция должна быть скомпилирована в 32-битном режиме ассемблера (вроде [BITS 32] в nasm, use32 в fasm). Процедура должна заканчиваться retn, а не retf. И проверьте, что вы компилируете под DOS (aka GO32_v2), а не под что-либо еще (в таком случае 21 прерыванием пользоваться нельзя).
nochnick
незнакомец
Сообщения: 3
Зарегистрирован: 24.11.2007 14:50:47

Сообщение nochnick »

Исправил код, упростил ассемблерную процедуру
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 перекомпилировать под Дос, но как я не знаю.
halyavin
новенький
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение halyavin »

d:\fpc\bin\i386-win32
а нужно - go32v2. Где найти версию компилятора с поддержкой go32v2 - не знаю.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

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

А чтобы собрать нужный юнит system, нужно в папке с исходниками rtl запустить make OS_TARGET=go32v2 и потом make install OS_TARGET=go32v2.
nochnick
незнакомец
Сообщения: 3
Зарегистрирован: 24.11.2007 14:50:47

Сообщение nochnick »

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?
halyavin
новенький
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение halyavin »

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

Код: Выделить всё

fasm asm.asm
fpc test.pp

Ассемблерные функции реализуют функцию увеличения на единицу. Напоминаю, что в win32 приложениях не работают прерывания DOS и BIOS.
Ответить